PROCEDURE EnLetras
LPARAMETERS tnNumber,tcEndText,tlOmitDecimal
*------------------------------------------------------------------------------------
* tnNumber Número que se convierte en expresión literal
* tcEndText Caracteres con los que cierra el string
* tlOmitDecimal Si es .T., omite la expresión decimal cuando tnNumber es Integer
*------------------------------------------------------------------------------------
TRY
LOCAL cv1,;
cV10,;
cvd,;
cvo,;
cvu,;
i,;
lcAdd,;
lcCentenas,;
lcDecenas,;
lcDecimal,;
lcDecpar,;
lcEnletra,;
lcEnletras,;
lcNumero,;
lcParte,;
lcSegment,;
lcString,;
lcSub,;
lcTerminador,;
lcUnidades,;
lnDecimal,;
lnEntero,;
lnLen,;
lnNumero,;
lnPas,;
lnValor,;
lSaltuni,;
nLines,;
loEx AS EXCEPTION
LcEnLetras = ""
CV1 = ""
CV10 = ""
LOCAL ARRAY laSep(6,2)
laSep[1,1]=1
laSep[2,1]=2
laSep[3,1]=3
laSep[4,1]=4
laSep[5,1]=5
laSep[6,1]=6
laSep[1,2]=[]
laSep[2,2]=[MIL]
laSep[3,2]=[MILLON]
laSep[4,2]=[MIL]
laSep[5,2]=[BILLON]
laSep[6,2]=[MIL]
lcUnidades="UN,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE"
lcDecPar="ONCE,DOCE,TRECE,CATORCE,QUINCE,DIECISEIS,DIECISIETE,DIECIOCHO,DIECINUEVE"
lcDecenas="DIEZ,VEINTE,TREINTA,CUARENTA,CINCUENTA,SESENTA,SETENTA,OCHENTA,NOVENTA"
lcCentenas="CIENTO,DOSCIENTOS,TRESCIENTOS,CUATROCIENTOS,QUINIENTOS,";
+"SEISCIENTOS,SETECIENTOS,OCHOCIENTOS,NOVECIENTOS"
IF VARTYPE(tcEndText)#"C"
tcEndText="***"
ENDIF
DO WHILE .t.
IF VARTYPE(tnNumber)#"N"
EXIT
ENDIF
tnNumber=Abs(tnNumber)
IF tnNumber = 0
CV1 = "0"
CV10 = "0"
LcEnLetras = "CERO" ;
+ IIF(tlOmitDecimal,""," CON "+CV10+CV1+"/100"+tcEndText)
EXIT
ENDIF
lnDecimal = 0
lnEntero = INT(tnNumber)
lnDecimal = tnNumber - lnEntero
lcNumero = ALLTRIM(TRANSFORM(lnEntero,"999,999,999,999,999"))
CVO = INT((tnNumber-INT(tnNumber))*100+.009)
CVD = INT(CVO/10)
CVU = INT(CVO-CVD*10)
lcDecimal = "CON "+LTRIM(STR(CVD))+LTRIM(STR(CVU))+"/100"
IF lnDecimal = 0 AND tlOmitDecimal
lcDecimal = ""
ENDIF
RELEASE laSegment
nlines = ALINES(laLines,lcNumero,1,",")
LOCAL ARRAY laSegment(nLInes,4)
laSegment = ""
lnPas = nLines
FOR i = 1 TO nlines
laSegment[i,1] = laLines[i]
laSegment[i,4] = lnPas
lnpas = lnpas-1
NEXT
FOR i = 1 TO ALEN(laSegment,1)
lcSegment = ""
lcParte = laSegment[i,1]
lnValor = VAL(lcparte)
lnLen = LEN(lcParte)
lSaltUni = .f.
DO case
CASE lnLen = 3
* 1 Centena
IF LEFT(lcParte,1)#"0"
IF LEFT(lcParte,1) = "1" AND RIGHT(lcParte,2) = "00"
lcSegment = "CIEN"
ELSE
lcSegment = GETWORDNUM(LcCentenas,VAL(LEFT(lcParte,1)),",")+" "
ENDIF
ENDIF
* 2 Decenas y Unidades
lcSub = right(lcParte,2)
DO case
CASE LEFT(lcSub,1) = "0"
CASE LEFT(lcSub,1) = "1"
IF RIGHT(lcSub,1) = "0"
lcSegment = lcSegment+GETWORDNUM(LcDecenas,VAL(LEFT(lcSub,1)),",")
ELSE
lcSegment = lcSegment+GETWORDNUM(lcDecPar,VAL(RIGHT(lcSub,1)),",")+" "
lSaltUni = .t.
ENDIF
CASE LEFT(lcSub,1) = "2"
IF RIGHT(lcSub,1) = "0"
lcSegment = lcSegment+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
lSaltUni = .t.
ELSE
lcSegment = lcSegment+"VEINTI"
ENDIF
OTHERWISE
lSaltuni = IIF(RIGHT(lcSub,1) = "0",.t.,.f.)
lcSegment = lcSegment+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",");
+IIF(RIGHT(lcSub,1) = "0"," "," Y ")
ENDCASE
* Unidades
IF !lSaltUni AND Right(lcParte,1)#"0"
IF i = nLines AND Right(lcParte,1) = "1"
lcSegment = lcSegment+"UNO"
ELSE
lcSegment = lcSegment+GETWORDNUM(lcUnidades,VAL(RIGHT(lcParte,1)),",")
ENDIF
ENDIF
CASE lnLen = 2
* 2 Decenas y Unidades
lcSub = lcParte
DO case
CASE LEFT(lcSub,1) = "0"
CASE LEFT(lcSub,1) = "1"
IF RIGHT(lcSub,1) = "0"
lcSegment = lcSegment+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
ELSE
lcSegment = lcSegment+GETWORDNUM(lcDecPar,VAL(RIGHT(lcSub,1)),",")+" "
lSaltUni = .t.
ENDIF
CASE LEFT(lcSub,1) = "2"
IF RIGHT(lcSub,1) = "0"
lcSegment = lcSegment+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
lSaltUni = .t.
ELSE
lcSegment = lcSegment+"VEINTI"
ENDIF
OTHERWISE
lSaltuni = IIF(RIGHT(lcSub,1) = "0",.t.,.f.)
lcSegment = lcSegment+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",");
+IIF(RIGHT(lcSub,1) = "0"," "," Y ")
ENDCASE
* Unidades
IF !lSaltUni AND Right(lcParte,1)#"0"
IF i = nLines AND Right(lcParte,1) = "1"
lcSegment = lcSegment+"UNO"
ELSE
lcSegment = lcSegment+GETWORDNUM(lcUnidades,VAL(RIGHT(lcParte,1)),",")
ENDIF
ENDIF
CASE lnLen = 1
IF lcParte#"0"
IF i = nLines AND lcParte = "1"
lcSegment = lcSegment+"UNO"
ELSE
lcSegment = lcSegment+GETWORDNUM(lcUnidades,VAL(lcParte),",")
ENDIF
endif
ENDCASE
laSegment[i,2] = ALLTRIM(lcSegment)
lcAdd = ""
IF INLIST(laSegment[i,4],3,5)
IF lnValor>1
lcAdd = "ES"
ENDIF
ENDIF
laSegment[i,3] = laSep( ASCAN(laSep,laSegment[i,4])+1 )+LcAdd
NEXT
lcString = ""
FOR i = 1 TO ALEN(laSegment,1)
IF !EMPTY(laSegment[i,2])
lcString = lcString;
+ ALLTRIM(laSegment[i,2])+" ";
+ ALLTRIM(laSegment[i,3])+" "
ENDIF
NEXT
lcEnLetras = ALLTRIM(lcString) ;
+IIF(EMPTY(lcDecimal),""," "+LcDecimal);
+tcEndText
EXIT
ENDDO
CATCH TO LOEX
LOEX.USERVALUE = PROGRAM()
* SHOWERROR(LOEX) && muestra el mensaje de error
FINALLY
ENDTRY
RETURN lcEnLetras