Rutina numero a letras
Rutina numero a letras
Hola Amigos del Foro:
Alguien tiene por ahí una función para pasar un número a letras , por ejemplo $ 15.000 ,
que diga quince mil .
Necesito que sea para grandes cifras.
Cualquier ayuda, se agradece.
Saludos,
JC
Alguien tiene por ahí una función para pasar un número a letras , por ejemplo $ 15.000 ,
que diga quince mil .
Necesito que sea para grandes cifras.
Cualquier ayuda, se agradece.
Saludos,
JC
Re: Rutina numero a letras
Saludos,
Adhemar C.
Adhemar C.
- Jairo Barbosa
- Posts: 188
- Joined: Fri Jan 23, 2009 2:50 am
- Location: Cali Valle Colombia
- Contact:
Re: Rutina numero a letras
Muchas gracias Adhemar y Jairo por los link.
Hay bastante para analizar.
Saludos ,
JC
Hay bastante para analizar.
Saludos ,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
Re: Rutina numero a letras
JC;
De este foro bajé el siguiente código (aunque no recuerdo si de un post o de Utilidades)
De este foro bajé el siguiente código (aunque no recuerdo si de un post o de Utilidades)
Code: Select all
/***************
Prog : NumLetra.prg
Autor : Hernan Diego Checarelli
Módulo :
Inicio : 14/01/2010 - Bajado del Foro FiveTech
***************************************
*/
FUNCTION NumLetras( nImporte, nDec )
local cTexto:= '' /// Equivale a '999999999999.99'
local cPicture:= Replicate('9',12)
local lSonSoloCentavos:= .F., nCpn
local cNumero,aU,aD,aV,aC,aE,aM
local nImporteDec:= 0
DEFAULT nDec:= 2
if nImporte < 0
cTexto:= 'Menos'
nImporte *=-1 /// Lo paso a positivo
endif
if nDec == 0
nImporte:= Int( nImporte )
endif
if nDec > 0
cPicture+= '.' + Replicate('9', nDec)
endif
if nImporte < 1 .and. nImporte > 0 // Solo Decimales
nImporteDec:= Val( SubStr( Transform( nImporte, "9.9999999999999999" ), 3, nDec ) )
nImporte := Val( AllTrim(Str(Int(nImporte))) + "." + AllTrim(Str(Int(nImporteDec))) )
endif
//// Evaluo la cadena numerica ,dividiendola en cuadro partes:
//// 999 - 999 - 999 - 999 y los decimales correspondientes.
cNumero := Transform( nImporte , cPicture )
nImporte:= Val( cNumero )
do case
case nImporte == 0 .and. nImporteDec == 0
cTexto := 'Cero'
case nDec > 0 .and. nImporteDec > 0
nImporte:= nImporteDec
cNumero := Transform( nImporte , cPicture )
lSonSoloCentavos:= .T.
endcase
aU:= {'Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve'}
aD:= {'Once','Doce','Trece','Catorce','Quince','Dieciseis','Diecisiete',;
'Dieciocho','Diecinueve'}
aV:= {'Diez','Veinte','Treinta','Cuarenta','Cincuenta','Sesenta','Setenta',;
'Ochenta','Noventa'}
aC:= {'Ciento','Doscientos','Trescientos','Cuatrocientos','Quinientos',;
'Seiscientos','Setecientos','Ochocientos','Novecientos'}
aE:= {'Veintiuno','Veintidos','Veintitres','Veinticuatro','Veinticinco',;
'Veintiseis','Veintisiete','Veintiocho','Veintinueve'}
aM:= {'Billones','Millones','Mil','/100'}
for nCpn = 1 to 4 /// Los 4 '999'
//// Analizo 1er. 9 ///
if Val(SubStr(cNumero,1,1)) <> 0 // Si existe Centena !!!
do case
case SubStr(cNumero,1,3) == '100'
cTexto:= AllTrim(cTexto) + Space(1) + SubStr(aC[1],1,4)
otherwise
cTexto:= AllTrim(cTexto) + Space(1) + aC[Val(SubStr(cNumero,1,1))]
endcase
endif
//// Analizo 2do. 9 ///
if Val(SubStr(cNumero,2,1)) <> 0 // Si existe Decena !!!
do case
case SubStr(cNumero,2,1) == '1' .and. SubStr(cNumero,3,1) <> '0'
cTexto:= AllTrim(cTexto) + Space(1) + aD[ Val(SubStr(cNumero,3,1)) ]
case SubStr(cNumero,2,1) == '2' .and. SubStr(cNumero,3,1) <> '0'
cTexto:= AllTrim(cTexto) + Space(1) + aE[ Val(SubStr(cNumero,3,1)) ]
otherwise
cTexto:= AllTrim(cTexto) + Space(1) + aV[ Val(SubStr(cNumero,2,1)) ]
endcase
endif
//// Analizo 3er. 9 ///
if Val(SubStr(cNumero,3,1)) <> 0 // Si existe la Unidad !!!
do case
case SubStr(cNumero,2,1) == '1' .or. SubStr(cNumero,2,1) == '2'
// Del 1 al 29 ya se habrian definido antes.-
otherwise
if Val(SubStr(cNumero,1,2)) <> 0 .and. Val(SubStr(cNumero,2,1)) <> 0
cTexto:= AllTrim(cTexto)+' y'
endif
cTexto:= AllTrim(cTexto) + Space(1) + aU[ Val(SubStr(cNumero,3,1)) ]
endcase
if nCpn <> 4 .and. SubStr(cNumero,3,1) == '1' .and. ;
SubStr(cNumero,2,1) <> '1'
cTexto:= SubStr( AllTrim(cTexto), 1, Len(AllTrim(cTexto))-1 )
/// Sino quedaria Uno millon o Uno mil => Le saco el ultimo caracter.
endif
endif
if nCpn < 4
if ! Val(SubStr(cNumero,1,3)) == 0
cTexto:= AllTrim(cTexto) + Space(1) + aM[nCpn]
endif
if (nCpn == 1 .or. nCpn == 2) .and. Val(SubStr(cNumero,1,3)) == 1 /// ' 1'
cTexto:= SubStr( AllTrim(cTexto) , 1, Len(AllTrim(cTexto))-4) + 'ón'
/// Le saco el 'ones' y le pongo 'ón'
endif
endif
cNumero:= SubStr( cNumero , 4 )
next
cNumero:= SubStr(cNumero,2,2) /// Decimales del Nro.
if Val(cNumero) <> 0 // Si tiene decimales
cTexto:= AllTrim(cTexto)+' Con '+ cNumero +"/1"+Replicate("0",nDec)
endif
if lSonSoloCentavos
cTexto:= StrTran(cTexto,'Uno','Un ')
cTexto:= AllTrim(cTexto) + ' Centavo'
if nImporte > 1
cTexto+= 's'
endif
if nDec <> 2 // No le Cabe la palabra "centavo<s>" cuando nDec no es 2.
cTexto:= "Cero Con " + AllTrim(Str(nImporteDec))+"/1"+Replicate("0",nDec)
endif
endif
RETURN( AllTrim( cTexto ) )
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina
- Hernan Diego Ceccarelli
- Posts: 84
- Joined: Fri Oct 07, 2005 4:51 pm
- Location: Rosario - Santa Fe - Argentina
- Contact:
Re: Rutina numero a letras
Que buena Funcion
Re: Rutina numero a letras
Hernan que bueno tenerte por aca
Saludos
Saludos
Re: Rutina numero a letras
Gracias MarioG, la vamos a mirar tambien.
Saludos,
JC
Saludos,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
Re: Rutina numero a letras
Buenísima funcion
Saludos
Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina
Re: Rutina numero a letras
Buen día para todos...
Años sin postear!!!
Bueno por acá les dejo una función que hice y coloqué en el foro hace años. En las primeras líneas de código pueden configurar la moneda que van a utilizar.
Años sin postear!!!
Bueno por acá les dejo una función que hice y coloqué en el foro hace años. En las primeras líneas de código pueden configurar la moneda que van a utilizar.
Code: Select all
//*******######
Function Num2Txt(nCantidad)
//*******######
//Utilice o cambie estos valores según su moneda
Local acMoneda := {" Bolívar ", " Bolívares "} //Moneda en singular y plural
Local acCentimos := {" Céntimo" , " Céntimos"} //Céntimos en singular y plural
Local lCentsEnletra := .f. //Si es falso muestra los centimos en formato 00/100
Local aTexto[5]
Local cCadena, cDigitos, cTerminador, cCents
Local nI, nJ, nNumero, nEntero, nCents, nPunto
Local aUni:= {"Un" , "Dos" , "Tres", "Cuatro", "Cinco",;
"Seis", "Siete", "Ocho", "Nueve"}
Local aDec:= {"Diez" , "Veinte" , "Treinta", "Cuarenta", "Cincuenta",;
"Sesenta", "Setenta", "Ochenta", "Noventa"}
Local aCen:= {"Cien" , "Doscientos" , "Trescientos",;
"Cuatrocientos", "Quinientos" , "Seiscientos",;
"Setecientos" , "Ochocientos", "Novecientos"}
Local aAux1:= {"Once" , "Doce" , "Trece" , "Catorce", "Quince",;
"Dieciseis", "Diecisiete", "Dieciocho", "Diecinueve"}
Local aAux2:= {"Veintiún" , "Veintidós" , "Veintitrés", "Veinticuatro",;
"Veinticinco", "Veintiséis", "Veintisiete",;
"Veintiocho" , "Veintinueve"}
//Verifica el tamaño del número
IF nCantidad > 9999999999999.99
MsgStop("Número muy grande para convertir en letras",;
"Mensaje de la Función Num2Txt")
Return nCantidad
EndIf
AFill(aTexto, "")
nCantidad:= Round(nCantidad, 2) //Redondea a 2 los decimales
nEntero := Int(nCantidad)
cCents := StrTran(Str(nCantidad - nEntero), "0.", "")
nCents := Val(cCents)
If (nEntero == 0) .AND. (nCents == 0)
If lCentsEnletra
Return "Cero" + acMoneda[2] + "con Cero" + acCentimos[2]
else
Return "Cero" + acMoneda[2] + "con 00/100" + acCentimos[2]
EndIF
ElseIf (nCents == 1) .AND. (nCents == 0)
If lCentsEnletra
Return "Un" + acMoneda[1] + "con Cero" + acCentimos[2]
else
Return "Un" + acMoneda[1] + "con 00/100" + acCentimos[2]
EndIf
EndIf
cCadena:= StrTran(Str(nEntero, 15), " ", "0")
nJ:= 0
For nI:= 1 To 15 step 3
nJ:= nJ + 1
cDigitos:= SubStr(cCadena, nI, 3)
nNumero := Val(SubStr(cDigitos, 1, 1))
If (nNumero != 0)
aTexto[nJ]:= aTexto[nJ] + aCen[nNumero]
EndIf
If (nNumero = 1 .AND. Val(SUbStr(cDigitos, 2, 2)) != 0)
aTexto[nJ]:= aTexto[nJ] + "to "
Else
aTexto[nJ]:= aTexto[nJ] + " "
EndIf
nNumero:= Val(SubStr(cDigitos, 2, 2))
If (nNumero != 0)
If (nNumero % 10) == 1
cTerminador:= "Un "
ElseIf (nNumero % 10) != 0
cTerminador:= aUni[(nNumero % 10)]
EndIf
Do Case
Case nNumero % 10 = 0
aTexto[nJ]:= aTexto[nJ] + aDec[Int(nNumero / 10)] + " "
Case nNumero > 0 .AND. nNumero < 10
aTexto[nJ]:= aTexto[nJ] + cTerminador + " "
Case nNumero > 10 .AND. nNumero < 20
aTexto[nJ]:= aTexto[nJ] + aAux1[(nNumero % 10)] + " "
Case nNumero > 20 .AND. nNumero < 30
aTexto[nJ]:= aTexto[nJ] + aAux2[(nNumero % 10)] + " "
Case nNumero > 30 .AND. nNumero < 100
aTexto[nJ]:= aTexto[nJ] + aDec[Int(nNumero / 10)] + " y " + cTerminador + " "
EndCase
EndIf
aTexto[nJ]:= AllTrim(aTexto[nJ])
Next
For nI:= 1 To 5
If (Len(aTexto[nI]) != 0)
Do Case
Case nI = 1
aTexto[nI]:= aTexto[nI] + IIf(Left(aTexto[nI], 2) = "Un", " Billón", " Billones")
Case nI = 2
aTexto[nI]:= aTexto[nI] + IIf(Len(aTexto[3]) = 0, " Mil Millones", " Mil")
Case nI = 3
aTexto[nI]:= aTexto[nI] + IIf(Left(aTexto[nI], 2) = "Un", " Millón", " Millones")
Case nI = 4
aTexto[nI]:= aTexto[nI] + " mil"
EndCase
EndIf
Next
//Genera el número entero
cCadena := LTrim(aTexto[1] + " " + aTexto[2] + " " + aTexto[3] + " " + ;
aTexto[4] + " " + aTexto[5]) + IIf(nEntero == 1, acMoneda[1], acMoneda[2]) + "con "
//Genera el número entero más decimales
If lCentsEnletra //Si los céntimos son en letras
If (nCents % 10) == 1
cTerminador:= "un "
ElseIf (nCents % 10) != 0
cTerminador:= aUni[(nCents % 10)]
EndIf
Do Case
Case nCents = 0
cCadena := cCadena + "Cero"
Case nCents % 10 = 0
cCadena := cCadena + aDec[Int(nCents / 10)]
Case nCents > 0 .AND. nCents < 10
cCadena := cCadena + aUni[nCents]
Case nCents > 10 .AND. nCents < 20
cCadena := cCadena + aAux1[(nCents % 10)]
Case nCents > 20 .AND. nCents < 30
cCadena := cCadena + aAux2[(nCents % 10)]
Case nCents > 30 .AND. nCents < 100
cCadena := cCadena + aDec[Int(nCents / 10)] + " y " + cTerminador
EndCase
If nEntero = 0
cCadena := "Cero" + cCadena + acCentimos[2]
ElseIf nCents = 1
cCadena := cCadena + acCentimos[1]
Else
cCadena := cCadena + acCentimos[2]
EndIf
Else //Si los céntimos son en números
If nEntero = 0
cCadena := "Cero" + cCadena + Right(cCents, 2) + "/100" + acCentimos[2]
Else
cCadena := cCadena + Right(cCents, 2) + "/100" + acCentimos[2]
EndIf
EndIf
Return cCadena