viernes, 9 de mayo de 2014

Convertir un número en texto (125,700.63 = ciento veinticinco mil setencientos con 63/100)

Hola a todos. A veces queremos traducir un numero a texto. Esto es util cuando imprimirmos algun recibo o factura... o para la impresion de cheques.


Antes que nada, quiero dejar claro que ésta rutina la tome hace un par de años del foro de todoexpertos.com... aunque no recuerdo de que experto, creo que era Don Javier Cortez, gran conocedor de VFP... maestro! ... pero todos los créditos son para esa persona que adecuó dicha rutina, no es de mi autoría directamente pero es magnifica y sencilla! :) :) :)


Va así:


1 - Crea una rutina .prg llamada 'NToLetra.prg' (sin comillas). En ella, copia el siguiente código:



*** Regresa numero en letras
Procedure NToLetra
Parameter numero
num_car = Str(numero,15,2)
num_dig = Subs(num_car,14,2)
pos = 1
Store "" To num_car_fin,leyenda
For t=1 To 4
Store 0 To uni,dec,cen
cen = Val(Subs(num_car,pos+0,1))
dec = Val(Subs(num_car,pos+1,1))
uni = Val(Subs(num_car,pos+2,1))
pos = pos + 3
letra3 = centena(uni,dec,cen)
letra2 = decenas(uni,dec,cen)
letra1 = unidads(uni,dec,cen)
Do Case
Case t=1
leyenda = IIf(uni+dec+cen=1,"BILLÓN ",IIf(uni+dec+cen>1,"BILLONES ",""))
Case t=2
leyenda = IIf(uni+dec+cen=1,"MILLÓN ",IIf(uni+dec+cen>1,"MILLONES ",""))
Case t=3
leyenda = IIf(uni+dec+cen=1,"MIL ",IIf(uni+dec+cen>1,"MIL ",""))
Case t=4
leyenda = IIf(uni+dec+cen=1,"",IIf(uni+dec+cen>1,"",""))
EndCase
num_car_fin = num_car_fin + letra3 + letra2 + letra1 + leyenda
EndFor
num_1 = Val(Subs(num_car,1,12))
num_2 = Val(Subs(num_car,4,9))
num_3 = Val(Subs(num_car,7,6))
leyenda = ""
If num_1=1
leyenda = "PESO"
Else
If num_2=0 .Or. num_3=0
leyenda = "DE PESOS"
Else
leyenda = "PESOS"
EndIf
EndIf
If num_1 = 0
num_car_fin = "CERO "
leyenda = "PESOS"
EndIf
num_car_fin = num_car_fin + leyenda + ' CON ' + num_dig + "/100"
Return num_car_fin
** Unidades
Procedure unidads
Parameter uni,dec,cen
Do Case
Case uni = 1 .And. dec#1
ctexto = "UN "
Case uni = 2 .And. dec#1
ctexto = "DOS "
Case uni = 3 .And. dec#1
ctexto = "TRES "
Case uni = 4 .And. dec#1
ctexto = "CUATRO "
Case uni = 5 .And. dec#1
ctexto = "CINCO "
Case uni = 6
ctexto = "SEIS "
Case uni = 7
ctexto = "SIETE "
Case uni = 8
ctexto = "OCHO "
Case uni = 9
ctexto = "NUEVE "
OtherWise
ctexto = ""
EndCase
Return ctexto
** Centenas
Procedure centena
Parameter uni,dec,cen
Do Case
Case cen=1 .And. (dec=0 .And. uni=0)
ctexto = "Cien "
Case cen=1 .And. (dec>0 .Or. uni>0)
ctexto = "CIENTO "
Case cen=2
ctexto = "DOSCIENTOS "
Case cen=3
ctexto = "TRESCIENTOS "
Case cen=4
ctexto = "CUATROCIENTOS "
Case cen=5
ctexto = "QUINIENTOS "
Case cen=6
ctexto = "SEISCIENTOS "
Case cen=7
ctexto = "SETECIENTOS "
Case cen=8
ctexto = "OCHOCIENTOS "
Case cen=9
ctexto = "NOVECIENTOS "
OtherWise
ctexto = ""
EndCase
Return ctexto
** Decenas
Procedure decenas
Parameter uni,dec,cen
Do Case
Case dec=1 .and. uni=0
ctexto = "DIEZ "
Case dec=1 .and. uni=1
ctexto = "ONCE "
Case dec=1 .and. uni=2
ctexto = "DOCE "
Case dec=1 .and. uni=3
ctexto = "TRECE "
Case dec=1 .and. uni=4
ctexto = "CATORCE "
Case dec=1 .and. uni=5
ctexto = "QUINCE "
Case dec=1 .and. (uni>5 .and. uni<10)
ctexto = "DIECI"
Case dec=2 .and. uni=0
ctexto = "VEINTE "
Case dec=2 .and. uni>0
ctexto = "VEINTI"
Case dec=3 .and. uni=0
ctexto = "TREINTA "
Case dec=3 .and. uni>0
ctexto = "TREINTA Y "
Case dec=4 .and. uni=0
ctexto = "CUARENTA "
Case dec=4 .and. uni>0
ctexto = "CUARENTA Y "
Case dec=5 .and. uni=0
ctexto = "CINCUENTA "
Case dec=5 .and. uni>0
ctexto = "CINCUENTA Y "
Case dec=6 .and. uni=0
ctexto = "SESENTA "
Case dec=6 .and. uni>0
ctexto = "SESENTA Y "
Case dec=7 .and. uni=0
ctexto = "SETENTA "
Case dec=7 .and. uni>0
ctexto = "SETENTA Y "
Case dec=8 .and. uni=0
ctexto = "OCHENTA "
Case dec=8 .and. uni>0
ctexto = "OCHENTA Y "
Case dec=9 .and. uni=0
ctexto = "NOVENTA "
Case dec=9 .and. uni>0
ctexto = "NOVENTA Y "
OtherWise
ctexto = ""
EndCase
Return ctexto
**--//



2 - En el formulario donde vas a presentar el resultado, coloca esta linea en el evento INIT() del form. (no se que diablos le pasa a esta maldita pagina pero cuando quieres borrar algo con backspace el cursor de escritura se pierde al final del carajo! jajajajajaja! )


SET PROCEDURE TO NToLetra.prg ADDITIVE


3 - Para efectos de ejemplo, pruébalo así como te diré, luego vos lo adecuas a algún evento o método espcifico. Inserta en el form 2 textos y 1 botón. Un text1 en donde cargaras la cantidad y un text2 donde aparecerá la cantidad en letras. En el evento click del botón, coloca un código como éste:


**--Monto a letras
THISFORM.Text2.Value = NToLetra(THISFORM.Text1.Value)
**--//
THISFORM.Refresh


**---



Ahora, solo guarda y ejecutá. Ingresa algún numero en el text1 y luego da click en el botón. La cantidad en letras debe aparecer!


Cualquier problema, duda o sugerencia... comenten! Todo para mejorar. Saludos!


Desde Managua, capital de Nicaragua!
Ravenn :D :D :D

4 comentarios: