N2L (Numero a Letra, cosa del español)
Posted: Thu Jul 31, 2008 9:52 pm
Como bien saben, los gringos usan una connotación diferente para nombrar los números, en el español agrupamos 6 dígitos para nombrar los zillones, mientras que los gringos lo hacen cada 3 dígitos después del millón.
así que mil millones es para nosotros lo que1 billón es para los gringos.
Además de su tendencia rara de llamar los cientos en decenas
(diez cientos = 1000 y quince cientos = 1500)
Hice éste código hace muchas lunas para poder colocarlo en las facturas que imprimimos, se puede portar con relativa facilidad a excel si lo desean.
así que mil millones es para nosotros lo que1 billón es para los gringos.
Además de su tendencia rara de llamar los cientos en decenas
(diez cientos = 1000 y quince cientos = 1500)
Hice éste código hace muchas lunas para poder colocarlo en las facturas que imprimimos, se puede portar con relativa facilidad a excel si lo desean.
Code: Select all
#include 'minigui.ch'
Function Main( )
MsgInfo( N2L (23367421) )
RETURN NIL
Function N2L (Numero)
Local nMaximo
Local aUnidad, aDecena, aCentena, aResto
Local nUnidad, nDecena, nCentena, nResto
Local C, R
Local I, J
nMaximo = 18
aUnidad = {"UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE"}
aDecena = {"DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA","SESENTA", "SETENTA","OCHENTA","NOVENTA"}
aCentena = {"CIENTO","DOSCIENTOS","TRESCIENTOS","CUATROCIENTOS","QUINIENTOS","SEISCIENTOS","SETECIENTOS","OCHOCIENTOS","NOVECIENTOS"}
aResto = {"ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE"}
// Es más fácil romper el número en pedazos de cadena.
C = Left (Str (Numero, nMaximo, 2), nMaximo - 3)
Numero = Val (C)
R = ""
If Numero = 0
R = "CERO"
Else
I = 0
Do While .T.
J = 0
Do While .T.
If (J > 0) .And. (Mod (Numero, 1000) > 0)
R = "MIL " + R
EndIf
nUnidad = Mod (Numero, 10)
nDecena = INT (Mod (Numero, 100) / 10)
nResto = Mod (Numero, 100) - 10
If nResto > 0 .And. nResto < 6
R = aResto [nResto] + " " + R
Else
If nUnidad > 0
R = aUnidad [nUnidad] + " " + R
EndIf
If nDecena > 0
Do Case
Case nDecena = 1 .And. nUnidad > 5
R = "DIECI" + R
Case nDecena = 2 .And. nUnidad > 0
R = "VEINTI" + R
Otherwise
If nUnidad > 0
R = "Y " + R
EndIf
R = aDecena [nDecena] + " " + R
EndCase
EndIf
EndIf
nCentena = INT (Mod (Numero, 1000) / 100)
If nCentena > 0
If (nCentena == 1) .And. (Mod (Numero, 100) = 0)
R = "CIEN " + R
Else
R = aCentena [nCentena] + " " + R
EndIf
EndIf
Numero = Int (Numero / 1000)
If Numero > 0
J++
If J > 1
Exit
EndIf
Else
Exit
EndIf
EndDo
If Numero > 0
I++
If Mod (Numero, 1000000) > 0
R = " " + R
If Numero > 1
R = "ES" + R
EndIf
Do Case
Case I = 1
R = "MILLON" + R
Case I = 2
R = "BILLON" + R
Case I = 3
R = "TRILLON" + R
OtherWise
Exit
EndCase
EndIf
Else
Exit
EndIf
EndDo
EndIf
Return R