-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchinese-parseint.js
executable file
·70 lines (64 loc) · 1.88 KB
/
chinese-parseint.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const chinese_parseInt = (function(){
const digits = [
"00零○〇洞",
"11一壹ㄧ弌么",
"22二貳贰弍兩两",
"33三參叁弎参叄",
"44四肆䦉刀",
"55五伍",
"66六陸陆",
"77七柒拐",
"88八捌杯",
"99九玖勾"
];
const tens = ["十拾什呀", "百佰", "千仟"];
const exponents = ["萬万", "億亿", "兆", "京經经", "垓", "秭杼", "穰壤", "溝沟", "澗涧", "正", "載", "極"];
const reDigit = new RegExp("^[" + digits.join("") + "]+$");
const reTen = new RegExp("(^|[^" + digits.slice(1).join("") + "])[" + tens[0] + "]", "g");
return str => {
str = str.replace(/\s+/g, "").replace(reTen, "$1一十");
// console.log(str);
let result = 0, buffer = 0, digit = 0, pos;
let sign = 1;
if("負负".includes(str.charAt(0))) sign = -1;
if("正負负".includes(str.charAt(0))) str = str.substring(1);
if(reDigit.test(str)) {
for(let c of str)
result = result * 10 + digits.findIndex(dc => dc.includes(c));
return result;
}
for(let c of str) {
pos = digits.findIndex(dc => dc.includes(c));
if(pos !== -1) {
digit = digit * 10 + pos;
continue;
}
pos = tens.findIndex(tc => tc.includes(c));
if(pos !== -1) {
buffer += digit * 10 ** (pos + 1);
digit = 0;
continue;
}
pos = exponents.findIndex(ec => ec.includes(c));
if(pos !== -1) {
buffer += digit;
if(pos <= 2) result += buffer * 10 ** (4 * (pos + 1));
else result = BigInt(result) + BigInt(buffer) * 10n ** (4n * (BigInt(pos) + 1n));
buffer = digit = 0;
continue;
}
return NaN;
}
// console.log(result, buffer, digit);
if(typeof result !== "bigint") {
result += buffer + digit;
if(sign === -1) result *= -1;
}
else {
result += BigInt(buffer + digit);
if(sign === -1) result *= -1n;
}
return result;
};
})();
if(typeof module === 'object') module.exports = chinese_parseInt;