Funciones para el cambio de número a letra.
Juan José SalgadoUna 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.