initial commit
[text2num.git] / text2num.py
1 import re
2
3 Small = {
4     'zero': 0,
5     'one': 1,
6     'two': 2,
7     'three': 3,
8     'four': 4,
9     'five': 5,
10     'six': 6,
11     'seven': 7,
12     'eight': 8,
13     'nine': 9,
14     'ten': 10,
15     'eleven': 11,
16     'twelve': 12,
17     'thirteen': 13,
18     'fourteen': 14,
19     'fifteen': 15,
20     'sixteen': 16,
21     'seventeen': 17,
22     'eighteen': 18,
23     'nineteen': 19,
24     'twenty': 20,
25     'thirty': 30,
26     'forty': 40,
27     'fifty': 50,
28     'sixty': 60,
29     'seventy': 70,
30     'eighty': 80,
31     'ninety': 90
32 }
33
34 Magnitude = {
35     'thousand':     1000,
36     'million':      1000000,
37     'billion':      1000000000,
38     'trillion':     1000000000000,
39     'quadrillion':  1000000000000000,
40     'quintillion':  1000000000000000000,
41     'sexillion':    1000000000000000000000,
42     'septillion':   1000000000000000000000000,
43     'octillion':    1000000000000000000000000000,
44     'nonillion':    1000000000000000000000000000000,
45     'decillion':    1000000000000000000000000000000000,
46 }
47
48 class NumberException(Exception):
49     def __init__(self, msg):
50         Exception.__init__(self, msg)
51
52 def text2num(s):
53     a = re.split(r"[\s-]+", s)
54     n = 0
55     g = 0
56     for w in a:
57         x = Small.get(w, None)
58         if x is not None:
59             g += x
60         elif w == "hundred":
61             g *= 100
62         else:
63             x = Magnitude.get(w, None)
64             if x is not None:
65                 n += g * x
66                 g = 0
67             else:
68                 raise NumberException("Unknown number: "+w)
69     return n + g
70     
71 if __name__ == "__main__":
72     print text2num("one")
73     print text2num("twelve")
74     print text2num("seventy two")
75     print text2num("three hundred")
76     print text2num("twelve hundred")
77     print text2num("twelve thousand three hundred four")
78     print text2num("six million")
79     print text2num("six million four hundred thousand five")
80     print text2num("one hundred twenty three billion four hundred fifty six million seven hundred eighty nine thousand twelve")
81     print text2num("four decillion")