In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Cantidad en letras

Foro público de Xailer en español
Responder
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Cantidad en letras

Mensaje por jasm.quitaesto »

¿Tiene alguien a mano una funcion para convertir cantidades en letra?
Saludos
Alf+.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9255
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Cantidad en letras

Mensaje por ignacio »

José,
Aquí­ va una:
/*
-- Función ------------------------------------------------------------ -----
- Descripción: Convierte en literal un número -
- Autor: Ignacio Ortiz de Zúñiga Echeverrí­a -
- Copyright: OZ Software -
------------------------------------------------------------ ----------------
- Function: NtoL(nValor, [lMasculino], [cDesUni], [cDesDec] ) -
- -
- Argumentos: nValor = Valor númerico a convertir -
- lMasculino = Verdadero o Falso (defecto falso) -
- cDesUni = Descriptor para las unidades (defecto EUROS) -
- cDesDec = Descriptor para las decimales (defecto CENTIMOS) -
- Valor Return: Cadena con el literal del número -
- -
------------------------------------------------------------ ----------------
*/
FUNCTION NtoL(nValue, lMale, cDesUni, cDesDec, lRec)
LOCAL aUni[15], aDec[9], aCen[9]
LOCAL cStr, cDec
LOCAL nDec
LOCAL lSetFixed
DEFAULT cDesUni TO "EUROS" ,;
cDesDec TO "CENTIMOS"
cStr := ""
lSetFixed := Set( _SET_FIXED, .F. )
IF nValue < 0
cStr := "MENOS "
nValue := Abs(nValue)
ENDIF
nDec := nValue - Int(nValue)
IF lMale == NIL
lMale := .t.
ENDIF
IF lRec == NIL
lRec := .F.
ENDIF
IF nDec > 0
nValue := Int(nValue)
nDec := Round(nDec*(10^Set(_SET_DECIMALS)), 0)
cDec := " Y " + NtoL(nDec, lMale, cDesDec,"", .f.)
ENDIF
aUni[01] := "UNA"
aUni[02] := "DOS"
aUni[03] := "TRES"
aUni[04] := "CUATRO"
aUni[05] := "CINCO"
aUni[06] := "SEIS"
aUni[07] := "SIETE"
aUni[08] := "OCHO"
aUni[09] := "NUEVE"
aUni[10] := "DIEZ"
aUni[11] := "ONCE"
aUni[12] := "DOCE"
aUni[13] := "TRECE"
aUni[14] := "CATORCE"
aUni[15] := "QUINCE"
aDec[01] := "DIEZ"
aDec[02] := "VEINTE"
aDec[03] := "TREINTA"
aDec[04] := "CUARENTA"
aDec[05] := "CINCUENTA"
aDec[06] := "SESENTA"
aDec[07] := "SETENTA"
aDec[08] := "OCHENTA"
aDec[09] := "NOVENTA"
aCen[01] := "CIENTO"
aCen[02] := "DOSCIENTAS"
aCen[03] := "TRESCIENTAS"
aCen[04] := "CUATROCIENTAS"
aCen[05] := "QUINIENTAS"
aCen[06] := "SEISCIENTAS"
aCen[07] := "SETECIENTAS"
aCen[08] := "OCHOCIENTAS"
aCen[09] := "NOVECIENTAS"
IF lMale
aUni[01] := "UN"
aCen[02] := "DOSCIENTOS"
aCen[03] := "TRESCIENTOS"
aCen[04] := "CUATROCIENTOS"
aCen[05] := "QUINIENTOS"
aCen[06] := "SEISCIENTOS"
aCen[07] := "SETECIENTOS"
aCen[08] := "OCHOCIENTOS"
aCen[09] := "NOVECIENTOS"
ENDIF
DO CASE
CASE nValue == 0
IF !lRec
cStr := "CERO"
ENDIF
CASE nValue < 16
cStr += aUni[nValue]
CASE nValue < 100
IF nValue%10 == 0
cStr += aDec[Int(nValue/10)]
ELSE
DO CASE
CASE nValue < 20
cStr += "DIECI"
CASE nValue < 30
cStr += "VEINTI"
OTHERWISE
cStr += aDec[Int(nValue/10)] + " Y "
END CASE
cStr += aUni[nValue%10]
ENDIF
CASE nValue = 100
cStr += "CIEN"
CASE nValue < 1000
cStr += aCen[Int(nValue/100)] + " " + NtoL(nValue%100, lMale, cDesUni, cDesDec,.T.)
CASE nValue = 1000
cStr += "MIL"
CASE nValue < 1000000
IF Int(nValue/1000) > 1
cStr += NtoL(Int(nValue/1000), lMale, cDesUni, cDesDec,.T.) + " "
ENDIF
cStr += "MIL " + NtoL(nValue%1000, lMale, cDesUni, cDesDec,.T.)
CASE nValue == 1000000
cStr += "UN MILLON"
CASE nValue > 1000000
cStr += NtoL(Int(nValue/1000000), .T., cDesUni, cDesDec,.T.)
IF Int(nValue/1000000) > 1
cStr += " MILLONES "
ELSE
cStr += " MILLON "
ENDIF
cStr += NtoL(nValue%1000000, lMale, cDesUni, cDesDec,.T.)
ENDCASE
IF !Empty(cDesUni) .and. !lRec
IF nValue == 1
cDesUni := Left(cDesUni, len(cDesUni)-1)
ENDIF
cStr += " " + cDesUni
ENDIF
IF !Empty(cDec)
cStr += cDec
ENDIF
Set( _SET_FIXED, lSetFixed )
RETURN Trim(cStr)
--
Ignacio Ortiz de Zúñiga
[Soporte Xailer]
[Xailer support]
"José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el mensaje news:48ae6796$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> ¿Tiene alguien a mano una funcion para convertir cantidades en letra?
>
>
> Saludos
>
> Alf+.
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Cantidad en letras

Mensaje por jasm.quitaesto »

Ignacio,
Gracias.
Saludos,
Alf+.
> José,
>
> Aquí­ va una:
>
> /*
> -- Función ------------------------------------------------------------ -----
> - Descripción: Convierte en literal un número -
> - Autor: Ignacio Ortiz de Zúñiga Echeverrí­a -
> - Copyright: OZ Software -
> ------------------------------------------------------------ ----------------
> - Function: NtoL(nValor, [lMasculino], [cDesUni], [cDesDec] ) -
> - -
> - Argumentos: nValor = Valor númerico a convertir -
> - lMasculino = Verdadero o Falso (defecto falso) -
> - cDesUni = Descriptor para las unidades (defecto EUROS) -
> - cDesDec = Descriptor para las decimales (defecto CENTIMOS) -
> - Valor Return: Cadena con el literal del número -
> - -
> ------------------------------------------------------------ ----------------
> */
>
> FUNCTION NtoL(nValue, lMale, cDesUni, cDesDec, lRec)
>
> LOCAL aUni[15], aDec[9], aCen[9]
> LOCAL cStr, cDec
> LOCAL nDec
> LOCAL lSetFixed
>
> DEFAULT cDesUni TO "EUROS" ,;
> cDesDec TO "CENTIMOS"
>
> cStr := ""
> lSetFixed := Set( _SET_FIXED, .F. )
>
> IF nValue < 0
> cStr := "MENOS "
> nValue := Abs(nValue)
> ENDIF
>
> nDec := nValue - Int(nValue)
>
> IF lMale == NIL
> lMale := .t.
> ENDIF
>
> IF lRec == NIL
> lRec := .F.
> ENDIF
>
> IF nDec > 0
> nValue := Int(nValue)
> nDec := Round(nDec*(10^Set(_SET_DECIMALS)), 0)
> cDec := " Y " + NtoL(nDec, lMale, cDesDec,"", .f.)
> ENDIF
>
> aUni[01] := "UNA"
> aUni[02] := "DOS"
> aUni[03] := "TRES"
> aUni[04] := "CUATRO"
> aUni[05] := "CINCO"
> aUni[06] := "SEIS"
> aUni[07] := "SIETE"
> aUni[08] := "OCHO"
> aUni[09] := "NUEVE"
> aUni[10] := "DIEZ"
> aUni[11] := "ONCE"
> aUni[12] := "DOCE"
> aUni[13] := "TRECE"
> aUni[14] := "CATORCE"
> aUni[15] := "QUINCE"
>
> aDec[01] := "DIEZ"
> aDec[02] := "VEINTE"
> aDec[03] := "TREINTA"
> aDec[04] := "CUARENTA"
> aDec[05] := "CINCUENTA"
> aDec[06] := "SESENTA"
> aDec[07] := "SETENTA"
> aDec[08] := "OCHENTA"
> aDec[09] := "NOVENTA"
>
> aCen[01] := "CIENTO"
> aCen[02] := "DOSCIENTAS"
> aCen[03] := "TRESCIENTAS"
> aCen[04] := "CUATROCIENTAS"
> aCen[05] := "QUINIENTAS"
> aCen[06] := "SEISCIENTAS"
> aCen[07] := "SETECIENTAS"
> aCen[08] := "OCHOCIENTAS"
> aCen[09] := "NOVECIENTAS"
>
> IF lMale
> aUni[01] := "UN"
> aCen[02] := "DOSCIENTOS"
> aCen[03] := "TRESCIENTOS"
> aCen[04] := "CUATROCIENTOS"
> aCen[05] := "QUINIENTOS"
> aCen[06] := "SEISCIENTOS"
> aCen[07] := "SETECIENTOS"
> aCen[08] := "OCHOCIENTOS"
> aCen[09] := "NOVECIENTOS"
> ENDIF
>
> DO CASE
>
> CASE nValue == 0
>
> IF !lRec
> cStr := "CERO"
> ENDIF
>
> CASE nValue < 16
>
> cStr += aUni[nValue]
>
> CASE nValue < 100
>
> IF nValue%10 == 0
>
> cStr += aDec[Int(nValue/10)]
>
> ELSE
>
> DO CASE
> CASE nValue < 20
> cStr += "DIECI"
> CASE nValue < 30
> cStr += "VEINTI"
> OTHERWISE
> cStr += aDec[Int(nValue/10)] + " Y "
> END CASE
>
> cStr += aUni[nValue%10]
>
> ENDIF
>
> CASE nValue = 100
>
> cStr += "CIEN"
>
> CASE nValue < 1000
>
> cStr += aCen[Int(nValue/100)] + " " + NtoL(nValue%100, lMale,
> cDesUni, cDesDec,.T.)
>
> CASE nValue = 1000
>
> cStr += "MIL"
>
> CASE nValue < 1000000
>
> IF Int(nValue/1000) > 1
> cStr += NtoL(Int(nValue/1000), lMale, cDesUni, cDesDec,.T.) + " "
> ENDIF
>
> cStr += "MIL " + NtoL(nValue%1000, lMale, cDesUni, cDesDec,.T.)
>
> CASE nValue == 1000000
>
> cStr += "UN MILLON"
>
> CASE nValue > 1000000
>
> cStr += NtoL(Int(nValue/1000000), .T., cDesUni, cDesDec,.T.)
>
> IF Int(nValue/1000000) > 1
> cStr += " MILLONES "
> ELSE
> cStr += " MILLON "
> ENDIF
>
> cStr += NtoL(nValue%1000000, lMale, cDesUni, cDesDec,.T.)
>
> ENDCASE
>
> IF !Empty(cDesUni) .and. !lRec
> IF nValue == 1
> cDesUni := Left(cDesUni, len(cDesUni)-1)
> ENDIF
> cStr += " " + cDesUni
> ENDIF
>
> IF !Empty(cDec)
> cStr += cDec
> ENDIF
>
> Set( _SET_FIXED, lSetFixed )
>
> RETURN Trim(cStr)
>
> --
> Ignacio Ortiz de Zúñiga
> [Soporte Xailer]
> [Xailer support]
>
>
> "José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com
> <mailto:jasm.quitaesto@tpvsoft.com>> escribió en el mensaje
> news:48ae6796$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> > ¿Tiene alguien a mano una funcion para convertir cantidades en letra?
> >
> >
> > Saludos
> >
> > Alf+.
Pedro Amaro
Mensajes: 157
Registrado: Jue May 18, 2006 5:10 pm

Cantidad en letras

Mensaje por Pedro Amaro »

Yo he adaptado la que siempre he usado para los talones y recibos a Xailer y me esta funcionando.
CLASS TNum2Text
DATA aUni INIT {"", "UNO", "DOS ", "TRES ", "CUATRO ", "CINCO ", ;
"SEIS ", "SIETE ", "OCHO ", "NUEVE ", "DIEZ ", ;
"ONCE ", "DOCE ", "TRECE ", "CATORCE ","QUINCE ", ;
"DIECISEIS ", "DIECISIETE ", "DIECIOCHO ", "DIECINUEVE ", ;
"VEINTE "}
DATA aDec INIT {"", "VEINTI", "TREINTA ", "CUARENTA ", "CINCUENTA ", ;
"SESENTA ", "SETENTA ", "OCHENTA ", "NOVENTA "}
DATA aCen INIT {"CIENTO ", "DOSCIENTOS ", "TRESCIENTOS ", "CUATROCIENTOS ", ;
"QUINIENTOS ", "SEISCIENTOS ", "SETECIENTOS ", "OCHOCIENTOS ", ;
"NOVECIENTOS "}
DATA cMoneda INIT "EURO "
DATA cMonedas INIT "EUROS "
DATA lMoneda INIT .T.
CONSTRUCTOR New()
METHOD Transformar( nImporte, lMoneda )
METHOD Nombrar( nImpo, lSwCent )
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD New( ) Class TNum2Text
RETURN Nil
//---------------------------------------------------------- --------------------
METHOD Transformar( nImporte, lMoneda ) Class TNum2Text
LOCAL cCad, nImpo, nEnt, nDec, cCadena, nPaso, cSal
::lMoneda := lMoneda
nImpo := nImporte
nEnt := Int( nImpo )
nDec := Int( nImpo * 100 ) - ( nEnt * 100 )
cCadena := ::Nombrar( nEnt, ::lMoneda )
IF ::lMoneda .AND. nEnt != 0
IIF( nEnt == 1, cCad := ::cMoneda, cCad := ::cMonedas )
IIF( cCadena == "UN MILLON ", cSal := "DE " + cCad, cSal := cCad )
cCadena += cSal
END IF
IF nDec > 0
IIF( nDec == 1, cCad := "CENTIMO", cCad := "CENTIMOS" )
IIF( nEnt != 0 , cCadena += "CON ", cCadena :="" )
cCadena += ::Nombrar( nDec, .T. ) + cCad
END IF
IF ::lMoneda .AND. nEnt == 0 .AND. nDec != 0
cCadena += " DE " + ::cMoneda
END IF
cCad := cCadena
RETURN cCad
//---------------------------------------------------------- --------------------
METHOD Nombrar( nImpo, lSwCent ) Class TNum2Text
LOCAL nMill, nCMil, nXX, nCent
LOCAL lSW1
LOCAL cCad := ""
LOCAL cT := ""
LOCAL cCadena
nMill := Int(nImpo / 1000000)
lSW1 := .F.
IF nMill > 0
nImpo -= nMIll * 1000000
IF nMill == 1
cCad := "UN MILLON "
ELSEIF nMill == 100
cCad := "CIEN MILLONES "
ELSE
IF nMill > 100
nXX := INT( nMill / 100 )
cCad += ::aCen[ nXX ]
nMill := nMill - 100 * nXX
END IF
IF nMill > 29
lSW1 := .T.
ENDIF
IF nMill > 20
nXX := INT( nMill / 10 )
cCad += ::aDec[ nXX ]
nMill := nMill - 10 * nXX
END IF
IIF( nMill == 1, cT := "UN ", cT := ::aUni[ nMill + 1 ] )
IF nMill > 0 .AND. lSW1
cCad += "Y " + cT
ELSEIF nMill > 0
cCad += cT
ENDIF
cCad += "MILLONES "
ENDIF
ENDIF
nCMil := INT( nImpo / 1000 )
IF nCMil > 0
nImpo -= nCMil * 1000
IF nCMil == 1 .AND. nMill == 0
cCad += "MIL "
ELSE
IF nCMil == 100
cCad += "CIEN "
nCMil := nCMil - 100
ELSE
IF nCMil > 100
nXX := INT( nCMil / 100 )
cCad += ::aCen[ nXX ]
nCMil := nCMil - 100 * nXX
END IF
IF nCMil > 29
lSW1 := .T.
ENDIF
END IF
IF nCMil > 20
nXX := INT( nCMil / 10 )
cCad += ::aDec[ nXX ]
nCMil := nCMil - 10 * nXX
END IF
IIF( nCMil == 1, cT := "UN ", cT := ::aUni[ nCMil + 1 ] )
IF nCMil > 0 .AND. lSW1
cCad += "Y " + cT
ELSEIF nCMil > 0
cCad += cT
ENDIF
cCad += "MIL "
ENDIF
ENDIF
nCent := nImpo
lSW1 := .F.
IF nCent > 0
IF nCent == 100
cCad += "CIEN "
nCent := nCent - 100
ELSE
IF nCent > 100
nXX := INT( nCent / 100 )
cCad += ::aCen[ nXX ]
nCent := nCent - 100 * nXX
END IF
ENDIF
IF nCent > 29
lSW1 := .T.
ENDIF
IF nCent > 20
nXX := INT( nCent / 10 )
cCad := cCad + ::aDec[ nXX ]
nCent := nCent - 10 * nXX
END IF
cT := ""
IF nCent > 0
IF nCent == 1
IIF( lSWCent, cT := "UN ", cT := "UNO ")
ELSE
cT = ::aUni[ nCent + 1]
ENDIF
IF lSW1
cCad += "Y " + cT
ELSE
cCad += cT
ENDIF
ENDIF
ENDIF
cCadena := cCad
RETURN cCadena
Y la uso asi
cTexto := TNum2Text():Transformar( 1000, .T. )
La tengo optimizada para una salida mas estetica,
A mi me gista mas poner "con" que "y" para enlazar la parte entera con la decimal
No me gusta que me aparezca un recibo con "cero euros con cincuenta centimos", yo prefiero "cincuenta centimos de euro".
Seguramente se podria optimiar mas el codigo, ahora me estudiare la de Ignacio para ver como mejorar la mia.
Un saludo
Pedro Amaro
--
Pedro Amaro
Mensajes: 157
Registrado: Jue May 18, 2006 5:10 pm

