Ahora como pueden ver en mi evidente cambio a Python he reescrito el código que convierte de números a letras en esto (70 lineas de codigo menos que en Java y mas facil de entender):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | UNIDADES = ( '', 'UN ', 'DOS ', 'TRES ', 'CUATRO ', 'CINCO ', 'SEIS ', 'SIETE ', 'OCHO ', 'NUEVE ', 'DIEZ ', 'ONCE ', 'DOCE ', 'TRECE ', 'CATORCE ', 'QUINCE ', 'DIECISEIS ', 'DIECISIETE ', 'DIECIOCHO ', 'DIECINUEVE ', 'VEINTE ' ) DECENAS = ( 'VENTI', 'TREINTA ', 'CUARENTA ', 'CINCUENTA ', 'SESENTA ', 'SETENTA ', 'OCHENTA ', 'NOVENTA ', 'CIEN ' ) CENTENAS = ( 'CIENTO ', 'DOSCIENTOS ', 'TRESCIENTOS ', 'CUATROCIENTOS ', 'QUINIENTOS ', 'SEISCIENTOS ', 'SETECIENTOS ', 'OCHOCIENTOS ', 'NOVECIENTOS ' ) def toWord(number): """ Converts a number into string representation """ converted = '' if not (0 < number < 999999999): return 'No es posible convertir el numero a letras' number_str = str(number).zfill(9) millones = number_str[:3] miles = number_str[3:6] cientos = number_str[6:] if(millones): if(millones == '001'): converted += 'UN MILLON ' elif(int(millones) > 0): converted += '%sMILLONES ' % __convertNumber(millones) if(miles): if(miles == '001'): converted += 'MIL ' elif(int(miles) > 0): converted += '%sMIL ' % __convertNumber(miles) if(cientos): if(cientos == '001'): converted += 'UN ' elif(int(cientos) > 0): converted += '%s ' % __convertNumber(cientos) converted += 'PESOS' return converted.title() def __convertNumber(n): """ Max length must be 3 digits """ output = '' if(n == '100'): output = "CIEN " elif(n[0] != '0'): output = CENTENAS[int(n[0])-1] k = int(n[1:]) if(k <= 20): output += UNIDADES[k] else: if((k > 30) & (n[2] != '0')): output += '%sY %s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])]) else: output += '%s%s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])]) return output |

