Skip to content

Commit 2e99a8e

Browse files
authored
Update InterpreterPattern.py
1 parent 0fde178 commit 2e99a8e

File tree

1 file changed

+54
-51
lines changed

1 file changed

+54
-51
lines changed

Interpreter/InterpreterPattern.py

+54-51
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,87 @@
1-
#coding: utf8
1+
# coding: utf8
2+
23
from abc import ABCMeta, abstractmethod
34

4-
context = {"number": {}, "unit": {}}
5-
context["number"][u"零"] = 0
6-
context["number"][u"一"] = 1
7-
context["number"][u"二"] = 2
8-
context["number"][u"三"] = 3
9-
context["number"][u"四"] = 4
10-
context["number"][u"五"] = 5
11-
context["number"][u"六"] = 6
12-
context["number"][u"七"] = 7
13-
context["number"][u"八"] = 8
14-
context["number"][u"九"] = 9
15-
16-
context["unit"][u"十"] = 10
17-
context["unit"][u"百"] = 100
18-
context["unit"][u"千"] = 1000
19-
context["unit"][u"万"] = 10000
20-
context["unit"][u"亿"] = 100000000
21-
22-
class Expression:
5+
6+
class Expression(object):
237
__metaclass__ = ABCMeta
248

259
@abstractmethod
26-
def interpreter(self, context):
10+
def interpret(self):
2711
pass
2812

2913
@abstractmethod
30-
def get_priority(self, context):
14+
def get_priority(self):
3115
pass
3216

17+
3318
class NumberExpression(Expression):
19+
cn_to_number = {}
20+
cn_to_number[u"零"] = 0
21+
cn_to_number[u"一"] = 1
22+
cn_to_number[u"二"] = 2
23+
cn_to_number[u"三"] = 3
24+
cn_to_number[u"四"] = 4
25+
cn_to_number[u"五"] = 5
26+
cn_to_number[u"六"] = 6
27+
cn_to_number[u"七"] = 7
28+
cn_to_number[u"八"] = 8
29+
cn_to_number[u"九"] = 9
30+
3431
def __init__(self, chinese_number):
35-
self._cn = chinese_number
32+
self._cn = chinese_number
3633

37-
def interpreter(self, context):
38-
return context["number"][self._cn]
34+
def interpret(self):
35+
return self.cn_to_number[self._cn]
3936

40-
def get_priority(self, context):
37+
def get_priority(self):
4138
return 1
4239

40+
4341
class UnitExpression(Expression):
42+
unit_to_number = {}
43+
unit_to_number[u"十"] = 10 ** 1
44+
unit_to_number[u"百"] = 10 ** 2
45+
unit_to_number[u"千"] = 10 ** 3
46+
unit_to_number[u"万"] = 10 ** 4
47+
unit_to_number[u"亿"] = 10 ** 8
48+
4449
def __init__(self, unit, lefts):
4550
self._unit = unit
4651
self._lefts = lefts
4752

48-
def interpreter(self, context):
49-
base = sum([left.interpreter(context) for
50-
left in self._lefts])
51-
return base * context["unit"][self._unit]
53+
def interpret(self):
54+
base = sum([left.interpret() for left in self._lefts])
55+
return base * self.unit_to_number[self._unit]
5256

53-
def get_priority(self, context):
54-
return context["unit"][self._unit]
57+
def get_priority(self):
58+
return self.unit_to_number[self._unit]
5559

56-
class Converter:
57-
def __init__(self):
58-
pass
5960

60-
def convert(self, chinese_number):
61-
global context
62-
cn = chinese_number
61+
class Context(object):
62+
def __init__(self, chinese_number):
63+
self._cn = chinese_number
64+
65+
def convert(self):
6366
stack = []
6467

65-
for word in cn:
66-
if word == u"零":
68+
for char in self._cn:
69+
if char == u"零":
6770
continue
68-
if word in context["number"]:
69-
stack.append(NumberExpression(word))
71+
if char in NumberExpression.cn_to_number:
72+
stack.append(NumberExpression(char))
7073
continue
71-
if word in context["unit"]:
74+
if char in UnitExpression.unit_to_number:
7275
lefts = []
73-
for ind in range(len(stack)-1, -1, -1):
74-
if stack[ind].get_priority(context) > \
75-
context["unit"][word]:
76+
for ind in range(len(stack) - 1, -1, -1):
77+
if stack[ind].get_priority() > UnitExpression.unit_to_number[char]:
7678
break
7779
lefts.insert(0, stack.pop(ind))
78-
stack.append(UnitExpression(word, lefts))
79-
return sum(item.interpreter(context) for item in stack)
80+
stack.append(UnitExpression(char, lefts))
81+
continue
82+
raise ValueError("unknown character")
83+
return sum(item.interpret() for item in stack)
8084

81-
if __name__ == "__main__":
82-
input_string = raw_input(u"请输入汉字表示:".encode("utf8"))
83-
print Converter().convert(unicode(input_string, "utf8"))
8485

86+
if __name__ == "__main__":
87+
print(Context(u"三千二百五十亿四千三百万八千一百二十九").convert())

0 commit comments

Comments
 (0)