Descripción
aLetras(numero) es una función a la que se le pasa un valor númerico y regresa un string con el valor numérico convertido a letras.
Los valores que pueden ser convertidos pertenecen al rango -999.999.999,99 : 999.999.999,99. Si se proporciona una cadena fuera de rango, retorna el string "0".
Siempre se trabaja con 2 decimales (se redondean los valores suministrados)
Ejemplos:
>>> aLetras(1234.56) ' MIL DOSCIENTOS TREINTA Y CUATRO CON CINCUENTA Y SEIS CENTAVOS' >>> aLetras(-240.99) 'MENOS DOSCIENTOS CUARENTA CON NOVENTA Y NUEVE CENTAVOS' >>> aLetras(100) 'CIEN' >>> aLetras(401201501.01) 'CUATROCIENTOS UN MILLON DOSCIENTOS UN MIL QUINIENTOS UNO CON UN CENTAVOS' >>> aLetras(-0.76) 'MENOS CERO CON SETENTA Y SEIS CENTAVOS' >>> aLetras(1000000000) '0'
Observaciones
La asignación y condicional en una línea -> numeros[1] = "UNO" if i == 2 else "UN" <- da problemas de sintaxis con versiones anteriores a Python 2.5.x
Puede reemplazarse con:
Código:
#fuente: Recetario de PyAR, http://python.com.ar/moin/Recetario #autor: Cesar E Portela #date: 06-05-2008 #version: 2 #para Python: 2.5.x def aLetras(numero): numeros = {0:"CERO",2:"DOS",3:"TRES",4:"CUATRO",5:"CINCO",6:"SEIS",7:"SIETE",8:"OCHO",9:"NUEVE", 10:"DIEZ",11:"ONCE",12:"DOCE",13:"TRECE",14:"CATORCE",15:"QUINCE",16:"DIECISEIS",17:"DIECISIETE", 18:"DIECIOCHO",19:"DIECINUEVE",20:"VEINTE",30:"TREINTA", 40:"CUARENTA",50:"CINCUENTA",60:"SESENTA",70:"SETENTA",80:"OCHENTA",90:"NOVENTA",100:"CIEN", 500:"QUINIENTOS ",700:"SETECIENTOS ",900:"NOVECIENTOS "} if abs(numero) > 999999999.99 : #mil millones, esta funcion procesa el rango [-999.999.999,99; 999.999.999,99] return ("0", 0) elif numero < 0: cadena = "MENOS " else: cadena = "" #separo el numero entregado entre parte entera y sus decimales (tomando solo 2 y redondeando para arriba) entero = int(abs(numero)) decimales = int((round(abs(numero), 2) + 0.001) * 100) % 100 #la parte entera es separada en grupos de tres digitos grupo1 = int(entero / 1000000) grupo2 = int((int(entero) - int(grupo1)*1000000)/1000) grupo3 = int(entero % 1000) lista = [grupo1, grupo2, grupo3, decimales] if (grupo1 + grupo2 + grupo3) == 0: cadena += numeros[0] for i in xrange(4): unidad = lista[i] % 10 decena = lista[i] % 100 centena = (lista[i] / 100) % 10 subcadena = "" numeros[1] = "UNO" if i == 2 else "UN" if i == 0: #grupo 1: el de los millones if decena == 1: subcadena = " MILLON " elif lista[i] > 1: subcadena = " MILLONES " else: #aqui se entra si lista[i] == 0 y en ese caso, no hay nada que procesar continue #se sigue con la siguiente iteracion del bucle elif i == 1: #grupo2: el de los miles if lista[i] == 1: cadena += " MIL " continue #se pasa a la siguiente iteracion elif lista[i] > 1: subcadena = " MIL " else: #aqui se entra si lista[i] == 0 y en ese caso, no hay nada que procesar continue #se sigue con la siguiente iteracion del bucle elif i == 3 and lista[i] != 0: #grupo4: el de los centavos (decimales) cadena += " CON " subcadena = " CENTAVOS" if centena != 0: if centena == 1 and (unidad + decena) == 0: cadena += numeros[100] continue elif centena == 1: cadena += "CIENTO " elif centena == 5: cadena += numeros[500] elif centena == 7: cadena += numeros[700] elif centena == 9: cadena += numeros[900] else: cadena += numeros[centena] + "CIENTOS " if decena != 0: if decena < 21: cadena += numeros[decena] elif decena < 30: cadena += "VENTI"+numeros[unidad] else: cadena += numeros[(decena/10)*10] if unidad > 0: cadena += " Y "+numeros[unidad] cadena += subcadena return cadena
Autor / Autores:
CesarPortela