Convertir Numeros a Letras Python
Escrito el Septiembre 11, 2008 a las 3:54 PM por Camilo Nova
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 |

Septiembre 13th, 2008 at 4:30 PM
te complicas demasiado usa diccionarios y esto sera mas facil
Septiembre 14th, 2008 at 10:13 AM
Armando, como podria ser eso??, si me explicas un poco lo puedo mejorar
Septiembre 28th, 2008 at 4:06 PM
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 =)
Septiembre 30th, 2008 at 6:50 PM
Hola Naty, puedes decirme que lineas no entiendes y miramos.
Saludos
Octubre 15th, 2008 at 9:55 PM
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
Octubre 16th, 2008 at 12:46 PM
Nueva actualizacion en http://axiacore.com/blog/2008/10/convertir-numeros-y-decimales-a-letras-python/
Enero 21st, 2009 at 7:06 PM
Bueno y como hago que funcione ese codigo??
Enero 21st, 2009 at 8:25 PM
Pues lo ejecutas o llamas desde algun metodo de donde lo quieras usar, no tiene mucha ciencia
Enero 22nd, 2009 at 6:47 PM
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.
Enero 22nd, 2009 at 7:09 PM
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
Enero 22nd, 2009 at 7:17 PM
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?
Marzo 22nd, 2009 at 12:17 AM
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
Marzo 22nd, 2009 at 11:54 AM
yo logre aser uno (no se si publicarlo)
Mayo 22nd, 2009 at 5:46 PM
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)
Enero 25th, 2010 at 11:18 PM
Muy buen aporte. solo una duda, lo tendras en PHP?
Febrero 27th, 2010 at 11:46 PM
Es posible utilizar parte de tu código en un programa licenciado bajo GPL?
Febrero 28th, 2010 at 7:59 AM
Claro que si, solo asegurate de mencionarnos en alguna parte
Febrero 28th, 2010 at 12:37 PM
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.
Febrero 28th, 2010 at 12:56 PM
Copyright © 2008 AxiaCore S.A.S. – info@axiacore.com – http://axiacore.com