Cantidad en letras

Mensaje por Pedro Amaro »

Éste es un mensaje de varias partes en formato MIME.
------=_NextPart_000_008A_01C90478.F1999290
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_008B_01C90478.F1999290"
------=_NextPart_001_008B_01C90478.F1999290
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Hace tiempo que por una entrada en el foro de un compa=F1ero sobre este =
mismo tema, me pico la curiosidad y al ver el proyecto que =E9l =
expon=EDa me espante al ver el resultado, probablemente es culpa de la =
educaci=F3n matem=E1tica que nos dieron de chicos, pero eso de poner =
"diez euros 25/100" me parece muy duro para mi vista.
As=ED me prepare este proyecto adaptando la funci=F3n que tenia para VB, =
la cual venia desde GW y hab=EDa pasado por Basic7, pero intentando usar =
clases y dem=E1s.
Ahora le he a=F1adido la funci=F3n de Ignacio, que me ha gustado mucho, =
para que cada uno pueda evaluar dos maneras distintas de llegar a un =
mismo resultado.
Un saludo
Pedro Amaro
------=_NextPart_001_008B_01C90478.F1999290
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type =
content=3Dtext/html;charset=3Diso-8859-1>
<META content=3D"MSHTML 6.00.6000.16705" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY id=3DMailContainerBody=20
style=3D"PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-TOP: 15px"=20
bgColor=3D#ffffff leftMargin=3D0 topMargin=3D0 CanvasTabStop=3D"true"=20
name=3D"Compose message area">
<DIV><FONT face=3DArial size=3D2>Hace tiempo que por una entrada en el =
foro de un=20
compa=F1ero sobre este mismo tema, me pico la curiosidad y al ver el =
proyecto que=20
=E9l expon=EDa me espante al ver el resultado, probablemente es culpa de =
la=20
educaci=F3n matem=E1tica que nos dieron de chicos, pero eso de poner =
"diez euros=20
25/100" me parece muy duro para mi vista.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>Â</DIV>
<DIV>As=ED<FONT face=3DArial size=3D2> me prepare este proyecto =
adaptando la funci=F3n=20
que tenia para VB, la cualÂvenia desde GW y hab=EDa pasado por =
Basic7, pero=20
intentando usar clases y dem=E1s.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>Â</DIV>
<DIV><FONT face=3DArial size=3D2>Ahora le he a=F1adido la funci=F3n de =
Ignacio, que me=20
ha gustado mucho,Âpara que cada uno pueda evaluar dos maneras =
distintas de=20
llegar a un mismo resultado.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>Â</DIV>
<DIV><FONT face=3DArial size=3D2>Un saludo</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Pedro Amaro</FONT></DIV></BODY></HTML>
------=_NextPart_001_008B_01C90478.F1999290--
------=_NextPart_000_008A_01C90478.F1999290
Content-Type: application/x-zip-compressed;
name="Imp2TXT.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="Imp2TXT.zip"
UEsDBBQAAgAIAAyHFjlvqKPw4wAAAGQBAAASAAAAU291cmNlL0ltcDJUWFQu cHJnbY8xa8MwEIV3
gf7D4S52Bts1FIqgQ6AEMqSUxENXcT5igSKJi0SS350/UFldStPlhnvfu/eu W0kBK/hkfyOMXsH2
FDxHAg0jXaMv6sbgTPwotoGPBXinM7IJaO5Owe4+JethIiAXWU864zaPYA3q BSmWdYqe1c95wlkr
GIauf+mGvn9dtp0UUjwZhzblS9WXNpa4xbla9lLkwkhTYoKdNq5usgVgHUpG NN4pHE20BOoNqj+t
qwfWHow7Wtq6c9QOi6kd24KNG8+n57pRH3Spf5ugUYfZX/5J3qfSR4o9xcT5 229QSwMEFAACAAgA
lYUWObEzyLEeCQAAdSUAABEAAABTb3VyY2UvQ2xhc2VzLnByZ7VZS2/jRhK+ G/B/6HCxgOTR09nJ
ZrRxAIGiMAQkKitSE+8MvAFD0WMCMmlQVCazi/zkHIK95bRd/WJ1sylpJo4O drNeXfV1VT+HV5cX
5Ip8VxYf06QqJsR/fCrKKiUxidKfq4Jx51nykJaU6e7ifbofPJXvGX2W7pMy e0qy/+UTRpgeqqLk
zXmaPMQTcn09HL0cXo9GXwN1eHlxefGXLE92h21KnNs426XlIHlwgO4upmFI ouDweA1dA4kQMptG
UxJv8oyonx/4Efmv4/SIswlW8G+2Cgn8j9Yeb7ibabRe8aYfuKz1D2av7eeE ns91Q9+LPNZaua+5
jWDjveGkme+9PcPYKnCF/Eo0qGui5U6j1Zq1nX9ufCF4wh7t1vWVh/xLuck+ la/sSzl8wu4bzw/A
yi8I61maWLFmsr6IhTanEum1pz5oOBv5dRLvUOmFNBTZpoGodrB6w9u/aNng pnnDQ9enkgKBVci/
6qTA3zw3EOWEozBISB1GwdW+Iw9/w0CcbxwiVNJalMmyyNNtjKN0vA0kdUNm b8qEWGjXNDSIBqIr
dxWE0Xrj0pQkQfqh02XUpRe9Xs1IVMb5/r4oH+OyQ3IxM/SUQU02KB5/LJUc FQo/0GGqQOjywgtm
rLqhPRz2n/UHNqUPNADSZbPUXp9I1l60WQckyHZ/sgunIGs6RyFcrNzpgiRu vO1J+HIvr+hfWos9
xkjzmH5+F+8pLwnjHdObTKTdyY3sQowrMwNk6QOnUqtA9PNKeCcGEToyGFdk PBpRh/ukw/UEgckL
l0BlMqmHnjlde8Vl/TkiDabBbMDtfXFDRrI4fH8uerm5IWMeMjcuUtxC2gv7 Ul36RC3QdYEs/cVi
FUAJAl6g6czoTEdeCKAlldlVlqSRFzc1zDR7aRAyFgbVt6brQNRdd1xa1f4S 1ieTFDqG6woP0sMe
OK4IQKHtOFZX8RiwlKEFToeOh2qJwToeN9C/+IZw8Phgp4iAsR4JswcZr9BS 5ce9+XOngLZp6Ejh
5ctst6PV5dL/9N/tLbSpEhLZhd+PjVJlA+pgYtQkSQB4kUE/ssp4kQ2hpuDH RxW6AYHBfKDSjSmh
fOOKfVrZS59yrqQFlVBSB9IRLT7KZ1Qbku0t6KqG9WpzWBMWKqHrhbo2EkdO 63bA+dtbBkAQdYTQ
EM0qeo8sr2Gtf8fU7gxLEkze6DMzVyCJ5FBONny7fqUbVNhHA91Cq4GzYjsS Gi2yc0M7IzI2j6gB
7Ml03PAZJOJTJ2yk3wmxF2RM7jT3cLqJmUAlfiMA5198Mo2wVziPUM7qmrqK AbAyb8kzJSpavKqg
bGvgUVnV6w+XsRYR4/AiwhXEyACknBElsqMWX4+Wg7I2aoGEl5Zj5IGMjDf6 hrrRjx5poyczQZmc
tfjOq78W/xqJastV3VWzEFtr0ZIt1gKXdo/Vpwr/c+qzGfe59akS4Xh9MjF7 fcpM/kP1aZbD+fXZ
kvItlZny7SarttYFjknhDZWk2Rcia7XUXbGGVip6naAej69OTOizVyeLP2aO 6Cmi4Yyc1KrDUhet
ejg2e2BaXHjPRtOmLf0tgelx6VFpe6KW8TaH3JgooG5o3MC2Fg3cARGne3Ri pJK4uqAnWl13x9f5
Ty+tTy2nRtnoJyu5XUa7Z7GZHF5dXvT7ZH7I4e6NPMMGuk+02zziFvlPWQoX gWlOdlmVlvS0dMhJ
/vtjWhbk2I9b4z9+IUj893mcZAVZlVX2H7JNydvff8vex8RLHtKf0rL8NT5p zS2ePpbZ+4dqQlZv
SVjcVx/iMiWf+ANrz3rw4JHCQFRZQXELqmLRyd/Eu6LskXe7ZbxPDrssL+7o V0IRphkom7S+6PRu
x+2P/4S1afn+8EjzvdhPCHeLVgL/z4YySwoSk4SONh3srDxnTOVcpGIDi2m5 pdlJM6Mg83i3L0hn
m97DjTK5h8/uKWsCG2pKpCHNG/IUlzGhxzaaeBmY39dW2S1X95g1diK3Wtum SfYY77A5eTDvcmsc
oHVaHUqoBV6RFCSS7lQxbGn7ZDU8/5g+a/byC/n5JnAjn54HVfIe2JUVhagn B6YnMaWMdZp0xRLP
j7lsXh2/pInNFo1X0ICV8dUdPguHVcmsJPjorX/uwrSaZz+nW3kR6s2nm0Wk sgMueNnIO6SnX6zK
EQcJdcsirEDPXKpei1RPQKPtDvkh9KIf5v6tN+vB9oTIEGFtYpCQb/TNP1gF g0svWIX6boTLU+b0
x70AtNvcHok7NyHd59cCUlj2zYYB1sXAX8guOA32AdWgYRZ01vw2CquseWdy 42VomJdadQSaU4LJ
Xwgoc10c8m0Hvq8649G/AUcG48xz/eV0EXa7PTKqL6yUnkP4CsoTjmdVnW7w DS8Og/tBEzWWa6Px
nVj6pw6iXnPqjA29on7JqfAMgMl/42T+GoAZLwUD3o0w/StOh/t/TP67IMNz DKZ/zenwHIDJrziZ
PdAg+ngkfPe9t5gsAoX3JExWkerkOlSdLmPlL0+YI4LlD1GyYFgVS4yRR4ws uuYvR5hRdw6PQ5hT
Q82eijALgb0xeQrw0ORIzPmzEebUqJscCTx/UlKhwjwlQ+UPMQ5i1BnFeNMQ M1FiWbhafln4CPkm
E+WaRRWFb+GixLNwEQw1V5tsZLkalaYmOCsysuRawWkINPFpiBgQNfgmSg0B E6iGgIlVQ8CESwrg
KWm2Iu4Udv/8RY025fzJ74vQ4ecLmIdti4jryUnIMI7NfUPGX9XmmC49X7Bx 4hJ3dqWR7gRn/JWe
3HT/sE0omXrqH45H3btakJ91kJpCQFF0D8yrGNkNf6x2WvW+bNMTb9GIu4pe e+vv/cYh7EhAdAFi
C5FxbYPGshVoCh7Go2W8bnTolfeQSU7bUFkUWCpqzkvv60VUujVq37kNokG3 zUubm0t/0e7lyEgq
3b1RF+5XLBgyZ03Z4y7zQG1YG87a0PgMOG6a8ale1NuJDZhv2xVtYfPIqRfH fbPCewRh5/QLjSl6
El0T1HNxhXf/uppg/vMen6qPHaHTJYM43w70WbHeb5sPWOIQQKfLRXpfdVTH uzRXFvvjrvVmrA6Z
3dxwadtOuPYw6ZrK6vCCdRqHh/po0UW3N1GZPXbAECX+H1BLAwQUAAIACAAw hBY5R3WsKKwBAAB5
BQAAEAAAAFNvdXJjZS9Gb3JtMS5wcmfFU8FOwkAQvZPwDyNeikGKTUzMJhyw tEIsLaGr8bouA20s
XbK0CXy3P2B3W1AEowcJe2hm37x9O/Nma17Va3AFYyk2yDNBYLhYWvSFatSN eYSyAF0hFzftpZxr
uI8rLuMlj99TooFenglZhi7yiBGwLLNza1qdzp1CzXqtXruMU57kU4TGC4sT lG0eNRRue70wBKqv
AHcSjMpYpQDADkbjwHd8CuJBinx5L9Y33xMee8XkAHWmcXYA2hHyt9cjGltx 66i4VVUzcugg6IMt
kWWoqjSae/hW3Y5YOkcDRIjpFCXssXRhf2LIXb4F6SNuiq+bsPlKses1x+9r 7/bNLUe1ni20uaZ5
/a9Laf7aLHwdqe6LkGpIhFNcZ0C6QP18YamN0SRUsnQ1K9iq42eWGOqANoEU uxyh2VLI7kaS6BCn
lW07dojZTPB8pcYycejTxAc/Tk5sxPF5nsOE8q1+yvuZ8IyjUufw5+fXfOiV F9g9D9KQJboPVWOB
Dl2wBxNDny5OdbvQaDd0pkz2qKGQ1me7pRVNuOhCZ0ss1lZ4hxX/0tDVmyqq 3FHE09jzAVBLAwQU
AAIACAAwhBY5+68DNxwCAADbBwAAEAAAAFNvdXJjZS9Gb3JtMS54Zm3dU8uu 2jAQ3SPxD6OwCRJC
xASIkLqA8KwIIJK2a0N8IbrBRsZRab++dl4kXKC9Vbtos4g8OSczPjNznLE3 W43A5gQLMmH8qNfB
XgxcFzwVGdVKtQIAbnQivF9kxZ/7fZeIIYuof9YBoVYDDPXqtA31sqDAssOA UOEG34kOHdSWeMvM
8Z1HLgL6H0Bb84hsMfgE5scT44IAAgUyLaWyCaMx1VMHvZ5eSgfNccHF9Awu 4cGL1gCrAfIuZquV
l6FDxn3CXfEtJCrF9jyaDxaraQqnmeqp5i9zbwar4cex7am6Yz8QRlzYwedX FcniS/JVlwXDl7SG
ylNoiRXfotPqNqBnFijhGnPZjUxKc9LMocf6bBbxgHCQNaU6M5HXy+Wpn+kg DPb0SJIMAm/m05l3
RR18WRC6FweFGigHdutgJyIe90SrZU+zVtNyymccRgkOheeKr6h9wHSfUOJW JfENg5dwfkWvvZfR
eDm6P4MpZ9FpyC7JHLLo53MwkNpMU41CnTrFWVx3b0POUSiwz7Q/OSije2dQ D+S+VbzAWxImcuNj
prXUjDzvrWxZGsk9MXtSumGYZeJjbe+Sh97Ki7MPIsGU3e/kDh3Z52AR0AT0 SmCpNc+WwT6Q3es2
W4Ys+rVlsGRXkCHvjbp3V2FOd2EUcHAYJT7++/tQsk8u7NZC7zMJ+g2TIOuf NQl6ahL01CRt9H+Y
ZDP2Pm2W8YyrlR9QSwMEFAACAAgAm5jQOFKM6STlAgAAvAUAAAsAAABJbXAy VFhULnhwal2UTXPi
OBCG71TxH3LfWsqyIYCnfBggqfVWGCjwzkwVm4MsdxxtrI+V5YT8+21ZgjF7 UvfztuRXLVmn/WH3
58O6eB6Pik8NGZxhPNpAywzXliuZ5UIrY+GO3hVwtmo82nVWd9bxuPhZTPoJ ayU0b8Bk5z+oKVVn
xqMt5XKrqq6B7FEZQSba1Ei7xnLdQC5bSyWDNps8Tsajn/stlfwFWptNCsxz hl8ej/bUUAEWTIvJ
7mHri79j7pyRSTQeHaAB2kKG4arjTeUC54bKzyzer++OYN456y3qzwOvXy0u VRhawZaaN7cuVguQ
1oWn3b7Id9+O2IyvnVWCWs62IN6p2QBr0Ezfkd7EBsquzuWL8oaPndYG2vaJ S/jWiRKM04wYzLiU
HF+xn6yzlsvaKz+okRKzJ3iHJiPYJWVg17ffuXLZar1G4BKqH7HTfuIaC1QD 2OYAXClaePO1p01+
wKPdHfIHt6UjnguDDTeZj7DNkjVd1aMQuoa217pLjM0v/3EAB1z2MX/qFyTX S9CfbZytGzyK1mfJ
8NhPT/nq8DX4INlvpzN11+XZD5OGl276FSt29izJfr+w9t+GW/B4+gtjLj5R 88LMrfHqr+CzsYHe
D+m78HDu1rjA2n5w6fliWFxb2YVFlkPeUFl7TKIhF5QZFQRy46WqAo6HuCpf pA17JcnQESqsuijT
/8150TYos+Gclp9/zbnZ9GuJWhBuNo6+aNUGZTFUKIMkDsLN3hneNk3rcBRx dKsJoUIj45sGaB3o
zf41M6BV+H6coFQy9qzb6u1vVZXsYiCeDhXRclFfpVmQ2McV3QfE+6friucB 41HjXxo6eFoV7k6u
jPpo4WipxafkC0ln8/T4JU6XCQ5JunDZNCVRjOMsnS9xuE/nCxzmKSGOLtKl o0ssmuJIopRMnU4I
BjMXxJ6MR+6/WCuFj1pEkjgiJIni5Soim6XEXxod1MpwcH9+78cFf7X+Ddwb VeOTKHz2H1BLAQIU
ABQAAgAIAAyHFjlvqKPw4wAAAGQBAAASAAAAAAAAAAAAIAC0gQAAAABTb3Vy Y2UvSW1wMlRYVC5w
cmdQSwECFAAUAAIACACVhRY5sTPIsR4JAAB1JQAAEQAAAAAAAAAAACAAtIET AQAAU291cmNlL0Ns
YXNlcy5wcmdQSwECFAAUAAIACAAwhBY5R3WsKKwBAAB5BQAAEAAAAAAAAAAA ACAAtIFgCgAAU291
cmNlL0Zvcm0xLnByZ1BLAQIUABQAAgAIADCEFjn7rwM3HAIAANsHAAAQAAAA AAAAAAAAIAC0gToM
AABTb3VyY2UvRm9ybTEueGZtUEsBAhQAFAACAAgAm5jQOFKM6STlAgAAvAUA AAsAAAAAAAAAAAAg
ALSBhA4AAEltcDJUWFQueHBqUEsFBgAAAAAFAAUANAEAAJIRAAAAAA==
------=_NextPart_000_008A_01C90478.F1999290--

