Implementamos tecnologia y es asi como lo hacemos

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
Bookmark and Share

20 Responses to “Convertir Numeros a Letras Python”

  1. armando Says:
    Septiembre 13th, 2008 at 4:30 PM

    te complicas demasiado usa diccionarios y esto sera mas facil

  2. Camilo Nova Says:
    Septiembre 14th, 2008 at 10:13 AM

    Armando, como podria ser eso??, si me explicas un poco lo puedo mejorar

  3. Naty Says:
    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 =)

  4. Camilo Nova Says:
    Septiembre 30th, 2008 at 6:50 PM

    Hola Naty, puedes decirme que lineas no entiendes y miramos.

    Saludos

  5. Ulfang Says:
    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

  6. Camilo Nova Says:
    Octubre 16th, 2008 at 12:46 PM

    Nueva actualizacion en http://axiacore.com/blog/2008/10/convertir-numeros-y-decimales-a-letras-python/

  7. David Says:
    Enero 21st, 2009 at 7:06 PM

    Bueno y como hago que funcione ese codigo??

  8. Camilo Nova Says:
    Enero 21st, 2009 at 8:25 PM

    Pues lo ejecutas o llamas desde algun metodo de donde lo quieras usar, no tiene mucha ciencia

  9. David Says:
    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.

  10. Camilo Nova Says:
    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

  11. David Says:
    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?

  12. zertex Says:
    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

  13. zertex Says:
    Marzo 22nd, 2009 at 11:54 AM

    yo logre aser uno (no se si publicarlo)

  14. cesar Says:
    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)

  15. furiaroa Says:
    Enero 25th, 2010 at 11:18 PM

    Muy buen aporte. solo una duda, lo tendras en PHP?

  16. Alfonso Says:
    Febrero 27th, 2010 at 11:46 PM

    Es posible utilizar parte de tu código en un programa licenciado bajo GPL?

  17. Camilo Nova Says:
    Febrero 28th, 2010 at 7:59 AM

    Claro que si, solo asegurate de mencionarnos en alguna parte :P

  18. Alfonso Says:
    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.

  19. Camilo Nova Says:
    Febrero 28th, 2010 at 12:56 PM

    Copyright © 2008 AxiaCore S.A.S. – info@axiacore.comhttp://axiacore.com

Trackbacks & Pingbacks

  1. [...] de un post anterior sobre convertir numeros a letras en python me ha llegado una modificacion de Ulfang que les presento a [...]

    Pingback por Convertir numeros y decimales a letras Python | AxiaCore Blog - Octubre 16th, 2008 at 12:43 PM

Deja un comentario

AxiaCore Blog

Publicidad

Etiquetas

Nosotros Leemos

Comentarios Recientes:

  • NMarthacecilia: Hola .yo tambien lo conoci en un momento pequeño ,en la fundación molano, es de mi interes volver a...
  • Jorge Chávez: Algo que me ha interesado en los últimos días es intentar agregar nuevos widgets en el filtro, que...
  • Jorge Chávez: Excelente post! Sin duda los filtros son un problema con la falta de documentación oficial, pero en lo...
  • CBTIS_102: pzz la vdd python es un programa muy completo y facil, pero a veces los que enseñan python son pesimos,...
  • katerine: CORIDAL SALUDO, ES HERMOSA ESTA LABOR. ME ENCANTARIA SABER LOS DATOS DE LA FUNDACION PARA ACERCARME A...

Enlaces Recientes:

Archivo

Admin