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