This repository has been archived by the owner on Apr 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathparseInt.js
65 lines (61 loc) · 3.14 KB
/
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
if(parseInt("一千一百十一")!=1111) { ///< 如果還不支援,才需要宣告
parseInt = function() {
var orig = parseInt;
/**
* 命名規則:
* * one: 數字「一」
* * ones: 個位數
* * tens: 十進制
* * wans: 萬進制
* * re: 正規表示式
*/
var onesH = [
"0零○〇", "1一壹ㄧ",
"2二貳兩", "3三參", "4四肆", "5五伍",
"6六陸", "7七柒", "8八捌", "9九玖"
]; /// "兩"字當量詞而被意外傳入時,後面會處理
var ones = onesH.join("");
var tens = "十百千拾佰仟";
var wans = "萬億兆京垓秭穰溝澗正載極"; ///< 參閱WikiPedia條目〈中文數字〉
var reOnesH = [];
for(var i = 0; i < 10; ++i) reOnesH[i] = new RegExp("["+onesH[i]+"]", "g");
var reOnes = new RegExp("[" + ones + "]", "g");
var reTens = new RegExp("[" + tens + "]", "g");
var reWans = new RegExp("([^負" + wans + "]+)([" + wans + "])", "g");
var rePreOne = new RegExp("^([" + tens + wans + "])", "g"); ///< 句首補「一」
var reInnerOne = new RegExp("([負零" + tens + wans + "])([" + tens + "])", "g"); ///< 處理如「二萬零十五」
var reAllOnes = new RegExp("^負?["+ones+"]+$", "g");
var reNonSupported = new RegExp("[^負"+ones+tens+wans+"]", "g");
return function() {
var result = orig.apply(this, arguments);
if(!isNaN(result)) return result; ///< 如果是舊函數已支援的情形,那就回傳就函數的結果
var str = arguments[0].replace(reNonSupported, ""); /// 移除不支援的字(包含 \d 喔)
str = str.replace(/兩$/, ""); /// 移除末尾的「兩」字
reAllOnes.lastIndex = 0;
if(reAllOnes.test(str)) { /// 若均是零到九,直接一對一轉換
str = str.replace(/^負/, "-");
for(var i = 0; i < 10; ++i) {
reOnesH[i].lastIndex = 0;
str = str.replace(reOnesH[i], String(i));
}
return orig(str, 10);
}
/// 若有零到九以外的文字,才處理這裡
reOnes.lastIndex = reTens.lastIndex = reWans.lastIndex = 0;
rePreOne.lastIndex = reInnerOne.lastIndex = 0;
str = str.replace(rePreOne, "一$1").replace(reInnerOne, "$1一$2");
str = str.replace(reWans, function(match, belowWan, wan) {
return "+(" + belowWan + ")*Math.pow(10000," + (wans.indexOf(wan)+1) + ")"
}).replace(reTens, function(match) {
return "*" + [10, 100, 1000][tens.indexOf(match)%3];
}).replace(reOnes, function(match) {
for(var i = 0; i < 10; ++i)
if(onesH[i].indexOf(match) >= 0)
return "+" + i;
});
str = str.replace(/^負(.*)/, "-($1)");
try { return eval(str); }
catch(e) {return NaN;}
};
}();
}