Convertir Numeros a Letras Python

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

Tags: ,

24 De respuestas a “Convertir Numeros a Letras Python”

  1. armando 13 septiembre, 2008 en 4:30 PM #

    te complicas demasiado usa diccionarios y esto sera mas facil

  2. Camilo Nova 14 septiembre, 2008 en 10:13 AM #

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

  3. Naty 28 septiembre, 2008 en 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 30 septiembre, 2008 en 6:50 PM #

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

    Saludos

  5. Ulfang 15 octubre, 2008 en 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. David 21 enero, 2009 en 7:06 PM #

    Bueno y como hago que funcione ese codigo??

  7. Camilo Nova 21 enero, 2009 en 8:25 PM #

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

  8. David 22 enero, 2009 en 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.

  9. Camilo Nova 22 enero, 2009 en 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

  10. David 22 enero, 2009 en 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?

  11. zertex 22 marzo, 2009 en 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

  12. zertex 22 marzo, 2009 en 11:54 AM #

    yo logre aser uno (no se si publicarlo)

  13. cesar 22 mayo, 2009 en 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)

  14. furiaroa 25 enero, 2010 en 11:18 PM #

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

  15. Alfonso 27 febrero, 2010 en 11:46 PM #

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

  16. Camilo Nova 28 febrero, 2010 en 7:59 AM #

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

  17. Alfonso 28 febrero, 2010 en 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.

  18. Camilo Nova 28 febrero, 2010 en 12:56 PM #

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

  19. bramino 25 julio, 2010 en 12:35 PM #

    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.

  20. Camilo Nova 26 julio, 2010 en 7:30 AM #

    Hola, el resultado de k, par n=220 es de 20

    Revisa ‘slicing’ en la documentación de python.

    Saludos

  21. Andrea 20 febrero, 2011 en 5:38 PM #

    Hola Camilo,

    muchas gracias por tu script, me ahorraste bastante tiempo. Nada más le tuve que hacer una pequeña modificación, para que me diera el este formato de resultado:

    TRECE MIL CUATROCIENTOS CINCUENTA Y SEIS Pesos 60/100 M.N.

    Para lo cual simplemente agregué al principio:


    “”"
    Converts a number into string representation
    “”"
    converted = ”

    number = float(number)
    decimal_part = (“%0.2f” % number)[-2:]

    number = int(number)

    y al final algo así:


    if(cientos):
    if(cientos == ’001′):
    converted += ‘un ‘
    elif(int(cientos) > 0):
    converted += ‘%s ‘ % __convertNumber(cientos)

    return ‘%s Pesos %s/100 M.N.’ % (converted.upper(), decimal_part)

  22. FRANCISCO 11 diciembre, 2011 en 9:44 PM #

    HOLA A TODOS ALGUIEN ME PUEDE EXPLICAR CADA LINEA DE CODIGO PARA QUE SIRVE PORFA…..

Trackbacks / Pingbacks

  1. Convertir numeros y decimales a letras Python | AxiaCore Blog - 16 octubre, 2008

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

Deja una respuesta