Skip to content

Instantly share code, notes, and snippets.

@eneldoserrata
Created August 25, 2014 23:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eneldoserrata/1b8a14feca66a3b52b0f to your computer and use it in GitHub Desktop.
Save eneldoserrata/1b8a14feca66a3b52b0f to your computer and use it in GitHub Desktop.
numbers to letters
from itertools import ifilter
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 '
)
MONEDAS = (
{'country': u'Colombia', 'currency': 'COP', 'singular': u'PESO COLOMBIANO', 'plural': u'PESOS COLOMBIANOS', 'symbol': u'$'},
{'country': u'Estados Unidos', 'currency': 'USD', 'singular': u'DÓLAR', 'plural': u'DÓLARES', 'symbol': u'US$'},
{'country': u'Europa', 'currency': 'EUR', 'singular': u'EURO', 'plural': u'EUROS', 'symbol': u'€'},
{'country': u'México', 'currency': 'MXN', 'singular': u'PESO MEXICANO', 'plural': u'PESOS MEXICANOS', 'symbol': u'$'},
{'country': u'Perú', 'currency': 'PEN', 'singular': u'NUEVO SOL', 'plural': u'NUEVOS SOLES', 'symbol': u'S/.'},
{'country': u'Reino Unido', 'currency': 'GBP', 'singular': u'LIBRA', 'plural': u'LIBRAS', 'symbol': u'£'},
{'country': u'Republica Dominicana', 'currency': 'pesos', 'singular': u'peso', 'plural': u'pesos', 'symbol': u'RD'}
)
# Para definir la moneda me estoy basando en los código que establece el ISO 4217
# Decidí poner las variables en inglés, porque es más sencillo de ubicarlas sin importar el país
# Si, ya sé que Europa no es un país, pero no se me ocurrió un nombre mejor para la clave.
def to_word(number, mi_moneda=None):
if mi_moneda != None:
try:
moneda = ifilter(lambda x: x['currency'] == mi_moneda, MONEDAS).next()
if number < 2:
moneda = moneda['singular']
else:
moneda = moneda['plural']
except:
return u"Tipo de moneda inválida"
else:
moneda = ""
"""Converts a number into string representation"""
converted = ''
if not (0 < number < 999999999):
return 'No es posible convertir el numero a letras'
if "." in str(number):
number, decimal = str(number).split(".")
else:
number = str(number)
decimal = "00"
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 ' % __convert_group(millones)
if(miles):
if(miles == '001'):
converted += 'MIL '
elif(int(miles) > 0):
converted += '%sMIL ' % __convert_group(miles)
if(cientos):
if(cientos == '001'):
converted += 'UN '
elif(int(cientos) > 0):
converted += '%s' % __convert_group(cientos)
#converted += moneda
if decimal:
decimal = "con %s%s" % (decimal, "/100")
converted += decimal
converted = "%s%s%s" % ("*** ", converted, " ***")
return converted.upper()
def __convert_group(n):
"""Turn each group of numbers into letters"""
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment