Grupo Linuxero del Bajío

Funciones para el cambio de número a letra.

Juan José Salgado

Una función para convertir el valor numerico a su expresión en letra, siempre es bienvenida. En este caso, voy a ponerla en 3 lenguajes, perl, SQL y clip.

Espero que a alguien le sirva.

Una disculpa por que al momento de pegar se perdio la anidación.

Primero en Perl.

sub cletra {my $total=$_[0];    my $total1 = $total;$total = int($total);my $cent2 :=$total1 - $total;my $cent :=$cent2*100;my $lletra='';my $letras='';my $cent1=0;if ($total ==0){    $lletra='CERO PESOS';    }else{#    print ("Total $total Centavos $cent n");    my $mil:=0;    my $millon:=0;    my $millones:=0;    my $depesos:=0;        my $sav=1; my $unit=1; my $deci=1; my $centi=1; my $factor=1; my $sav1=1;        while ($total > 0){                if ($total > 1999999){            $depesos = 1;            $factor = 1000000;            $millones = 1;            $millon = 0;        }        else{            if ($total > 999999){                $depesos = 1;                $factor = 1000000;                $millon = 1;}            else            {                if ($total > 999){                    $factor = 1000;                    $mil = 1; }                                else{                    $factor = 1;                    $mil = 0;                }            }        }                $sav = $total;        $total=int($total/$factor);                $sav1= $total*$factor;        $sav = $sav-$sav1;#        print ("Total $total  sav1  $sav1 sav $sav ");#        my $pausa=;                if ($sav != 0){            $depesos = 0;}                $centi=int($total/100);#        print ("Centi $centi");#        my $pausa=;                if ($centi==0) {                           $letras = "$letras";}        elsif ($centi == 1){            if ($total==100){                $letras = "$letras CIEN";}            else{                $letras = "$letras CIENTO";}}        if ($centi== 2){            $letras = "$letras DOSCIENTOS";}        elsif ($centi== 3){            $letras = "$letras TRESCIENTOS";}        elsif ($centi == 4){            $letras = "$letras CUATROCIENTOS";}        elsif ($centi == 5){            $letras = "$letras QUINIENTOS";}        elsif ($centi == 6){            $letras = "$letras SEISCIENTOS";}        elsif ($centi == 7){            $letras = "$letras SETECIENTOS";}        elsif ($centi == 8){            $letras = "$letras OCHOCIENTOS";}        elsif ($centi == 9){            $letras = "$letras NOVECIENTOS";}        $total=$total-($centi*100);        $deci=int($total/10);        $unit=$total-($deci*10); #       print ("Total $total  Deci $dec1 Unit $unit "); #       my $pausa=;         if ($total >= 30){            if($deci == 3){                $letras = "$letras TREINTA";}            elsif($deci == 4){                $letras = "$letras CUARENTA";}            elsif ($deci == 5){                $letras = "$letras CINCUENTA";}            elsif ($deci == 6){                $letras = "$letras SESENTA";}            elsif ($deci == 7){                $letras = "$letras SETENTA";}            elsif ($deci == 8){                $letras = "$letras OCHENTA";}            elsif ($deci == 9){                $letras = "$letras NOVENTA";}                   if ($unit > 0){                $letras ="$letras  Y"                }        }                else{            $unit = $total;}                if ($unit == 0){            $letras = "$letras ";}        elsif ($unit == 1){            $letras = "$letras UN";}        elsif ($unit == 2){            $letras = "$letras DOS";}        elsif ($unit == 3){            $letras = "$letras TRES";}        elsif ($unit == 4){            $letras ="$letras CUATRO"}        elsif ($unit == 5){            $letras ="$letras CINCO";}        elsif ($unit == 6){            $letras ="$letras SEIS";}        elsif ($unit == 7){            $letras = "$letras SIETE";}        elsif($unit == 8){            $letras ="$letras OCHO";}        elsif($unit == 9){            $letras ="$letras NUEVE";}        elsif($unit == 10){            $letras ="$letras DIEZ";}        elsif($ unit == 11) {            $letras ="$letras ONCE";}        elsif($unit == 12){            $letras = "$letras DOCE";}        elsif($unit == 13){            $letras = "$letras TRECE";}        elsif($unit == 14){            $letras ="$letras CATORCE";}        elsif($unit == 15){            $letras ="$letras QUINCE";}        elsif($unit == 16){            $letras = "$letras DIECISEIS";}        elsif($unit == 17){            $letras ="$letras DIECISIETE";}        elsif($unit == 18){            $letras ="$letras DIECIOCHO";}        elsif($unit == 19){            $letras ="$letras DIECINUEVE";}        elsif($unit == 20){            $letras ="$letras  VEINTE";}        elsif($unit == 21){            $letras ="$letras VEINTIUN";}        elsif($unit == 22){            $letras ="$letras VEINTIDOS";}        elsif($unit == 23){            $letras ="$letras VEINTITRES";}        elsif($unit == 24){            $letras = "$letras VEINTICUATRO";}        elsif($unit == 25){            $letras = "$letras VEINTICINCO";}        elsif($unit == 26){            $letras ="$letras VEINTISEIS";}        elsif($unit == 27){            $letras ="$letras VEINTISIETE";}        elsif($unit == 28){            $letras ="$letras VEINTIOCHO";}        elsif($unit == 29){            $letras ="$letras VEINTINUEVE";}                if ($millones==1){            $letras = "$letras MILLONES";            $millones =0 ;}                        if ($millon==1){            $letras = "$letras MILLON";            $millon = 0;}        if ($mil==1){            $letras = "$letras MIL";            $mil = 0;}        $total=$sav;        #      print ("Letras $letras n");#      $pausa=;            }        if ($cent==0){        $cent1='00';}    else{        $cent1=int($cent);}        if ($depesos==1){        $letras ="$letras DE PESOS $cent1/100 M.N.";}    else{        $letras ="$letras PESOS $cent1/100 M.N.";}    #    print ("Letras $letras cent $cent depesos $depesos n");#    $pausa=;}$lletra="($letras)";return $lletra;}

Ahora va en SQL para postgresql plpgsql

create or replace function cletra(numeric) returns varchar as'declareptotal  alias for $1;total numeric;total1 numeric;cent2  numeric;cent   numeric;cent1  char(2);mil    numeric;millon numeric;millones numeric;sav    numeric;unit   numeric;deci   numeric;centi  numeric;factor numeric;sav1   numeric;depesos numeric;lletra  varchar;letras varchar;begin   total := ptotal;   total1:= total;   total := trunc(total);   cent2 := total1 - total;   cent  := cent2*100;   cent1 := ''00'';   if total=0 then       lletra := ''CERO PESOS'';      return ''CERO PESOS'';   end if;   mil:=0;   millon:=0;   millones:=0;   depesos:=0;   sav:=1;   unit:=1;   deci:=1;   centi:=1;   factor:=1;   sav1:=1;   letras:='' '';      while total > 0 loop       if total > 1999999 then         depesos  := 1;         factor   := 1000000;         millones := 1;         millon   := 0;      else         if total > 999999 then            depesos := 1;            factor  := 1000000;            millon  := 1;         else            if total > 999 then               factor := 1000;               mil    := 1;            else               factor := 1;               mil := 0;            end if;         end if;      end if;      sav := total;      total := trunc(total/factor);      sav  := sav-(total*factor);      if sav  0 then         depesos := 0;      end if;      centi:=TRUNC(total/100);      if centi = 0 then         letras := rtrim(letras)||''   '';      end if;      if centi = 1 then         if total = 100 then            letras := rtrim(letras)||'' CIEN'';         else            letras := rtrim(letras)||'' CIENTO'';         end if;      end if;      if centi = 2 then         letras := rtrim(letras)||'' DOSCIENTOS'';      end if;      if centi = 3 then         letras := rtrim(letras)||'' TRESCIENTOS'';      end if;      if centi = 4 then         letras := rtrim(letras)||'' CUATROCIENTOS'';      end if;      if centi = 5 then         letras := rtrim(letras)||'' QUINIENTOS'';      end if;      if centi = 6 then         letras := rtrim(letras)||'' SEISCIENTOS'';      end if;      if centi = 7 then         letras := rtrim(letras)||'' SETECIENTOS'';      end if;      if centi = 8 then         letras := rtrim(letras)||'' OCHOCIENTOS'';      end if;      if centi = 9 then         letras := rtrim(letras)||'' NOVECIENTOS'';      end if;        total:=total - (centi*100);      deci :=trunc(total/10);      unit :=total-(deci*10);      if total >= 30 then         if deci = 3 then            letras := rtrim(letras)||'' TREINTA'';         end if;         if deci = 4 then            letras := rtrim(letras)||'' CUARENTA'';         end if;         if deci = 5 then            letras := rtrim(letras)||'' CINCUENTA'';         end if;         if deci = 6 then            letras := rtrim(letras)||'' SESENTA'';         end if;         if deci = 7 then            letras := rtrim(letras)||'' SETENTA'';         end if;         if deci = 8 then            letras := rtrim(letras)||'' OCHENTA'';         end if;         if deci = 9 then            letras := rtrim(letras)||'' NOVENTA'';         end if;         if unit > 0 then            letras := rtrim(letras)||'' Y'';         end if;      else         unit := total;      end if;        if unit = 0 then         letras := rtrim(letras)||'' '';      end if;       if unit = 1 then         letras := rtrim(letras)||'' UN'';      end if;      if unit = 2 then         letras := rtrim(letras)||'' DOS'';      end if;      if unit = 3 then         letras := rtrim(letras)||'' TRES'';      end if;      if unit = 4 then         letras := rtrim(letras)||'' CUATRO'';      end if;      if unit = 5 then         letras := rtrim(letras)||'' CINCO'';      end if;      if unit = 6 then         letras := rtrim(letras)||'' SEIS'';      end if;      if unit = 7 then         letras := rtrim(letras)||'' SIETE'';      end if;      if unit = 8 then         letras := rtrim(letras)||'' OCHO'';      end if;      if unit = 9 then         letras := rtrim(letras)||'' NUEVE'';      end if;      if unit = 10 then         letras := rtrim(letras)||'' DIEZ'';      end if;      if unit = 11 then         letras := rtrim(letras)||'' ONCE'';      end if;      if unit = 12 then         letras := rtrim(letras)||'' DOCE'';      end if;      if unit = 13 then         letras := rtrim(letras)||'' TRECE'';      end if;      if unit = 14 then         letras := rtrim(letras)||'' CATORCE'';      end if;      if unit = 15 then         letras := rtrim(letras)||'' QUINCE'';      end if;      if unit = 16 then         letras := rtrim(letras)||'' DIECISEIS'';      end if;      if unit = 17 then         letras := rtrim(letras)||'' DIECISIETE'';      end if;      if unit = 18 then         letras := rtrim(letras)||'' DIECIOCHO'';      end if;      if unit = 19 then         letras := rtrim(letras)||'' DIECINUEVE'';      end if;      if unit = 20 then         letras := rtrim(letras)||'' VEINTE'';      end if;      if unit = 21 then         letras := rtrim(letras)||'' VEINTIUNO'';      end if;      if unit = 22 then         letras := rtrim(letras)||'' VEINTIDOS'';      end if;      if unit = 23 then         letras := rtrim(letras)||'' VEINTITRES'';      end if;      if unit = 24 then         letras := rtrim(letras)||'' VEINTICUATRO'';      end if;      if unit = 25 then         letras := rtrim(letras)||'' VEINTICINCO'';      end if;      if unit = 26 then         letras := rtrim(letras)||'' VEINTISEIS'';      end if;      if unit = 27 then         letras := rtrim(letras)||'' VEINTISIETE'';      end if;      if unit = 28 then         letras := rtrim(letras)||'' VEINTIOCHO'';      end if;      if unit = 29 then         letras := rtrim(letras)||'' VEINTINUEVE'';      end if;      if millones=1 then         letras := rtrim(letras)||'' MILLONES'';         millones := 0;      else         if millon=1 then            letras := rtrim(letras)||'' MILLON'';            millon := 0;         else            if mil=1 then               letras := rtrim(letras)||'' MIL'';               mil := 0;            end if;         end if;      end if;      total:=sav;   end loop;   if cent=0 then      cent1:=''00'';   else      cent1:=cast(cent as char(2));   end if;   if depesos=1 then      letras := rtrim(letras)||'' DE PESOS ''||cent1||''/100 M.N.'';   else      letras := rtrim(letras)||'' PESOS ''||cent1||''/100 M.N.'';   end if;   lletra := ''(''||ltrim(letras)||'')'';return lletra;end'language 'plpgsql';

Por ultimo ahi va en clip.

FUNCTION CLETRAPARAMETERS TOTAL,CAMBIOtotal1 = totalcambio1 = cambiototal = int(total)cent = round(((total1 - total) *100),0)IF TOTAL =0   STORE 'CERO PESOS' TO LLETRA   RETURN (LLETRA)ENDIFSTOR .F. TO milSTORE .F. TO millonSTORE .F. TO millonesSTORE .F. TO depesosSTORE 1 TO sav, unit, DECI, centi, factorSTORE SPACE(50) TO letrasDO WHIL TOTAL  0   IF TOTAL > 1999999      depesos = .T.      factor = 1000000      millones = .T.      millon = .F.    ELSE      IF TOTAL > 999999         depesos = .T.         factor = 1000000         millon = .T.       ELSE         IF TOTAL > 999            factor = 1000            mil = .T.          ELSE            factor = 1            mil = .F.         ENDI      ENDI   ENDI   STOR TOTAL TO sav   STORE INT(TOTAL/factor) TO TOTAL   sav = sav-(TOTAL*factor)   IF sav  0      depesos = .F.   ENDI   STORE INT(TOTAL/100) TO centi   DO CASE      CASE centi = 0           letras = letras + "   "      CASE centi = 1           IF TOTAL = 100              letras = letras + "CIEN"            ELSE              letras = letras + "CIENTO"           ENDI      CASE centi = 2           letras = letras + " DOSCIENTOS"      CASE centi = 3           letras = letras + " TRESCIENTOS"      CASE centi = 4           letras = letras + " CUATROCIENTOS"      CASE centi = 5           letras = letras + " QUINIENTOS"      CASE centi = 6           letras = letras + " SEISCIENTOS"      CASE centi = 7           letras = letras + " SETECIENTOS"      CASE centi = 8           letras = letras + " OCHOCIENTOS"      CASE centi = 9           letras = letras + " NOVECIENTOS"   ENDC   STORE  TOTAL - (centi*100) TO TOTAL   STORE INT(TOTAL/10) TO DECI   unit  = TOTAL - (DECI*10)   IF TOTAL >= 30      DO CASE         CASE DECI = 3              letras = letras + " TREINTA"         CASE DECI = 4              letras = letras + " CUARENTA"         CASE DECI = 5              letras = letras + " CINCUENTA"         CASE DECI = 6              letras = letras + " SESENTA"         CASE DECI = 7              letras = letras + " SETENTA"         CASE DECI = 8              letras = letras + " OCHENTA"         CASE DECI = 9              letras = letras + " NOVENTA"      ENDC      IF unit > 0         letras = letras + " Y"      ENDIF    ELSE      unit = TOTAL   ENDIF   DO CASE      CASE unit = 0           letras = letras + ""      CASE unit = 1           letras = letras + " UN"      CASE unit = 2           letras = letras + " DOS"      CASE unit = 3           letras = letras + " TRES"      CASE unit = 4           letras = letras + " CUATRO"      CASE unit = 5           letras = letras + " CINCO"      CASE unit = 6           letras = letras + " SEIS"      CASE unit = 7           letras = letras + " SIETE"      CASE unit = 8           letras = letras + " OCHO"      CASE unit = 9           letras = letras + " NUEVE"      CASE unit = 10           letras = letras + " DIEZ"      CASE unit = 11           letras = letras + " ONCE"      CASE unit = 12           letras = letras + " DOCE"      CASE unit = 13           letras = letras + " TRECE"      CASE unit = 14           letras = letras + " CATORCE"      CASE unit = 15           letras = letras + " QUINCE"      CASE unit = 16           letras = letras + " DIECISEIS"      CASE unit = 17           letras = letras + " DIECISIETE"      CASE unit = 18           letras = letras + " DIECIOCHO"      CASE unit = 19           letras = letras + " DIECINUEVE"      CASE unit = 20           letras = letras + " VEINTE"      CASE unit = 21           letras = letras + " VEINTIUNO"      CASE unit = 22           letras = letras + " VEINTIDOS"      CASE unit = 23           letras = letras + " VEINTITRES"      CASE unit = 24           letras = letras + " VEINTICUATRO"      CASE unit = 25           letras = letras + " VEINTICINCO"      CASE unit = 26           letras = letras + " VEINTISEIS"      CASE unit = 27           letras = letras + " VEINTISIETE"      CASE unit = 28           letras = letras + " VEINTIOCHO"      CASE unit = 29           letras = letras + " VEINTINUEVE"   ENDC   IF millones      letras = letras + " MILLONES"      millones = .F.    ELSE      IF millon         letras = letras + " MILLON"         millon = .F.       ELSE         IF mil            letras = letras + " MIL"            mil = .F.         ENDI      ENDI   ENDI   STORE sav TO TOTALENDDOif cent=0   cent1='00' else   cent1=str(cent,2)endifIF depesos  if (cambio1='MN')       letras = letras + " PESOS "+cent1+"/100 M.N."   else        letras = letras + " PESOS "+cent1+"/100 M.N."   *   letras = letras + " DOLARES USD "+cent1+"/100 " endif ELSE  if (cambio1='MN')       letras = letras + " PESOS "+cent1+"/100 M.N."   else        letras = letras + " PESOS "+cent1+"/100 M.N."   *   letras = letras + " DOLARES USD "+cent1+"/100 " endifENDIFSTORE "("+LTRIM(letras)+")" TO lletraRETURN (LLETRA)

Espero que alguien lo pueda usar como su reseta

Bye. Juan José Salgado.