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 ) )