n2words 1.9.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +64 -5
- package/CHANGELOG.md +34 -0
- package/README.md +33 -14
- package/dist/n2words.js +1 -1
- package/lib/classes/N2WordsAbs.mjs +55 -34
- package/lib/classes/N2WordsBase.mjs +25 -19
- package/lib/i18n/AR.mjs +91 -83
- package/lib/i18n/CZ.mjs +80 -74
- package/lib/i18n/DE.mjs +82 -73
- package/lib/i18n/DK.mjs +82 -73
- package/lib/i18n/EN.mjs +68 -54
- package/lib/i18n/ES.mjs +86 -77
- package/lib/i18n/FA.mjs +67 -62
- package/lib/i18n/FR.mjs +72 -63
- package/lib/i18n/HE.mjs +40 -33
- package/lib/i18n/HR.mjs +117 -0
- package/lib/i18n/HU.mjs +70 -64
- package/lib/i18n/ID.mjs +155 -0
- package/lib/i18n/IT.mjs +46 -40
- package/lib/i18n/KO.mjs +44 -35
- package/lib/i18n/LT.mjs +86 -80
- package/lib/i18n/LV.mjs +74 -67
- package/lib/i18n/NL.mjs +92 -87
- package/lib/i18n/NO.mjs +65 -56
- package/lib/i18n/PL.mjs +81 -75
- package/lib/i18n/PT.mjs +85 -77
- package/lib/i18n/RU.mjs +99 -93
- package/lib/i18n/SR.mjs +83 -77
- package/lib/i18n/TR.mjs +227 -218
- package/lib/i18n/UK.mjs +80 -74
- package/lib/i18n/ZH.mjs +52 -41
- package/lib/n2words.mjs +60 -54
- package/package.json +17 -20
- package/webpack.config.js +2 -5
- package/lib/n2words_EN.mjs +0 -11
package/lib/i18n/RU.mjs
CHANGED
|
@@ -1,81 +1,83 @@
|
|
|
1
1
|
import N2WordsAbs from '../classes/N2WordsAbs.mjs';
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export class N2WordsRU extends N2WordsAbs {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
5
6
|
|
|
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
|
-
|
|
7
|
+
this.feminine = false;
|
|
8
|
+
this.negativeWord = 'минус';
|
|
9
|
+
this.separatorWord = 'запятая';
|
|
10
|
+
this.zero = 'ноль';
|
|
11
|
+
this.ones = {
|
|
12
|
+
1: 'один',
|
|
13
|
+
2: 'два',
|
|
14
|
+
3: 'три',
|
|
15
|
+
4: 'четыре',
|
|
16
|
+
5: 'пять',
|
|
17
|
+
6: 'шесть',
|
|
18
|
+
7: 'семь',
|
|
19
|
+
8: 'восемь',
|
|
20
|
+
9: 'девять'
|
|
21
|
+
};
|
|
22
|
+
this.onesFeminine = {
|
|
23
|
+
1: 'одна',
|
|
24
|
+
2: 'две',
|
|
25
|
+
3: 'три',
|
|
26
|
+
4: 'четыре',
|
|
27
|
+
5: 'пять',
|
|
28
|
+
6: 'шесть',
|
|
29
|
+
7: 'семь',
|
|
30
|
+
8: 'восемь',
|
|
31
|
+
9: 'девять'
|
|
32
|
+
};
|
|
33
|
+
this.tens = {
|
|
34
|
+
0: 'десять',
|
|
35
|
+
1: 'одиннадцать',
|
|
36
|
+
2: 'двенадцать',
|
|
37
|
+
3: 'тринадцать',
|
|
38
|
+
4: 'четырнадцать',
|
|
39
|
+
5: 'пятнадцать',
|
|
40
|
+
6: 'шестнадцать',
|
|
41
|
+
7: 'семнадцать',
|
|
42
|
+
8: 'восемнадцать',
|
|
43
|
+
9: 'девятнадцать'
|
|
44
|
+
};
|
|
45
|
+
this.twenties = {
|
|
46
|
+
2: 'двадцать',
|
|
47
|
+
3: 'тридцать',
|
|
48
|
+
4: 'сорок',
|
|
49
|
+
5: 'пятьдесят',
|
|
50
|
+
6: 'шестьдесят',
|
|
51
|
+
7: 'семьдесят',
|
|
52
|
+
8: 'восемьдесят',
|
|
53
|
+
9: 'девяносто'
|
|
54
|
+
};
|
|
55
|
+
this.hundreds = {
|
|
56
|
+
1: 'сто',
|
|
57
|
+
2: 'двести',
|
|
58
|
+
3: 'триста',
|
|
59
|
+
4: 'четыреста',
|
|
60
|
+
5: 'пятьсот',
|
|
61
|
+
6: 'шестьсот',
|
|
62
|
+
7: 'семьсот',
|
|
63
|
+
8: 'восемьсот',
|
|
64
|
+
9: 'девятьсот'
|
|
65
|
+
};
|
|
66
|
+
this.thousands = {
|
|
67
|
+
1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3
|
|
68
|
+
2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6
|
|
69
|
+
3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9
|
|
70
|
+
4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12
|
|
71
|
+
5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15
|
|
72
|
+
6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18
|
|
73
|
+
7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21
|
|
74
|
+
8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24
|
|
75
|
+
9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27
|
|
76
|
+
10: ['нониллион', 'нониллиона', 'нониллионов'], // 10^ 30
|
|
77
|
+
};
|
|
78
|
+
}
|
|
77
79
|
|
|
78
|
-
|
|
80
|
+
splitByX(n, x, formatInt = true) {
|
|
79
81
|
const results = [];
|
|
80
82
|
const l = n.length;
|
|
81
83
|
let result;
|
|
@@ -83,7 +85,7 @@ export default function () {
|
|
|
83
85
|
const start = l % x;
|
|
84
86
|
if (start > 0) {
|
|
85
87
|
result = n.slice(0, start);
|
|
86
|
-
if (
|
|
88
|
+
if (formatInt) {
|
|
87
89
|
results.push(parseInt(result));
|
|
88
90
|
} else {
|
|
89
91
|
results.push(result);
|
|
@@ -91,28 +93,28 @@ export default function () {
|
|
|
91
93
|
}
|
|
92
94
|
for (let i = start; i < l; i += x) {
|
|
93
95
|
result = n.slice(i, i + x);
|
|
94
|
-
if (
|
|
96
|
+
if (formatInt) {
|
|
95
97
|
results.push(parseInt(result));
|
|
96
98
|
} else {
|
|
97
99
|
results.push(result);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
} else {
|
|
101
|
-
if (
|
|
103
|
+
if (formatInt) {
|
|
102
104
|
results.push(parseInt(n));
|
|
103
105
|
} else {
|
|
104
106
|
results.push(n);
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
return results;
|
|
108
|
-
}
|
|
110
|
+
}
|
|
109
111
|
|
|
110
|
-
|
|
112
|
+
getDigits(n) {
|
|
111
113
|
const a = Array.from(JSON.stringify(n).padStart(3, '0').slice(-3)).reverse();
|
|
112
|
-
return a.map(
|
|
113
|
-
}
|
|
114
|
+
return a.map(e => parseInt(e));
|
|
115
|
+
}
|
|
114
116
|
|
|
115
|
-
|
|
117
|
+
pluralize(n, forms) {
|
|
116
118
|
let form = 2;
|
|
117
119
|
if ((n % 100 < 10) || (n % 100 > 20)) {
|
|
118
120
|
if (n % 10 == 1) {
|
|
@@ -122,14 +124,14 @@ export default function () {
|
|
|
122
124
|
}
|
|
123
125
|
}
|
|
124
126
|
return forms[form];
|
|
125
|
-
}
|
|
127
|
+
}
|
|
126
128
|
|
|
127
|
-
|
|
129
|
+
toCardinal(number) {
|
|
128
130
|
if (parseInt(number) == 0) {
|
|
129
|
-
return this.
|
|
131
|
+
return this.zero;
|
|
130
132
|
}
|
|
131
133
|
const words = [];
|
|
132
|
-
const chunks = this.
|
|
134
|
+
const chunks = this.splitByX(JSON.stringify(number), 3);
|
|
133
135
|
let i = chunks.length;
|
|
134
136
|
for (let j = 0; j < chunks.length; j++) {
|
|
135
137
|
const x = chunks[j];
|
|
@@ -138,23 +140,27 @@ export default function () {
|
|
|
138
140
|
if (x == 0) {
|
|
139
141
|
continue;
|
|
140
142
|
}
|
|
141
|
-
const [n1, n2, n3] = this.
|
|
143
|
+
const [n1, n2, n3] = this.getDigits(x);
|
|
142
144
|
if (n3 > 0) {
|
|
143
|
-
words.push(this.
|
|
145
|
+
words.push(this.hundreds[n3]);
|
|
144
146
|
}
|
|
145
147
|
if (n2 > 1) {
|
|
146
|
-
words.push(this.
|
|
148
|
+
words.push(this.twenties[n2]);
|
|
147
149
|
}
|
|
148
150
|
if (n2 == 1) {
|
|
149
|
-
words.push(this.
|
|
151
|
+
words.push(this.tens[n1]);
|
|
150
152
|
} else if (n1 > 0) {
|
|
151
|
-
ones = (i == 1 || this.feminine && i == 0) ? this.
|
|
153
|
+
ones = (i == 1 || this.feminine && i == 0) ? this.onesFeminine : this.ones;
|
|
152
154
|
words.push(ones[n1]);
|
|
153
155
|
}
|
|
154
156
|
if (i > 0) {
|
|
155
|
-
words.push(this.pluralize(x, this.
|
|
157
|
+
words.push(this.pluralize(x, this.thousands[i]));
|
|
156
158
|
}
|
|
157
159
|
}
|
|
158
160
|
return words.join(' ');
|
|
159
|
-
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export default function(n) {
|
|
165
|
+
return new N2WordsRU().floatToCardinal(n);
|
|
160
166
|
}
|
package/lib/i18n/SR.mjs
CHANGED
|
@@ -1,71 +1,73 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {N2WordsRU} from './RU.mjs';
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export class N2WordsSR extends N2WordsRU {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
5
6
|
|
|
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
|
-
|
|
7
|
+
this.negativeWord = 'minus';
|
|
8
|
+
this.separatorWord = 'zapeta';
|
|
9
|
+
this.zero = 'nula';
|
|
10
|
+
this.ones = {
|
|
11
|
+
1: ['jedan', 'jedna'],
|
|
12
|
+
2: ['dva', 'dve'],
|
|
13
|
+
3: ['tri', 'tri'],
|
|
14
|
+
4: ['četiri', 'četiri'],
|
|
15
|
+
5: ['pet', 'pet'],
|
|
16
|
+
6: ['šest', 'šest'],
|
|
17
|
+
7: ['sedam', 'sedam'],
|
|
18
|
+
8: ['osam', 'osam'],
|
|
19
|
+
9: ['devet', 'devet']
|
|
20
|
+
};
|
|
21
|
+
this.tens = {
|
|
22
|
+
0: 'deset',
|
|
23
|
+
1: 'jedanaest',
|
|
24
|
+
2: 'dvanaest',
|
|
25
|
+
3: 'trinaest',
|
|
26
|
+
4: 'četrnaest',
|
|
27
|
+
5: 'petnaest',
|
|
28
|
+
6: 'šesnaest',
|
|
29
|
+
7: 'sedamnaest',
|
|
30
|
+
8: 'osamnaest',
|
|
31
|
+
9: 'devetnaest'
|
|
32
|
+
};
|
|
33
|
+
this.twenties = {
|
|
34
|
+
2: 'dvadeset',
|
|
35
|
+
3: 'trideset',
|
|
36
|
+
4: 'četrdeset',
|
|
37
|
+
5: 'pedeset',
|
|
38
|
+
6: 'šezdeset',
|
|
39
|
+
7: 'sedamdeset',
|
|
40
|
+
8: 'osamdeset',
|
|
41
|
+
9: 'devedeset'
|
|
42
|
+
};
|
|
43
|
+
this.hundreds = {
|
|
44
|
+
1: 'sto',
|
|
45
|
+
2: 'dvesta',
|
|
46
|
+
3: 'trista',
|
|
47
|
+
4: 'četiristo',
|
|
48
|
+
5: 'petsto',
|
|
49
|
+
6: 'šesto',
|
|
50
|
+
7: 'sedamsto',
|
|
51
|
+
8: 'osamsto',
|
|
52
|
+
9: 'devetsto'
|
|
53
|
+
};
|
|
54
|
+
this.SCALE = {
|
|
55
|
+
0: ['', '', '', false],
|
|
56
|
+
1: ['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3
|
|
57
|
+
2: ['milion', 'miliona', 'miliona', false], // 10 ^ 6
|
|
58
|
+
3: ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9
|
|
59
|
+
4: ['bilion', 'biliona', 'biliona', false], // 10 ^ 12
|
|
60
|
+
5: ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15
|
|
61
|
+
6: ['trilion', 'triliona', 'triliona', false], // 10 ^ 18
|
|
62
|
+
7: ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21
|
|
63
|
+
8: ['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 24
|
|
64
|
+
9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27
|
|
65
|
+
10: ['kvintilion', 'kvintiliona', 'kvintiliona', false], // 10 ^ 30
|
|
66
|
+
};
|
|
67
|
+
this.feminine = false;
|
|
68
|
+
}
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
pluralize(n, forms) {
|
|
69
71
|
let form = 2;
|
|
70
72
|
if ((n % 100 < 10) || (n % 100 > 20)) {
|
|
71
73
|
if (n % 10 == 1) {
|
|
@@ -75,37 +77,41 @@ export default function () {
|
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
79
|
return forms[form];
|
|
78
|
-
}
|
|
80
|
+
}
|
|
79
81
|
|
|
80
|
-
|
|
82
|
+
toCardinal(number) {
|
|
81
83
|
if (parseInt(number) == 0) {
|
|
82
|
-
return this.
|
|
84
|
+
return this.zero;
|
|
83
85
|
}
|
|
84
86
|
const words = [];
|
|
85
|
-
const chunks = this.
|
|
87
|
+
const chunks = this.splitByX(JSON.stringify(number), 3);
|
|
86
88
|
let i = chunks.length;
|
|
87
89
|
for (let j = 0; j < chunks.length; j++) {
|
|
88
90
|
const x = chunks[j];
|
|
89
91
|
i = i - 1;
|
|
90
92
|
// if (x == 0) { continue; }
|
|
91
|
-
const [n1, n2, n3] = this.
|
|
93
|
+
const [n1, n2, n3] = this.getDigits(x);
|
|
92
94
|
if (n3 > 0) {
|
|
93
|
-
words.push(this.
|
|
95
|
+
words.push(this.hundreds[n3]);
|
|
94
96
|
}
|
|
95
97
|
if (n2 > 1) {
|
|
96
|
-
words.push(this.
|
|
98
|
+
words.push(this.twenties[n2]);
|
|
97
99
|
}
|
|
98
100
|
if (n2 == 1) {
|
|
99
|
-
words.push(this.
|
|
101
|
+
words.push(this.tens[n1]);
|
|
100
102
|
} else if (n1 > 0) {
|
|
101
|
-
const
|
|
102
|
-
const
|
|
103
|
-
words.push(this.
|
|
103
|
+
const isFeminine = (this.feminine || this.SCALE[i][3]);
|
|
104
|
+
const genderIdx = isFeminine ? 1 : 0;
|
|
105
|
+
words.push(this.ones[n1][genderIdx]);
|
|
104
106
|
}
|
|
105
107
|
if ((i > 0) && (x != 0)) {
|
|
106
108
|
words.push(this.pluralize(x, this.SCALE[i]));
|
|
107
109
|
}
|
|
108
110
|
}
|
|
109
111
|
return words.join(' ');
|
|
110
|
-
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export default function(n) {
|
|
116
|
+
return new N2WordsSR().floatToCardinal(n);
|
|
111
117
|
}
|