Attached files Imp2TXT.zip (4.7 KB)Â
Rene Flores
Mensajes: 620
Registrado: Jue Mar 23, 2006 2:39 am

Cantidad en letras

Mensaje por Rene Flores »

Pedro:
matemática que nos dieron de chicos, pero eso de poner "diez euros
> 25/100" me parece muy duro para mi vista.
Jejeje, en Mexico especificamente se utiliza para indicar los centimos
25/100 (veinticinco centimos) especialmente en cantidades numéricas
monetarias.
En otros paises ignoro como se haga para indicar los centimos.
Saludos
Rene Flores
http://www.ciber-tec.com
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Cantidad en letras

Mensaje por jasm.quitaesto »

Rene Flores escribió:
> Pedro:
>
> matemática que nos dieron de chicos, pero eso de poner "diez euros
>> 25/100" me parece muy duro para mi vista.
>
> Jejeje, en Mexico especificamente se utiliza para indicar los centimos
> 25/100 (veinticinco centimos) especialmente en cantidades numéricas
> monetarias.
>
> En otros paises ignoro como se haga para indicar los centimos.
Pues:
diez euros y veinticinco centimos de euro
diez con veinticinco euros
diez euros con veinticinco centimos
Saludos
Alf+.
>
> Saludos
>
> Rene Flores
> http://www.ciber-tec.com
zeasoftware
Mensajes: 1831
Registrado: Mar Oct 11, 2005 9:53 am

Cantidad en letras

Mensaje por zeasoftware »

//---------------------------------------------------------- --------------------
// Recibe un valor numérico y devuelte una cadena traducida a nuevos pesos
Function zNtoStr(nTotal, cDiv)
Local __cResult
LOcal cMonto
Local cCentavos
Local nPeriodo
Local _cTextRes
Local nDigito
Local cUnidad
Local cDecena
Local cCentena
Local cMillar
Local aVals := { "ciento ", "doscientos ", "trescientos ", "cuatrocientos
", "quinientos ",;
"seiscientos ", "setecientos ", "ochocientos ",
"novecientos ",;
"dieci", "veinti", "treinta ", "cuarenta ", "cincuenta
",;
"sesenta ", "setenta ", "ochenta ", "noventa ",;
"un ", "dos ", "tres ", "cuatro ", "cinco ", "seis
","siete ", "ocho ", "nueve " }
Local a2Digs := { "once ", "doce ", "trece ", "catorce ", "quince " }
Local aPeriodos := { "millones ", "mill¢n ", "mil ", "", " five" }
cDiv := If(cDiv == Nil, "P", cDiv)
cMonto := Str(nTotal, 12, 2)
cCentavos := SubStr(cMonto, AT(".", cMonto) + 1)
cMonto := SubStr(cMonto, 1, AT(".", cMonto) - 1)
If ( cDiv == "P" )
_cTextRes := "pesos " + cCentavos + "/100 m.n."
Else
_cTextRes := "Dolares " + cCentavos + "/100"
End
__cResult := "( "
If ( nTotal == 0.00 )
__cResult += "Cero " + _cTextRes + " )"
Return ( __cResult )
End
If ( Int(nTotal) == 0 )
__cResult += "Cero " + _cTextRes + " )"
Return ( __cResult )
End
nDigito := 1
nPeriodo := 2
While ( nDigito <= Len(cMonto) )
cMillar := SubStr(cMonto, nDigito, 1)
cCentena := SubStr(cMonto, nDigito+1, 1)
cUnidad := SubStr(cMonto, nDigito+2, 1)
Do Case
Case SubStr(cMonto, nDigito, 3) = "000"
nDigito += 3
nPeriodo++
Loop
Case cMillar $ " 0"
//Case cCentena $ " 0"
Case cMillar $ "1"
If !( cCentena $ "0" )
__cResult += aVals[1]
Else
If cUnidad $ "0"
__cResult += "cien "
Else
__cResult += aVals[1]
EndIf
EndIf
Case cMillar $ "23456789"
__cResult += aVals[Val(cMillar)]
EndCase
Do Case
Case cCentena $ "0"
If ( cUnidad $ "0" )
__cResult += aPeriodos[nPeriodo]
Else
If ( nPeriodo == 2 )
__cResult += aVals[18+Val(cUnidad)] + aPeriodos[nPeriodo-1]
Else
__cResult += aVals[18+Val(cUnidad)] + aPeriodos[nPeriodo]
End
EndIf
Case cCentena $ " "
If !( cUnidad $ " " )
If ( nDigito == 2 .AND. cUnidad $ "1" )
__cResult += aVals[18 + Val(cUnidad)] + aPeriodos[nPeriodo]
///"mil "
Else
If ( nPeriodo == 2 .AND. cUnidad <> "1" )
__cResult += aVals[18 + Val(cUnidad)] +
aPeriodos[nPeriodo-1] ///"mil "
Else
__cResult += aVals[18 + Val(cUnidad)] +
aPeriodos[nPeriodo]
End
EndIf
EndIf
Case cCentena $ "1"
If cUnidad $ "0"
__cResult += "diez "
Else
If cUnidad $ "12345"
__cResult += a2Digs[Val(cUnidad)]
Else
__cResult += aVals[10] + aVals[18 + Val(cUnidad)]
EndIf
EndIf
If ( nPeriodo == 2 )
__cResult += aPeriodos[nPeriodo-1]
Else
__cResult += aPeriodos[nPeriodo]
End
Case cCentena $ "2"
If cUnidad $ "0"
__cResult += "veinte "
Else
__cResult += aVals[11] + aVals[18 + Val(cUnidad)]
EndIf
If ( nPeriodo == 2 )
__cResult += aPeriodos[nPeriodo-1]
Else
__cResult += aPeriodos[nPeriodo]
End
Case cCentena $ "3456789"
If cUnidad $ "0"
__cResult += aVals[9+Val(cCentena)]
Else
__cResult += aVals[9+Val(cCentena)]+ "y
"+aVals[18+Val(cUnidad)]
EndIf
If ( nPeriodo == 2 )
__cResult += aPeriodos[nPeriodo-1]
Else
__cResult += aPeriodos[nPeriodo]
End
EndCase
nDigito += 3
nPeriodo++
EndDo
__cResult += _cTextRes + " )"
Return ( __cResult )
//---------------------------------------------------------- --------------------
--
Ramón Zea
01.993.231-62-29
http://www.paginasprodigy.com/zeasoftware/
zeasoftware@prodigy.net.mx
zeasoftware@hotmail.com
ramonzea@yahoo.com
zeasoft.movil@hotmail.com
dirza_com@hotmail.com
Responder