Salu2
Code: Select all
//-------------------------------------------------------------------------------------------------------
Function Letras(Arg1, Arg2) // el numero y el genero
local agrupos[5], aunidad[10], adecena[10, 10], acentena[10]
local aconector[5], cenletra, ngrupo, cnumstr
local cunidad, cdecena, ccentena, ccentavos, cdecim
Arg2 := If(Arg2 = Nil, Arg2:= "M", Upper(Arg2) )
If (ValType(Arg1) != "N" .OR. ValType(Arg2) != "C")
Return ""
Endif
cdecim := (Arg1 - Int(Arg1)) * 100
ccentavos := " y " + StrZero(cdecim, 2) + "/100"
Arg1 := Int(Arg1) // solo el entero
aunidad[1]:= {|| iif(Arg1 = 0 .AND. ngrupo = 1, "cero", "")}
aunidad[2]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
iif(agrupos[ngrupo] = "001" .AND. (ngrupo = 2 .OR. ngrupo = ;
4), "", iif(ngrupo > 2, "un ", iif(Arg2 = "F", "una ", ;
"uno "))))}
aunidad[3]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"dos ")}
aunidad[4]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"tres ")}
aunidad[5]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"cuatro ")}
aunidad[6]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"cinco ")}
aunidad[7]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"seis ")}
aunidad[8]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"siete ")}
aunidad[9]:= {|| iif(cdecena = "1", adecena[2][Val(cunidad) + 1], ;
"ocho ")}
aunidad[10]:= {|| iif(cdecena = "1", ;
adecena[2][Val(cunidad) + 1], "nueve ")}
adecena[1][1]:= {|| ""}
adecena[2][1]:= {|| iif(cunidad = "0", "diez ", "")}
adecena[2][2]:= "once "
adecena[2][3]:= "doce "
adecena[2][4]:= "trece "
adecena[2][5]:= "catorce "
adecena[2][6]:= "quince "
adecena[2][7]:= "dieciseis "
adecena[2][8]:= "diecisiete "
adecena[2][9]:= "dieciocho "
adecena[2][10]:= "diecinueve "
adecena[3][1]:= {|| iif(cunidad = "0", "veinte ", "veinti")}
adecena[4][1]:= {|| "treinta " + iif(cunidad != "0", "y ", "")}
adecena[5][1]:= {|| "cuarenta " + iif(cunidad != "0", "y ", "")}
adecena[6][1]:= {|| "cincuenta " + iif(cunidad != "0", "y ", "")}
adecena[7][1]:= {|| "sesenta " + iif(cunidad != "0", "y ", "")}
adecena[8][1]:= {|| "setenta " + iif(cunidad != "0", "y ", "")}
adecena[9][1]:= {|| "ochenta " + iif(cunidad != "0", "y ", "")}
adecena[10][1]:= {|| "noventa " + iif(cunidad != "0", "y ", "")}
acentena[1]:= {|| ""}
acentena[2]:= {|| iif(cdecena + cunidad = "00", "cien ", ;
"ciento ")}
acentena[3]:= {|| "doscient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[4]:= {|| "trescient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[5]:= {|| "cuatrocient" + iif(ngrupo < 3 .AND. Arg2 = ;
"F", "as ", "os ")}
acentena[6]:= {|| "quinient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[7]:= {|| "seiscient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[8]:= {|| "setecient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[9]:= {|| "ochocient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
acentena[10]:= {|| "novecient" + iif(ngrupo < 3 .AND. Arg2 = "F", ;
"as ", "os ")}
aconector[1]:= {|| ""}
aconector[2]:= {|| iif(agrupos[2] > "000", "mil ", "")}
aconector[3]:= {|| iif(agrupos[3] > "000" .OR. agrupos[4] > ;
"000", iif(agrupos[3] = "001", "millon ", "millones "), "")}
aconector[4]:= {|| iif(agrupos[4] > "000", "mil ", "")}
aconector[5]:= {|| iif(agrupos[5] > "000", iif(agrupos[5] = ;
"001", "billon ", "billones "), "")}
cnumstr:= alltrim(Str(Arg1, 15, 0))
cnumstr:= Replicate("0", 15 - Len(cnumstr)) + cnumstr
For ngrupo:= 1 to 5
agrupos[5 - ngrupo + 1]:= SubStr(cnumstr, (ngrupo - 1) * 3 + 1, 3)
Next
cenletra:= ""
For ngrupo:= 5 to 1 step -1
cunidad:= right(agrupos[ngrupo], 1)
cdecena:= SubStr(agrupos[ngrupo], 2, 1)
ccentena:= Left(agrupos[ngrupo], 1)
cenletra:= cenletra + eval(acentena[Val(ccentena) + 1]) + ;
eval(adecena[Val(cdecena) + 1][1]) + ;
eval(aunidad[Val(cunidad) + 1]) + eval(aconector[ngrupo])
Next
Return Upper(cenletra) + ccentavos