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/NO.mjs
CHANGED
|
@@ -1,60 +1,69 @@
|
|
|
1
1
|
import N2WordsBase from '../classes/N2WordsBase.mjs';
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export class N2WordsNO extends N2WordsBase {
|
|
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
|
-
return { [
|
|
59
|
-
|
|
7
|
+
this.negativeWord = 'minus';
|
|
8
|
+
this.separatorWord = 'komma';
|
|
9
|
+
this.zero = 'null';
|
|
10
|
+
this.cards = [
|
|
11
|
+
{ '1000000000000000000000000000000000': 'quintillard' },
|
|
12
|
+
{ '1000000000000000000000000000000': 'quintillion' },
|
|
13
|
+
{ '1000000000000000000000000000': 'quadrillard' },
|
|
14
|
+
{ '1000000000000000000000000': 'quadrillion' },
|
|
15
|
+
{ '1000000000000000000000': 'trillard' },
|
|
16
|
+
{ 1000000000000000000: 'trillion' },
|
|
17
|
+
{ 1000000000000000: 'billard' },
|
|
18
|
+
{ 1000000000000: 'billion' },
|
|
19
|
+
{ 1000000000: 'millard' },
|
|
20
|
+
{ 1000000: 'million' },
|
|
21
|
+
{ 1000: 'tusen' },
|
|
22
|
+
{ 100: 'hundre' },
|
|
23
|
+
{ 90: 'nitti' },
|
|
24
|
+
{ 80: 'åtti' },
|
|
25
|
+
{ 70: 'sytti' },
|
|
26
|
+
{ 60: 'seksti' },
|
|
27
|
+
{ 50: 'femti' },
|
|
28
|
+
{ 40: 'førti' },
|
|
29
|
+
{ 30: 'tretti' },
|
|
30
|
+
{ 20: 'tjue' },
|
|
31
|
+
{ 19: 'nitten' },
|
|
32
|
+
{ 18: 'atten' },
|
|
33
|
+
{ 17: 'sytten' },
|
|
34
|
+
{ 16: 'seksten' },
|
|
35
|
+
{ 15: 'femten' },
|
|
36
|
+
{ 14: 'fjorten' },
|
|
37
|
+
{ 13: 'tretten' },
|
|
38
|
+
{ 12: 'tolv' },
|
|
39
|
+
{ 11: 'elleve' },
|
|
40
|
+
{ 10: 'ti' },
|
|
41
|
+
{ 9: 'ni' },
|
|
42
|
+
{ 8: 'åtte' },
|
|
43
|
+
{ 7: 'syv' },
|
|
44
|
+
{ 6: 'seks' },
|
|
45
|
+
{ 5: 'fem' },
|
|
46
|
+
{ 4: 'fire' },
|
|
47
|
+
{ 3: 'tre' },
|
|
48
|
+
{ 2: 'to' },
|
|
49
|
+
{ 1: 'en' },
|
|
50
|
+
{ 0: 'null' }
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
merge(lPair, rPair) { // {'one':1}, {'hundred':100}
|
|
55
|
+
const lText = Object.keys(lPair)[0];
|
|
56
|
+
const rText = Object.keys(rPair)[0];
|
|
57
|
+
const lNum = parseInt(Object.values(lPair)[0]);
|
|
58
|
+
const rNum = parseInt(Object.values(rPair)[0]);
|
|
59
|
+
if (lNum == 1 && rNum < 100) return { [rText]: rNum };
|
|
60
|
+
else if (lNum < 100 && lNum > rNum) return { [`${lText}-${rText}`]: lNum + rNum };
|
|
61
|
+
else if (lNum >= 100 && rNum < 100) return { [`${lText} og ${rText}`]: lNum + rNum };
|
|
62
|
+
else if (rNum > lNum) return { [`${lText} ${rText}`]: lNum * rNum };
|
|
63
|
+
return { [`${lText}, ${rText}`]: lNum + rNum };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default function(n) {
|
|
68
|
+
return new N2WordsNO().floatToCardinal(n);
|
|
60
69
|
}
|
package/lib/i18n/PL.mjs
CHANGED
|
@@ -1,70 +1,72 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {N2WordsRU} from './RU.mjs';
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export class N2WordsPL 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
|
-
|
|
7
|
+
this.feminine = false;
|
|
8
|
+
this.negativeWord = 'minus';
|
|
9
|
+
this.separatorWord = 'przecinek';
|
|
10
|
+
this.zero = 'zero';
|
|
11
|
+
this.ones = {
|
|
12
|
+
1: 'jeden',
|
|
13
|
+
2: 'dwa',
|
|
14
|
+
3: 'trzy',
|
|
15
|
+
4: 'cztery',
|
|
16
|
+
5: 'pięć',
|
|
17
|
+
6: 'sześć',
|
|
18
|
+
7: 'siedem',
|
|
19
|
+
8: 'osiem',
|
|
20
|
+
9: 'dziewięć'
|
|
21
|
+
};
|
|
22
|
+
this.tens = {
|
|
23
|
+
0: 'dziesięć',
|
|
24
|
+
1: 'jedenaście',
|
|
25
|
+
2: 'dwanaście',
|
|
26
|
+
3: 'trzynaście',
|
|
27
|
+
4: 'czternaście',
|
|
28
|
+
5: 'piętnaście',
|
|
29
|
+
6: 'szesnaście',
|
|
30
|
+
7: 'siedemnaście',
|
|
31
|
+
8: 'osiemnaście',
|
|
32
|
+
9: 'dziewiętnaście'
|
|
33
|
+
};
|
|
34
|
+
this.twenties = {
|
|
35
|
+
2: 'dwadzieścia',
|
|
36
|
+
3: 'trzydzieści',
|
|
37
|
+
4: 'czterdzieści',
|
|
38
|
+
5: 'pięćdziesiąt',
|
|
39
|
+
6: 'sześćdziesiąt',
|
|
40
|
+
7: 'siedemdziesiąt',
|
|
41
|
+
8: 'osiemdziesiąt',
|
|
42
|
+
9: 'dziewięćdzisiąt'
|
|
43
|
+
};
|
|
44
|
+
this.hundreds = {
|
|
45
|
+
1: 'sto',
|
|
46
|
+
2: 'dwieście',
|
|
47
|
+
3: 'trzysta',
|
|
48
|
+
4: 'czterysta',
|
|
49
|
+
5: 'pięćset',
|
|
50
|
+
6: 'sześćset',
|
|
51
|
+
7: 'siedemset',
|
|
52
|
+
8: 'osiemset',
|
|
53
|
+
9: 'dziewięćset'
|
|
54
|
+
};
|
|
55
|
+
this.thousands = {
|
|
56
|
+
1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3
|
|
57
|
+
2: ['milion', 'miliony', 'milionów'], // 10^ 6
|
|
58
|
+
3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9
|
|
59
|
+
4: ['bilion', 'biliony', 'bilionów'], // 10^ 12
|
|
60
|
+
5: ['biliard', 'biliardy', 'biliardów'], // 10^ 15
|
|
61
|
+
6: ['trylion', 'tryliony', 'trylionów'], // 10^ 18
|
|
62
|
+
7: ['tryliard', 'tryliardy', 'tryliardów'], // 10^ 21
|
|
63
|
+
8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'], // 10^ 24
|
|
64
|
+
9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'], // 10^ 27
|
|
65
|
+
10: ['kwintylion', 'kwintyliony', 'kwintylionów'], // 10^ 30
|
|
66
|
+
};
|
|
67
|
+
}
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
pluralize(n, forms) {
|
|
68
70
|
let form = 2;
|
|
69
71
|
if (n == 1) {
|
|
70
72
|
form = 0;
|
|
@@ -72,14 +74,14 @@ export default function () {
|
|
|
72
74
|
form = 1;
|
|
73
75
|
}
|
|
74
76
|
return forms[form];
|
|
75
|
-
}
|
|
77
|
+
}
|
|
76
78
|
|
|
77
|
-
|
|
79
|
+
toCardinal(number) {
|
|
78
80
|
if (parseInt(number) == 0) {
|
|
79
|
-
return this.
|
|
81
|
+
return this.zero;
|
|
80
82
|
}
|
|
81
83
|
const words = [];
|
|
82
|
-
const chunks = this.
|
|
84
|
+
const chunks = this.splitByX(JSON.stringify(number), 3);
|
|
83
85
|
let i = chunks.length;
|
|
84
86
|
for (let j = 0; j < chunks.length; j++) {
|
|
85
87
|
const x = chunks[j];
|
|
@@ -87,22 +89,26 @@ export default function () {
|
|
|
87
89
|
if (x == 0) {
|
|
88
90
|
continue;
|
|
89
91
|
}
|
|
90
|
-
const [n1, n2, n3] = this.
|
|
92
|
+
const [n1, n2, n3] = this.getDigits(x);
|
|
91
93
|
if (n3 > 0) {
|
|
92
|
-
words.push(this.
|
|
94
|
+
words.push(this.hundreds[n3]);
|
|
93
95
|
}
|
|
94
96
|
if (n2 > 1) {
|
|
95
|
-
words.push(this.
|
|
97
|
+
words.push(this.twenties[n2]);
|
|
96
98
|
}
|
|
97
99
|
if (n2 == 1) {
|
|
98
|
-
words.push(this.
|
|
100
|
+
words.push(this.tens[n1]);
|
|
99
101
|
} else if (n1 > 0 && !(i > 0 && x == 1)) {
|
|
100
|
-
words.push(this.
|
|
102
|
+
words.push(this.ones[n1]);
|
|
101
103
|
}
|
|
102
104
|
if (i > 0) {
|
|
103
|
-
words.push(this.pluralize(x, this.
|
|
105
|
+
words.push(this.pluralize(x, this.thousands[i]));
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
return words.join(' ');
|
|
107
|
-
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export default function(n) {
|
|
113
|
+
return new N2WordsPL().floatToCardinal(n);
|
|
108
114
|
}
|
package/lib/i18n/PT.mjs
CHANGED
|
@@ -1,60 +1,62 @@
|
|
|
1
1
|
import N2WordsBase from '../classes/N2WordsBase.mjs';
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export class N2WordsPT extends N2WordsBase {
|
|
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
|
-
|
|
7
|
+
this.negativeWord = 'menos';
|
|
8
|
+
this.separatorWord = 'vírgula';
|
|
9
|
+
this.zero = 'zero';
|
|
10
|
+
this.cards = [
|
|
11
|
+
{ '1000000000000000000000000': 'quatrilião' },
|
|
12
|
+
{ 1000000000000000000: 'trilião' },
|
|
13
|
+
{ 1000000000000: 'bilião' },
|
|
14
|
+
{ 1000000: 'milião' },
|
|
15
|
+
{ 1000: 'mil' },
|
|
16
|
+
{ 100: 'cem' },
|
|
17
|
+
{ 90: 'noventa' },
|
|
18
|
+
{ 80: 'oitenta' },
|
|
19
|
+
{ 70: 'setenta' },
|
|
20
|
+
{ 60: 'sessenta' },
|
|
21
|
+
{ 50: 'cinquenta' },
|
|
22
|
+
{ 40: 'quarenta' },
|
|
23
|
+
{ 30: 'trinta' },
|
|
24
|
+
{ 20: 'vinte' },
|
|
25
|
+
{ 19: 'dezanove' },
|
|
26
|
+
{ 18: 'dezoito' },
|
|
27
|
+
{ 17: 'dezassete' },
|
|
28
|
+
{ 16: 'dezasseis' },
|
|
29
|
+
{ 15: 'quinze' },
|
|
30
|
+
{ 14: 'catorze' },
|
|
31
|
+
{ 13: 'treze' },
|
|
32
|
+
{ 12: 'doze' },
|
|
33
|
+
{ 11: 'onze' },
|
|
34
|
+
{ 10: 'dez' },
|
|
35
|
+
{ 9: 'nove' },
|
|
36
|
+
{ 8: 'oito' },
|
|
37
|
+
{ 7: 'sete' },
|
|
38
|
+
{ 6: 'seis' },
|
|
39
|
+
{ 5: 'cinco' },
|
|
40
|
+
{ 4: 'quatro' },
|
|
41
|
+
{ 3: 'três' },
|
|
42
|
+
{ 2: 'dois' },
|
|
43
|
+
{ 1: 'um' },
|
|
44
|
+
{ 0: 'zero' }
|
|
45
|
+
];
|
|
46
|
+
this.hundreds = {
|
|
47
|
+
1: 'cento',
|
|
48
|
+
2: 'duzentos',
|
|
49
|
+
3: 'trezentos',
|
|
50
|
+
4: 'quatrocentos',
|
|
51
|
+
5: 'quinhentos',
|
|
52
|
+
6: 'seiscentos',
|
|
53
|
+
7: 'setecentos',
|
|
54
|
+
8: 'oitocentos',
|
|
55
|
+
9: 'novecentos'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
postClean(words) {
|
|
58
60
|
const transforms = ['mil', 'milhão', 'milhões', 'mil milhões', 'bilião', 'biliões', 'mil biliões'];
|
|
59
61
|
for (let i = 0; i < transforms.length; i++) {
|
|
60
62
|
const ext = transforms[i];
|
|
@@ -63,37 +65,43 @@ export default function () {
|
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
return words;
|
|
66
|
-
}
|
|
68
|
+
}
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
let
|
|
70
|
-
let
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
merge(curr, next) {
|
|
71
|
+
let cText = Object.keys(curr)[0];
|
|
72
|
+
let nText = Object.keys(next)[0];
|
|
73
|
+
const cNum = parseInt(Object.values(curr)[0]);
|
|
74
|
+
const nNum = parseInt(Object.values(next)[0]);
|
|
75
|
+
if (cNum == 1) {
|
|
76
|
+
if (nNum < 1000000) return { [nText]: nNum };
|
|
77
|
+
cText = 'um';
|
|
78
|
+
} else if (cNum == 100 && nNum % 1000 != 0) {
|
|
79
|
+
cText = 'cento';
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
if (
|
|
79
|
-
// if (
|
|
80
|
-
// return { [`${
|
|
82
|
+
if (nNum < cNum) {
|
|
83
|
+
// if (cNum < 100) {
|
|
84
|
+
// return { [`${cText} e ${nText}`]: cNum + nNum }
|
|
81
85
|
// }
|
|
82
|
-
return { [`${
|
|
83
|
-
} else if (
|
|
84
|
-
|
|
85
|
-
} else if (
|
|
86
|
-
|
|
86
|
+
return { [`${cText} e ${nText}`]: cNum + nNum };
|
|
87
|
+
} else if (nNum % 1000000000 == 0 && cNum > 1) {
|
|
88
|
+
nText = nText.slice(0, -4) + 'liões';
|
|
89
|
+
} else if (nNum % 1000000 == 0 && cNum > 1) {
|
|
90
|
+
nText = nText.slice(0, -4) + 'lhões';
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
if (
|
|
93
|
+
if (nText == 'milião') nText = 'milhão';
|
|
90
94
|
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
if (nNum == 100) {
|
|
96
|
+
cText = this.hundreds[cNum];
|
|
97
|
+
nText = '';
|
|
94
98
|
} else {
|
|
95
|
-
|
|
99
|
+
nText = ' ' + nText;
|
|
96
100
|
}
|
|
97
|
-
return { [`${
|
|
98
|
-
}
|
|
101
|
+
return { [`${cText}${nText}`]: cNum * nNum };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export default function(n) {
|
|
106
|
+
return new N2WordsPT().floatToCardinal(n);
|
|
99
107
|
}
|