*** 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,"billon ",IIf(uni+dec+cen>1,"billones ",""))
Case t=2
leyenda = IIf(uni+dec+cen=1,"millon ",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 + num_dig + "/100 m. n.)"
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
Comentarios sobre la versión: Versión 1 (18)
Quiero poner en un cuadro de texto una variable con la cual hará la conversion pero no se como utilizar el codigo; lo pongo en un botón y sale error.
Quisiera que me ayudaran
NOTA para los Españoles:
He modificado un poco el código para que funcione con Euros:
A continuación paso el código testeado con clipper 5.2:
*************************** INICIO CODIGO *****************************
SET FIXED ON
SET DECIMALS TO 2
NUMERO := 0
*** Regresa numero en letras
DO WHILE .T.
CLS
@1,1 SAY "DIME NUMERO: " GET NUMERO
READ
IF LASTKEY()=27
QUIT
ENDIF
@ 2,2 SAY NTOLETRA(NUMERO)
INKEY(0)
ENDDO
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,"BILLON ",IIf(uni+dec+cen>1,"BILLONES ",""))
Case t=2
leyenda = IIf(uni+dec+cen=1,"MILLON ",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
if numero>=1000 .and. numero<2000
num_car_fin = num_car_fin + letra3 + letra2 + leyenda
else
num_car_fin = num_car_fin + letra3 + letra2 + letra1 + leyenda
endif
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 = "Euro "
Else
If num_2=0 .Or. num_3=0
leyenda = " de euros "
Else
leyenda = " euros "
EndIf
EndIf
If num_1 = 0
num_car_fin = "Cero "
// leyenda = "Euros "
EndIf
// le a¤adimos los decimales para que funciona con el euro
if val (num_dig)> 0
decim1 := Val(Subs(num_dig,1,1))
decim2 := Val(Subs(num_dig,2,1))
letdec1 := decenas(decim2,decim1,0)
letdec2 := unidads(decim2,decim1,0)
leyenda := leyenda +"CON "+letdec1+letdec2+" CÉNTIMOS"
endif
num_car_fin = num_car_fin + leyenda
Return num_car_fin
** Unidades
Procedure unidads
Parameter uni,dec,cen
Do Case
Case uni = 1 .And. dec#1
ctexto = "UNO "
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 = "VENTI"
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
*************************** FIN CODIGO *****************************
puedes ejecutarlo desde otro progrma así
*****************************************************************************
SET PROCEDURE TO "convertir.prg"
clear
numero = 1
do while numero <> 0
input " Ingrese el monto (salir con 0) " to numero
clear
? str(numero) + " = " + NToLetra(numero)
enddo
Parameter numero
PRIVATE mil, pos, t
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,"billon ",IIf(uni+dec+cen>1,"billones ",""))
Case t=2
leyenda = IIf(uni+dec+cen=1,"millon ",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 = " Dolar con "
Else
If num_2=0 .Or. num_3=0
leyenda = " de Dolares con "
Else
leyenda = " Dolares con "
EndIf
EndIf
If num_1 = 0
num_car_fin = "Cero "
leyenda = "dolares con"
EndIf
num_car_fin = num_car_fin + leyenda + num_dig + "/100"
Return UPPER(num_car_fin)
** Unidades
Procedure unidads
Parameter uni,dec,cen
Do Case
Case uni = 1 .And. (dec = 0 AND cen = 0) AND (pos+2) > 12
ctexto = "Un "
Case uni = 1 .And. (dec > 0 or cen > 0)
ctexto = "Un "
Case uni = 2
ctexto = "Dos "
Case uni = 3
ctexto = "Tres "
Case uni = 4
ctexto = "Cuatro "
Case uni = 5
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
Gracias nuevamente!!!!
Procedure NToLetra
Parameter numero,vmoneda
* numero valor a convertir ejem 1213.20
*vmoneda valor logico si va a mostrar la moneda (par ael caso de cheques no se muestra
PRIVATE mil, pos, t
num_car = Str(numero,15,2)
num_dig = Subs(num_car,14,2)
pos = 1
*SET STEP ON
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,"billon ",IIf(uni+dec+cen>1,"billones ",""))
Case t=2
leyenda = IIf(uni+dec+cen=1,"millon ",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 vmoneda
leyenda = " con "
ELSE
If num_1=1
leyenda = " Dolar con "
Else
If num_2=0 .Or. num_3=0
leyenda = " de Dolares con "
Else
leyenda = " Dolares con "
EndIf
EndIf
If num_1 = 0
num_car_fin = "Cero "
leyenda = "dolares con"
EndIf
ENDIF
num_car_fin = num_car_fin + leyenda + num_dig + "/100"
Return UPPER(num_car_fin)
** Unidades
Procedure unidads
Parameter uni,dec,cen
IF dec=1 AND uni<6
RETURN ""
ENDIF
Do Case
Case uni = 1 .And. (dec = 0 AND cen = 0) AND (pos+2) > 12
ctexto = "Un "
Case uni = 1 .And. (dec > 0 or cen > 0)
ctexto = "Un "
Case uni = 2
ctexto = "Dos "
Case uni = 3
ctexto = "Tres "
Case uni = 4
ctexto = "Cuatro "
Case uni = 5
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