te complicas demasiado usa diccionarios y esto sera mas facil
Armando, como podria ser eso??, si me explicas un poco lo puedo mejorar
Para una tarea de la u me están pidiendo lo mismo que escribiste… pero debo reconocer que no entendí lo que hiciste después de definir los números…
De todos modos, muchas gracias porque sirve para tomar una orientación =)
Hola Naty, puedes decirme que lineas no entiendes y miramos.
Saludos
Tu código está muy bien pero no contempla decimales. Le hice una pequeña modificación, agregándole una varialble que permite generar el texto como pesos o sólo como una cantidad.
UNIDADES = (
”,
‘UN ‘,
‘DOS ‘,
‘TRES ‘,
‘CUATRO ‘,
‘CINCO ‘,
‘SEIS ‘,
‘SIETE ‘,
‘OCHO ‘,
‘NUEVE ‘,
‘DIEZ ‘,
‘ONCE ‘,
‘DOCE ‘,
‘TRECE ‘,
‘CATORCE ‘,
‘QUINCE ‘,
‘DIECISEIS ‘,
‘DIECISIETE ‘,
‘DIECIOCHO ‘,
‘DIECINUEVE ‘,
‘VEINTE ‘
)
DECENAS = (
‘VENTI’,
‘TREINTA ‘,
‘CUARENTA ‘,
‘CINCUENTA ‘,
‘SESENTA ‘,
‘SETENTA ‘,
‘OCHENTA ‘,
‘NOVENTA ‘,
‘CIEN ‘
)
CENTENAS = (
‘CIENTO ‘,
‘DOSCIENTOS ‘,
‘TRESCIENTOS ‘,
‘CUATROCIENTOS ‘,
‘QUINIENTOS ‘,
‘SEISCIENTOS ‘,
‘SETECIENTOS ‘,
‘OCHOCIENTOS ‘,
‘NOVECIENTOS ‘
)
def toWord(number_in, pesos=True):
“”"
Converts a number into string representation
“”"
converted = ”
if type(number_in) ‘str’:
number = str(number_in)
else:
number = number_in
number = number.replace(“,”,”")
try:
number_int, number_dec = number.split(“.”)
except ValueError:
number_int = number
number_dec = “”
if not (0 < __convertStr(number_int) 0):
converted += ‘%sMILLONES ‘ % __convertNumber(millones)
if(miles):
if(miles == ’001′):
converted += ‘MIL ‘
elif(int(miles) > 0):
converted += ‘%sMIL ‘ % __convertNumber(miles)
if(cientos):
if(cientos == ’001′):
converted += ‘UN’
elif(int(cientos) > 0):
converted += ‘%s’ % __convertNumber(cientos)
if pesos:
if number_dec == “”:
number_dec = “00″
converted += ‘PESOS ‘ + number_dec + “/100 M.N.”
else:
if number_dec “”:
converted += ‘PUNTO ‘ + toWord(number_dec,False)
return converted.title()
def __convertNumber(n):
“”"
Max length must be 3 digits
“”"
output = ”
if(n == ’100′):
output = “CIEN ”
elif(n[0] != ’0′):
output = CENTENAS[int(n[0])-1]
k = int(n[1:])
if(k 30) & (n[2] != ’0′)):
output += ‘%sY %s’ % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
else:
output += ‘%s%s’ % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
return output
def __convertStr(s):
“”"Convert string to either int or float.”"”
try:
ret = int(s)
except ValueError:
#Try float.
ret = float(s)
return ret
Nueva actualizacion en http://axiacore.com/blog/2008/10/convertir-numeros-y-decimales-a-letras-python/
Bueno y como hago que funcione ese codigo??
Pues lo ejecutas o llamas desde algun metodo de donde lo quieras usar, no tiene mucha ciencia
Por ejemplo lo copio a algun archivo.py y doble click o que….
Tengo 2 dias de estar viendo cosas de Python asi que no se extrañen de mi novatez.
David, guardalo en un archivo .py y al final del codigo haces una funcion __main__ y colocas algo que llame a la funcion toWord(numero) y le mandas un numero como parametro e imprimes lo que trae de vuelta algo como:
print toWord(21234)
Lo ejecutas desde una consola linux con ./archivo.py
Saludos
Ya lo logre hacer funcionar, y pues yo estoy trabajando en windows y en serio vengo empezando con esto de Python y pues agradezco que hayas respondido…una preguntita como harias la modificacion para que use numeros negativos?
ola nececito saber como enpieso? xq queria aser un traductor de idiomas (ingles a español ) de pokas palabras ( 10) para enpezar bueno eso era porfavor ayudenme grax de antemano
zertex
yo logre aser uno (no se si publicarlo)
hola, he realizado unos cambios en un programa (openerp) y me da un error si ustedes pueden ayudarme.
error
Fri, 22 May 2009 18:40:04 ERROR:orm:Programming error: field ‘amount_to_text’ does not exist in object ‘account.invoice’ !
Fri, 22 May 2009 18:40:04 ERROR:report:report account.invoice:
Traceback (most recent call last):
File “/usr/local/lib/python2.5/site-packages/tinyerp-server/report/report_sxw.py”, line 180, in _eval
try:
File “”, line 1, in
File “/usr/local/lib/python2.5/site-packages/tinyerp-server/addons/account/report/invoice.py”, line 40, in obt_texto
res = amount_to_text(cantidad) #debes implentar esta funcion
NameError: global name ‘amount_to_text’ is not defined
global name ‘amount_to_text’ is not defined
expr: obt_texto(o.amount_to_text)
Muy buen aporte. solo una duda, lo tendras en PHP?
Es posible utilizar parte de tu código en un programa licenciado bajo GPL?
Claro que si, solo asegurate de mencionarnos en alguna parte
Claro que sí.
Agregaré una línea como esta:
Copyright © 2008 Camilo Nova
Me gustaria saber si los datos son correctos, y si puedes darme tu correo para incluirlo sería perfecto.
Saludos y Gracias.
Copyright © 2008 AxiaCore S.A.S. – info@axiacore.com – http://axiacore.com
permetame hacer una pregunta muy simple de tipo matematico seguro:
he no comprendido que significa : k =int(n[1:])
si pongamo n =220
cuales seria el resultado de k?
gracias por tu ayuda.
Hola, el resultado de k, par n=220 es de 20
Revisa ‘slicing’ en la documentación de python.
Saludos