Tradutor: Numero para Moeda 'Real'
Código para conversão de número para moeda 'real'. Adaptado a partir do código: http://www.python.org.br/wiki/NumeroParaPalavrasPortugues
Código
# -*- coding: utf-8 -*-
# Autor: Fabiano Weimar dos Santos (xiru)
# Correcao em 20080407: Gustavo Henrique Cervi (100:"cento") => (1:"cento')
# Correcao em 20100311: Luiz Fernando B. Vital adicionado {0:""} ao ext[0], pois dava KeyError: 0 em números como 200, 1200, 300, etc.
# Modificação para tradução de moeda
import sys
ext = [{1:"um", 2:"dois", 3:"três", 4:"quatro", 5:"cinco", 6:"seis", 7:"sete", 8:"oito", 9:"nove", 10:"dez", 11:"onze", 12:"doze",13:"treze", 14:"quatorze", 15:"quinze",
16:"dezesseis", 17:"dezessete", 18:"dezoito", 19:"dezenove"},
{2:"vinte", 3:"trinta", 4:"quarenta", 5:"cinquenta", 6:"sessenta", 7:"setenta", 8:"oitenta", 9:"noventa"},
{1:"cento", 2:"duzentos", 3:"trezentos", 4:"quatrocentos", 5:"quinhentos", 6:"seissentos", 7:"setessentos", 8:"oitocentos", 9:"novecentos"}]
und = ['', ' mil', (' milhão', ' milhões'), (' bilhão', ' bilhões'), (' trilhão', ' trilhões')]
def cent(s, grand):
s = '0' * (3 - len(s)) + s
if s == '000':
return ''
if s == '100':
return 'cem'
ret = ''
dez = s[1] + s[2]
if s[0] != '0':
ret += ext[2][int(s[0])]
if dez != '00':
ret += ' e '
else:
return ret + (type(und[grand]) == type(()) and (int(s) > 1 and und[grand][1] or und[grand][0]) or und[grand])
if int(dez) < 20:
ret += ext[0][int(dez)]
else:
if s[1] != '0':
ret += ext[1][int(s[1])]
if s[2] != '0':
ret += ' e ' + ext[0][int(s[2])]
return ret + (type(und[grand]) == type(()) and (int(s) > 1 and und[grand][1] or und[grand][0]) or und[grand])
def extenso(reais,centavos):
ret = []
grand = 0
if (int(centavos)==0):
ret.append('zero centavos')
elif (int(centavos)==1):
ret.append('um centavo')
else:
ret.append(cent(centavos,0)+' centavos')
if (int(reais)==0):
ret.append('zero reais')
ret.reverse()
return ' e '.join([r for r in ret if r])
elif (int(reais)==1):
ret.append('um real')
ret.reverse()
return ' e '.join([r for r in ret if r])
while reais:
s = reais[-3:]
reais = reais[:-3]
if (grand == 0):
ret.append(cent(s, grand)+' reais')
else:
ret.append(cent(s, grand))
grand += 1
ret.reverse()
return ' e '.join([r for r in ret if r])
if __name__ == '__main__':
n = sys.argv[1]
try:
reais,centavos = n.split(',')
except:
print 'Erro ao parsear o numero informado!'
if (len(centavos)!=2):
print 'Valor incorreto na casa dos centavos!'
sys.exit(1)
print n
print extenso(reais,centavos)


