Commit 04f372f42db6056cd30fa3e0317e1afe01ccd0ce
1 parent
0b1d2c96
Exists in
master
and in
1 other branch
Corrige conversor de números romanos
Showing
2 changed files
with
41 additions
and
21 deletions
Show diff stats
src/AplicaRegras.py
| ... | ... | @@ -399,8 +399,11 @@ class AplicaRegras(object): |
| 399 | 399 | tag = it.get_ticket() |
| 400 | 400 | |
| 401 | 401 | if tag == "NUM": |
| 402 | - num_romano = roman_to_int(it.get_word()) | |
| 403 | - lista_simplificada[it.get_count()] = [num_romano.decode('utf-8'), 'NUM-R'] | |
| 402 | + try: | |
| 403 | + num_romano = roman_to_int(it.get_word().encode('utf-8')) | |
| 404 | + lista_simplificada[it.get_count()] = [num_romano.decode('utf-8'), 'NUM-R'] | |
| 405 | + except: | |
| 406 | + pass | |
| 404 | 407 | num = True |
| 405 | 408 | |
| 406 | 409 | if tag[-2:] == "-P" or tag[-2:] == "_P" and self.verificar_excecao_plural(it.get_word()): | ... | ... |
src/ConverteExtenso.py
| ... | ... | @@ -25,28 +25,45 @@ ext = [{"um":"1", "dois":"2", "tres":"3", "quatro":"4", "cinco":"5", "seis":"6", |
| 25 | 25 | und = {"mil":1000, "milhao":1000000, "bilhao":1000000000, "trilhao":1000000000000} |
| 26 | 26 | unds = {"mil":"000", "milhao":"000000","milhoes":"000000", "bilhao":"000000000","bilhoes":"000000000", "trilhao":"000000000000", "trilhoes":"000000000000"} |
| 27 | 27 | |
| 28 | -numeral_map = zip( | |
| 29 | - (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1), | |
| 30 | - ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I') | |
| 31 | -) | |
| 32 | - | |
| 33 | -def int_to_roman(i): | |
| 28 | +def int_to_roman(input): | |
| 29 | + if not isinstance(input, type(1)): | |
| 30 | + raise TypeError, "expected integer, got %s" % type(input) | |
| 31 | + if not 0 < input < 4000: | |
| 32 | + raise ValueError, "Argument must be between 1 and 3999" | |
| 33 | + ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) | |
| 34 | + nums = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I') | |
| 34 | 35 | result = [] |
| 35 | - for integer, numeral in numeral_map: | |
| 36 | - count = int(i / integer) | |
| 37 | - result.append(numeral * count) | |
| 38 | - i -= integer * count | |
| 39 | - return ''.join(result) | |
| 40 | 36 | |
| 41 | -def roman_to_int(n): | |
| 42 | - n = unicode(n).upper() | |
| 37 | + for i in range(len(ints)): | |
| 38 | + count = int(input / ints[i]) | |
| 39 | + result.append(nums[i] * count) | |
| 40 | + input -= ints[i] * count | |
| 41 | + return ''.join(result) | |
| 43 | 42 | |
| 44 | - i = result = 0 | |
| 45 | - for integer, numeral in numeral_map: | |
| 46 | - while n[i:i + len(numeral)] == numeral: | |
| 47 | - result += integer | |
| 48 | - i += len(numeral) | |
| 49 | - return str(result) | |
| 43 | +def roman_to_int(input): | |
| 44 | + if not isinstance(input, type("")): | |
| 45 | + raise TypeError, "expected string, got %s" % type(input) | |
| 46 | + input = input.upper( ) | |
| 47 | + nums = {'M':1000, | |
| 48 | + 'D':500, | |
| 49 | + 'C':100, | |
| 50 | + 'L':50, | |
| 51 | + 'X':10, | |
| 52 | + 'V':5, | |
| 53 | + 'I':1} | |
| 54 | + sum = 0 | |
| 55 | + for i in range(len(input)): | |
| 56 | + try: | |
| 57 | + value = nums[input[i]] | |
| 58 | + if i+1 < len(input) and nums[input[i+1]] > value: | |
| 59 | + sum -= value | |
| 60 | + else: sum += value | |
| 61 | + except KeyError: | |
| 62 | + raise ValueError, 'input is not a valid Roman numeral: %s' % input | |
| 63 | + | |
| 64 | + if int_to_roman(sum) == input: return str(sum) | |
| 65 | + else: | |
| 66 | + raise ValueError, 'input is not a valid Roman numeral: %s' % input | |
| 50 | 67 | |
| 51 | 68 | def oneDigit(x): |
| 52 | 69 | return ext[0][x] | ... | ... |