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