Muchachos
Es bueno saber que en la lista hay gente
atenta a todo lo que pasa.
Pido perdón por el error y adjunto la
rutina modificada.
Les voy a pedir a quienes la adopten que
me informen de cualquier error que encuentren.
Gracias.
FUNCTION MontoLetras(nNumeroaLetras) AS
STRING
//Autor: Gerardo
//Fecha: 04/10/2005
//Lugar: Marcos Juárez (CBA) Argentina
//mail :
//El presente convierte numeros en letras
//La lectura la realiza de derecha a
izquierda,
//primero con el valor entero y luego los
decimales.
LOCAL vUnidad,vDecena,vCentena,vDecena1,vDecena2 AS ARRAY
LOCAL cMonto,cValorEntero,cValor AS STRING
LOCAL cCadena1,cCadena2 AS STRING
LOCAL nValorEntero,nValor AS USUAL
LOCAL nPosicionMiles,nLargo,nToma3nPosicion AS INT
IF nNumeroaLetras=0
RETURN "Cero."
ENDIF
vUnidad ={"uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"}
vDecena
={"diez","veinte","treinta","cuarenta","cincuenta",;
"sesenta","setenta","ochenta","noventa"}
vDecena1={"once","doce","trece","catorce","quince",;
"dieciseis","diecisiete","dieciocho","diecinueve"}
vDecena2={"veintiuno","veintidós","veintitres","veinticuatro",;
"veinticinco","veintiseis","veintisiete","veintiocho","veintinueve"}
vCentena={"ciento","doscientos","trescientos","cuatrocientos",;
"quinientos","seiscientos","setecientos","ochocientos","novecientos"}
lSalida := FALSE
nValorDecimales := 0
cMonto := ""
DO WHILE !lSalida
IF Integer(nNumeroaLetras)<>nNumeroaLetras .AND. nValorDecimales=0
//decimales
nValorDecimales:= nNumeroaLetras-Integer(nNumeroaLetras)
nValorEntero := Val(Right(Str(nValorDecimales),LENNUM(nValorDecimales)-2))
cValorEntero := LTrim(Str(nValorEntero))
nLargo :=
Len(LTrim(Str(nValorEntero)))
nPosicionMiles := 0 //de derecha a izquierda cuenta posiciones de a 3
números.
nToma3 := nLargo
IF nValorEntero>1
cMonto := " centavos"
ELSE
cMonto := " centavo"
ENDIF
ELSE
nValorEntero := Integer(nNumeroaLetras)
cValorEntero := LTrim(Str(nValorEntero))
nLargo :=
Len(LTrim(Str(nValorEntero)))
nPosicionMiles := 0 //de derecha a izquierda cuenta posiciones de a 3 números.
nToma3 := nLargo
lSalida := TRUE
IF nValorDecimales>0 .AND. nValorEntero>0
cMonto=" con "+cMonto
ENDIF
ENDIF
DO WHILE TRUE
IF nToma3<1
EXIT
ENDIF
cValor := ""
FOR nLazo=1 UPTO 3
IF nToma3>=1
cValor=SubStr(cValorEntero,nToma3,1)+cValor
nToma3-=1
ENDIF
NEXT
nPosicionMiles++
DO CASE
CASE nPosicionMiles=2 //desde
cMonto=" mil "+cMonto
CASE nPosicionMiles=3 //desde
IF nValorEntero>=1000000 .AND. nValorEntero<=1999999
cMonto=" millón "+cMonto
ELSE
cMonto=" millones "+cMonto
ENDIF
CASE nPosicionMiles=4 //desde 1.000.000.000.000 a ......
IF nValorEntero>=1000000000000 .AND. nValorEntero<=1999999999999
cMonto=" billón "+cMonto
ELSE
cMonto=" billones "+cMonto
ENDIF
ENDCASE
nValor := Val(cValor)
nLargo := Len(cValor)
IF nLargo=1
IF nValor>0
IF nValor=1
cMonto="un"+cMonto
ELSE
cMonto=vUnidad[nValor]+cMonto
ENDIF
ENDIF
ELSE
IF Val(Right(cValor,2))>0
IF nValor=1
cMonto="un"+cMonto
ELSEIF Val(Right(cValor,2))>=11 .AND. Val(Right(cValor,2))<=19
cMonto=vDecena1[Val(Right(cValor,2))-10]+" "+cMonto
ELSEIF Val(Right(cValor,2))>=21 .AND. Val(Right(cValor,2))<=29
cMonto=vDecena2[Val(Right(cValor,2))-20]+" "+cMonto
ELSE
cMonto=IIF(Val(Left(Right(cValor,2),1))>0,vDecena[Val(Left(Right(cValor,2),1))],"")+;
IIF(Val(Left(Right(cValor,2),1))>0 .AND.
Val(Right(cValor,1))>0," y ","")+;
IIF(Val(Right(cValor,1))>0,vUnidad[Val(Right(cValor,1))],"")+cMonto
ENDIF
ENDIF
IF nLargo=3
IF nValor=100
cMonto="cien "+cMonto
ELSEIF Val(Left(cValor,1))>0
cMonto=vCentena[Val(Left(cValor,1))]+" "+cMonto
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
//Pone el primer caracter en mayúsculas.
nPosicion:=At(" ",cMonto)
cCadena1 :=Left(cMonto,nPosicion)
cCadena2 :=Right(cMonto,Len(cMonto)-nPosicion)
cCadena1 :=Proper(cCadena1)
cMonto :=cCadena1+cCadena2+"."
RETURN(cMonto)
Gerardo
Analista de Sistemas
(2580) Marcos Juárez
Córdoba - Argentina
Mail:
MSN: