Commit 2e84c19e106cbf855b1ed153080cb6638fd2a666
1 parent
840afa0e
Exists in
master
and in
1 other branch
Adiciona conversor de numeros por extenso
Showing
1 changed file
with
144 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,144 @@ |
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Autor: Erickson Silva | |
| 3 | + | |
| 4 | +import sys | |
| 5 | +from unicodedata import normalize | |
| 6 | +from Iterator import * | |
| 7 | + | |
| 8 | +num = {"zero":0, "um":1, "dois":2, "tres":3, "quatro":4, "cinco":5, "seis":6, | |
| 9 | +"sete":7, "oito":8, "nove":9} | |
| 10 | + | |
| 11 | +und = {"mil":1000, "milhao":1000000, "bilhao":1000000000, "trilhao":1000000000000} | |
| 12 | + | |
| 13 | +ext = [{"um":"1", "dois":"2", "tres":"3", "quatro":"4", "cinco":"5", "seis":"6", | |
| 14 | +"sete":"7", "oito":"8", "nove":"9", "dez":"10", "onze":"11", "doze":"12", | |
| 15 | +"treze":"13", "quatorze":"14", "quinze":"15", "dezesseis":"16", | |
| 16 | +"dezessete":"17", "dezoito":"18", "dezenove":"19"}, {"vinte":"2", "trinta":"3", | |
| 17 | +"quarenta":"4", "cinquenta":"5", "sessenta":"6", "setenta":"7", "oitenta":"8", | |
| 18 | +"noventa":"9"}, {"cento":"1", "cem":"1", "duzentos":"2", "trezentos":"3", | |
| 19 | +"quatrocentos":"4", "quinhentos":"5", "seissentos":"6", "setessentos":"7", | |
| 20 | +"oitocentos":"8", "novecentos":"9"}] | |
| 21 | + | |
| 22 | +unds = {"mil":"000", "milhao":"000000","milhoes":"000000", "bilhao":"000000000","bilhoes":"000000000", "trilhao":"000000000000", "trilhoes":"000000000000"} | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | +def oneDigit(x): | |
| 27 | + return ext[0][x] | |
| 28 | + | |
| 29 | +def twoDigit(x): | |
| 30 | + try: | |
| 31 | + return ext[1][x[0]]+ext[0][x[1]] | |
| 32 | + except: | |
| 33 | + return ext[1][x[0]]+"0" | |
| 34 | + | |
| 35 | +def threeDigit(x): | |
| 36 | + return ext[2][x[0]]+ext[1][x[1]]+ext[0][x[2]] | |
| 37 | + | |
| 38 | +def extenso2(n): | |
| 39 | + sn = n.split(",") | |
| 40 | + size = len(sn) | |
| 41 | + firstWord = sn[0] | |
| 42 | + endWord = "" | |
| 43 | + numExt = "" | |
| 44 | + | |
| 45 | + if(unds.has_key(sn[size-1])): | |
| 46 | + size -= 1 | |
| 47 | + endWord = sn[size] | |
| 48 | + del sn[size] | |
| 49 | + | |
| 50 | + if(ext[0].has_key(firstWord)): | |
| 51 | + numExt = oneDigit(firstWord) | |
| 52 | + | |
| 53 | + elif (ext[1].has_key(firstWord)): | |
| 54 | + numExt = twoDigit(sn) | |
| 55 | + | |
| 56 | + elif (ext[2].has_key(firstWord)): | |
| 57 | + if(size == 1): | |
| 58 | + numExt = ext[2][firstWord]+"00" | |
| 59 | + elif (size == 2): | |
| 60 | + if(sn[1] == "dez"): | |
| 61 | + numExt = ext[2][firstWord]+oneDigit(sn[1]) | |
| 62 | + try: | |
| 63 | + numExt = ext[2][firstWord]+"0"+oneDigit(sn[1]) | |
| 64 | + except: | |
| 65 | + numExt = ext[2][firstWord]+twoDigit([sn[1]]) | |
| 66 | + else: | |
| 67 | + numExt = threeDigit(sn) | |
| 68 | + | |
| 69 | + if(endWord != ""): | |
| 70 | + numExt = numExt+unds[endWord] | |
| 71 | + | |
| 72 | + return numExt | |
| 73 | + | |
| 74 | +def extenso(extenso): | |
| 75 | + global newToken, auxToken | |
| 76 | + extensoQuebrado = extenso.split(" ") | |
| 77 | + nums = [] | |
| 78 | + it = Iterator() | |
| 79 | + it.load(extensoQuebrado) | |
| 80 | + while(it.hasNext()): | |
| 81 | + token = simplifica(it.getToken()) | |
| 82 | + tokenAnterior = simplifica(it.getToken('-')) | |
| 83 | + if (und.has_key(token)): | |
| 84 | + #print "cond1" | |
| 85 | + if(it.getCount() == 0): | |
| 86 | + #print "cond2" | |
| 87 | + nums.append(und[token]) | |
| 88 | + else: | |
| 89 | + #print "cond3" | |
| 90 | + newToken = und[token] * int(nums[-1]) | |
| 91 | + nums[-1] = newToken | |
| 92 | + else: | |
| 93 | + #print "cond4" | |
| 94 | + if (num.has_key(token)): | |
| 95 | + #print "cond5" | |
| 96 | + auxToken = num[token] | |
| 97 | + elif (not und.has_key(token)): | |
| 98 | + #print "cond6" | |
| 99 | + auxToken = extenso2(token) | |
| 100 | + | |
| 101 | + if((not und.has_key(tokenAnterior)) and it.getCount() > 0): | |
| 102 | + #print "cond7" | |
| 103 | + newToken = int(auxToken) + int(nums[-1]) | |
| 104 | + nums[-1] = newToken | |
| 105 | + else: | |
| 106 | + #print "cond8" | |
| 107 | + nums.append(auxToken) | |
| 108 | + | |
| 109 | + return soma(nums) | |
| 110 | + | |
| 111 | +def soma(lista): | |
| 112 | + soma = 0 | |
| 113 | + for i in lista: | |
| 114 | + soma += int(i) | |
| 115 | + return soma | |
| 116 | + | |
| 117 | +def simplifica(txt): | |
| 118 | + | |
| 119 | + newToken = "" | |
| 120 | + try: | |
| 121 | + newToken = normalize('NFKD', txt.decode('utf-8')).encode('ASCII','ignore') | |
| 122 | + except: | |
| 123 | + newToken = normalize('NFKD', txt.decode('iso-8859-1')).encode('ASCII','ignore') | |
| 124 | + | |
| 125 | + if(newToken[-3:] == "oes"): return newToken[:-3] + "ao" | |
| 126 | + return newToken | |
| 127 | + | |
| 128 | + | |
| 129 | +if __name__ == '__main__': | |
| 130 | + n = sys.argv[1] | |
| 131 | + print extenso(n) | |
| 132 | + '''arquivoExts = open('exts', 'r') | |
| 133 | + listaExts = arquivoExts.readlines() | |
| 134 | + arquivoNums = open('nums', 'r') | |
| 135 | + listaNums = arquivoNums.readlines() | |
| 136 | + for i in range(0,500): | |
| 137 | + n = listaNums[i].replace("\n","") | |
| 138 | + e = listaExts[i].replace("\n","") | |
| 139 | + numNew = extenso(e) | |
| 140 | + if (str(numNew) != n): | |
| 141 | + print n + " != " + str(numNew) | |
| 142 | + #else: | |
| 143 | + # print "OK: " + n + " == " + str(numNew)''' | |
| 144 | + | ... | ... |