1    class Expression {
2        constructor() {
3            this.numberMap = {
4                零: 0,
5                一: 1,
6                二: 2,
7                三: 3,
8                四: 4,
9                五: 5,
10               六: 6,
11               七: 7,
12               八: 8,
13               九: 9
14           };
15       }
16   
17       parse (context) {
18           let { data, str } = context;
19           if (str.length == 0) {
20               return;
21           }
22   
23           Object.keys(this.numberMap).forEach((key) => {
24               const value = this.numberMap[key];
25               if (str.endsWith(key + this.getPostfix())) {
26                   data += value * this.multiplier();
27                   str = str.substring(0, str.length - this.getLength() - 1);
28               }
29   
30               if (str.endsWith('零')) {
31                   str = str.substring(0, str.length - 1);
32               }
33           });
34           context.str = str;
35           context.data = data;
36       }
37   
38       getPostfix() {}
39       multiplier() {};
40       getLength(){
41           return this.getPostfix().length;
42       }
43   }
44   
45   class GeExpression extends Expression {
46       getPostfix() {
47           return '';
48       }
49       multiplier() {
50           return 1;
51       }
52       getLength() {
53           return 0;
54       }
55   }
56   
57   class ShiExpression extends Expression {
58       getPostfix() {
59           return '十';
60       }
61       multiplier() {
62           return 10;
63       }
64   }
65   
66   class BaiExpression extends Expression {
67       getPostfix() {
68           return '百';
69       }
70       multiplier() {
71           return 100;
72       }
73   }
74   
75   class QianExpression extends Expression {
76       getPostfix() {
77           return '千';
78       }
79       multiplier() {
80           return 1000;
81       }
82   }
83   
84   class WanExpression extends Expression {
85       getPostfix() {
86           return '万';
87       }
88       multiplier() {
89           return 10000;
90       }
91   
92       parse(context) {
93           let { data, str } = context;
94           if (str.length == 0) {
95               return;
96           }
97           const expressionList = [new GeExpression(), new ShiExpression(), new BaiExpression(), new QianExpression()];
98   
99           if (str.endsWith(this.getPostfix())) {
100              context.str = str.substring(0, str.length - 1);
101              context.data = 0;
102              expressionList.forEach(expression => expression.parse(context));
103              data += context.data * this.multiplier();
104          }
105  
106          context.str = str;
107          context.data = data;
108      }
109  }
110  
111  class Context {
112      constructor(str) {
113          this.str = str;
114          this.data = 0;
115      }
116  
117      toString() {
118          return this.data.toString();
119      }
120  }
121  
122  (function main() {
123      const context = new Context('八千零二万九千三百七十二');
124      const expressionList = [new GeExpression(), new ShiExpression(), new BaiExpression(), new QianExpression(), new WanExpression()];
125      expressionList.forEach(expression => expression.parse(context));
126      console.log(context)
127  })();
128