-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchineseNumbers.js
164 lines (150 loc) · 7.04 KB
/
chineseNumbers.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*jslint regexp: true */
var chineseNumerals = (function () {
"use strict";
var tradSimpDigits = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"],
pinyinDigits = ["ling2 ", "yi1 ", "er2 ", "san1 ", "si4 ", "wu3 ", "liu4 ", "qi1 ", "ba1 ", "jiu9 "],
formalTradDigits = ["零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖"],
formalSimpDigits = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"],
tradSimpBeforeWan = ["十", "百", "千"],
pinyinBeforeWan = ["shi2 ", "bai3 ", "qian1 "],
formalBeforeWan = ["拾", "佰", "仟"],
tradAfterWan = ["", "萬", "億", "兆", "京"],
pinyinAfterWan = ["", "wan4 ", "yi4 ", "zhao4 ", "jing1 "],
simpAfterWan = ["", "万", "亿", "兆", "京"];
return {
convert: function (number, outputType) {
/// <summary>Takes a given English numerical input and converts that input to Chinese</summary>
/// <param name="number">The English number, e.g. 1234 or 1,234 or one thousand two hundred and thirty four</param>
/// <param name="outputType">The way to display the output</param>
var brokenUpNumber,
wholeNumber,
decimal,
i,
power = 0,
powers = [],
minusSign,
decimalPoint,
isNegative = false, // is the given number negative
hasDigitsAfterDecimal = false,
inZero = false, // are we in a stretch or 1 or more zeros (only add one zero for the stretch)
canAddZero = false, // only add a zero if there's something non-zero on both sides of the number
outputDigits, // how the final output will be displayed
afterWan, // how the characters for large numbers will be displayed
beforeWan, // how the characters for smaller numbers will be displayed (十, 百, 千)
chineseNumber = ""; // the final result
// remove everything except for numbers, decimal and negative sign
number = number.toString().replace(/[^0-9\.-]/g, "");
if (isNaN(number) || number.length === 0) {
return "Not a Number";
}
switch (outputType.toLowerCase()) {
case "trad":
outputDigits = tradSimpDigits;
afterWan = tradAfterWan;
beforeWan = tradSimpBeforeWan;
minusSign = "負";
decimalPoint = "點";
break;
case "simp":
outputDigits = tradSimpDigits;
afterWan = simpAfterWan;
beforeWan = tradSimpBeforeWan;
minusSign = "负";
decimalPoint = "点";
break;
case "pinyin":
outputDigits = pinyinDigits;
afterWan = pinyinAfterWan;
beforeWan = pinyinBeforeWan;
minusSign = "fu4 ";
decimalPoint = "dian3 ";
break;
case "formaltrad":
outputDigits = formalTradDigits;
afterWan = tradAfterWan;
beforeWan = formalBeforeWan;
minusSign = "負";
decimalPoint = "點";
break;
case "formalsimp":
outputDigits = formalSimpDigits;
afterWan = simpAfterWan;
beforeWan = formalBeforeWan;
minusSign = "负";
decimalPoint = "点";
break;
default:
outputDigits = tradSimpDigits;
afterWan = tradAfterWan;
beforeWan = tradSimpBeforeWan;
minusSign = "負";
decimalPoint = "點";
break;
}
if (parseFloat(number, 10) === 0) {
// remove space for pinyin
return outputDigits[0].replace(/^\s+|\s+$/g, "");
}
if (number < 0) {
isNegative = true;
number = -number;
}
brokenUpNumber = String(number).split(".", 2);
if (brokenUpNumber[0] !== "") {
// remove leading 0's
wholeNumber = String(parseInt(brokenUpNumber[0], 10));
} else {
wholeNumber = "0";
}
if (brokenUpNumber.length === 2) {
hasDigitsAfterDecimal = true;
decimal = brokenUpNumber[1];
}
for (i = wholeNumber.length - 1; i >= 0; i = i - 1) {
powers[power] = parseInt(wholeNumber[i], 10);
power = power + 1;
}
// Take the decomposition of the number for above and generate the Chinese equivalent
for (i = 0; i < power; i = i + 1) {
if (i % 4 === 0) { // Reached the next four powers up level
if (powers[i] !== 0) {
inZero = false;
canAddZero = true;
chineseNumber = outputDigits[powers[i]] + afterWan[i / 4] + chineseNumber;
} else {
// Check that something in the next three powers is non-zero before adding
if (((i + 3 < power) && powers[i + 3] !== 0) || ((i + 2 < power) && powers[i + 2] !== 0) || ((i + 1 < power) && powers[i + 1] !== 0)) {
chineseNumber = afterWan[i / 4] + chineseNumber;
canAddZero = false; // added
}
}
} else { // Add one, tens, hundreds, or thousands place for each level
if (powers[i] !== 0) {
inZero = false;
canAddZero = true;
if (power === 2 && i === 1 && powers[i] === 1) { // No 一 with 10 through 19
chineseNumber = beforeWan[(i % 4) - 1] + chineseNumber;
} else {
chineseNumber = outputDigits[powers[i]] + beforeWan[(i % 4) - 1] + chineseNumber;
}
} else {
if (canAddZero === true && inZero === false) { // Only insert one 零 for all consecutive zeroes
inZero = true;
chineseNumber = outputDigits[powers[i]] + chineseNumber;
}
}
}
}
if (isNegative === true) {
chineseNumber = minusSign + chineseNumber;
}
if (hasDigitsAfterDecimal === true) {
chineseNumber += decimalPoint;
for (i = 0; i < decimal.length; i = i + 1) {
chineseNumber += outputDigits[decimal[i]];
}
}
return chineseNumber.replace(/^\s+|\s+$/g, ""); // remove space for pinyin
}
};
}());