-
Notifications
You must be signed in to change notification settings - Fork 0
/
number-kor.js
107 lines (105 loc) · 3.03 KB
/
number-kor.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
(function () {
const cardinal_numbers = [/^(영|공)/, /^(일|한|하나)/, /^(이|두|둘)/, /^(삼|세|셋)/, /^(사|네|넷)/, /^(오|다섯)/, /^(육|여섯)/, /^(칠|일곱)/, /^(팔|여덟)/, /^(구|아홉)/];
const byten = {
10: "열",
20: "스물",
30: "서른",
40: "마흔",
50: "쉰",
60: "예순",
70: "일흔",
80: "여든",
90: "아흔"
};
const small_digit_numbers = {
10: "십",
100: "백",
1000: "천"
};
const big_digit_numbers = {
10000: "만",
100000000: "억",
1000000000000: "조",
10000000000000000: "경"
};
let parser = {
isOrdinal: (str) => {
try {
this.parseOrdinal(str);
return true;
} catch (e) {
return false;
}
},
parseOrdinal: (_str) => {
let sum = 0, tmpSum = 0, tmp = 0;
let str = _str.replace(/^\s+|\s+$/g, '');
let lastBig = 10000000000000000000, lastSmall = 10000;
let canDigit = true;
if (str.length === 0) return null;
loop1:
while (str.length > 0) {
for (let i in big_digit_numbers) {
if (str.startsWith(big_digit_numbers[i])) {
if (lastBig <= i | 0) {
throw new Error("형식이 맞지 않는 수입니다.");
}
if (tmp != 0) tmpSum += tmp;
if (tmpSum === 0) tmpSum = 1;
tmpSum *= (i | 0);
sum += tmpSum;
tmpSum = 0; tmp = 0;
str = str.substr(big_digit_numbers[i].length);
lastBig = i | 0;
lastSmall = 10000;
canDigit = true;
continue loop1;
}
}
for (let i in small_digit_numbers) {
if (str.startsWith(small_digit_numbers[i])) {
if (lastSmall <= i | 0) {
throw new Error("형식이 맞지 않는 수입니다");
}
if (tmp === 0) tmp = 1;
tmpSum += tmp * (i | 0);
tmp = 0;
str = str.substr(small_digit_numbers[i].length);
lastSmall = i | 0;
canDigit = true;
continue loop1;
}
}
for (let i in byten) {
if (str.startsWith(byten[i])) {
tmp += i | 0;
str = str.substr(byten[i].length);
canDigit = true;
continue loop1;
}
}
let m = null;
for (let i in cardinal_numbers) {
if (m = str.match(cardinal_numbers[i])) {
if (!canDigit) {
throw Error("형식이 맞지 않는 수입니다.");
}
tmp += i | 0;
str = str.substr(m[0].length);
canDigit = false;
continue loop1;
}
}
throw Error("알 수 없는 문자가 있습니다 : " + str[0]);
}
if (tmpSum) sum += tmpSum;
if (tmp) sum += tmp;
return sum;
}
}
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = parser;
} else {
Number.prototype.parseKor = parser.parseOrdinal;
}
})();