Commit 04f372f42db6056cd30fa3e0317e1afe01ccd0ce

Authored by Erickson Silva
1 parent 0b1d2c96
Exists in master and in 1 other branch devel

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]
... ...