n2words 1.13.0 → 1.14.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/lib/i18n/PT.mjs CHANGED
@@ -1,48 +1,48 @@
1
- import N2WordsBase from '../classes/N2WordsBase.mjs';
1
+ import BaseLanguage from '../classes/BaseLanguage.mjs';
2
2
 
3
- export class N2WordsPT extends N2WordsBase {
3
+ export class N2WordsPT extends BaseLanguage {
4
4
  constructor() {
5
- super();
5
+ super({
6
+ negativeWord: 'menos',
7
+ separatorWord: 'vírgula',
8
+ zero: 'zero'
9
+ },[
10
+ [1000000000000000000000000n, 'quatrilião'],
11
+ [1000000000000000000n, 'trilião'],
12
+ [1000000000000n, 'bilião'],
13
+ [1000000n, 'milião'],
14
+ [1000n, 'mil'],
15
+ [100n, 'cem'],
16
+ [90n, 'noventa'],
17
+ [80n, 'oitenta'],
18
+ [70n, 'setenta'],
19
+ [60n, 'sessenta'],
20
+ [50n, 'cinquenta'],
21
+ [40n, 'quarenta'],
22
+ [30n, 'trinta'],
23
+ [20n, 'vinte'],
24
+ [19n, 'dezanove'],
25
+ [18n, 'dezoito'],
26
+ [17n, 'dezassete'],
27
+ [16n, 'dezasseis'],
28
+ [15n, 'quinze'],
29
+ [14n, 'catorze'],
30
+ [13n, 'treze'],
31
+ [12n, 'doze'],
32
+ [11n, 'onze'],
33
+ [10n, 'dez'],
34
+ [9n, 'nove'],
35
+ [8n, 'oito'],
36
+ [7n, 'sete'],
37
+ [6n, 'seis'],
38
+ [5n, 'cinco'],
39
+ [4n, 'quatro'],
40
+ [3n, 'três'],
41
+ [2n, 'dois'],
42
+ [1n, 'um'],
43
+ [0n, 'zero']
44
+ ]);
6
45
 
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
46
  this.hundreds = {
47
47
  1: 'cento',
48
48
  2: 'duzentos',
@@ -102,6 +102,12 @@ export class N2WordsPT extends N2WordsBase {
102
102
  }
103
103
  }
104
104
 
105
- export default function(n) {
106
- return new N2WordsPT().floatToCardinal(n);
105
+ /**
106
+ * Converts a value to cardinal (written) form.
107
+ * @param {number|string} value Number to be convert.
108
+ * @throws {Error} Value cannot be invalid.
109
+ * @returns {string} Value in cardinal (written) format.
110
+ */
111
+ export default function(value) {
112
+ return new N2WordsPT().floatToCardinal(value);
107
113
  }
package/lib/i18n/RU.mjs CHANGED
@@ -1,166 +1,196 @@
1
- import N2WordsAbs from '../classes/N2WordsAbs.mjs';
2
-
3
- export class N2WordsRU extends N2WordsAbs {
4
- constructor() {
5
- super();
6
-
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
- };
1
+ import AbstractLanguage from '../classes/AbstractLanguage.mjs';
2
+
3
+ export class N2WordsRU extends AbstractLanguage {
4
+ feminine = false;
5
+
6
+ ones = {
7
+ 1: 'один',
8
+ 2: 'два',
9
+ 3: 'три',
10
+ 4: 'четыре',
11
+ 5: 'пять',
12
+ 6: 'шесть',
13
+ 7: 'семь',
14
+ 8: 'восемь',
15
+ 9: 'девять'
16
+ };
17
+
18
+ onesFeminine = {
19
+ 1: 'одна',
20
+ 2: 'две',
21
+ 3: 'три',
22
+ 4: 'четыре',
23
+ 5: 'пять',
24
+ 6: 'шесть',
25
+ 7: 'семь',
26
+ 8: 'восемь',
27
+ 9: 'девять'
28
+ };
29
+
30
+ tens = {
31
+ 0: 'десять',
32
+ 1: 'одиннадцать',
33
+ 2: 'двенадцать',
34
+ 3: 'тринадцать',
35
+ 4: 'четырнадцать',
36
+ 5: 'пятнадцать',
37
+ 6: 'шестнадцать',
38
+ 7: 'семнадцать',
39
+ 8: 'восемнадцать',
40
+ 9: 'девятнадцать'
41
+ };
42
+
43
+ twenties = {
44
+ 2: 'двадцать',
45
+ 3: 'тридцать',
46
+ 4: 'сорок',
47
+ 5: 'пятьдесят',
48
+ 6: 'шестьдесят',
49
+ 7: 'семьдесят',
50
+ 8: 'восемьдесят',
51
+ 9: 'девяносто'
52
+ };
53
+
54
+ hundreds = {
55
+ 1: 'сто',
56
+ 2: 'двести',
57
+ 3: 'триста',
58
+ 4: 'четыреста',
59
+ 5: 'пятьсот',
60
+ 6: 'шестьсот',
61
+ 7: 'семьсот',
62
+ 8: 'восемьсот',
63
+ 9: 'девятьсот'
64
+ };
65
+
66
+ 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
+
79
+ constructor(options = {}) {
80
+ super(Object.assign({
81
+ negativeWord: 'минус',
82
+ separatorWord: 'запятая',
83
+ zero: 'ноль'
84
+ }, options));
85
+ }
86
+
87
+ toCardinal(number) {
88
+ if (number == 0) {
89
+ return this.zero;
90
+ }
91
+
92
+ const words = [];
93
+
94
+ const chunks = this.splitByX(number.toString(), 3);
95
+
96
+ let i = chunks.length;
97
+
98
+ for (let j = 0; j < chunks.length; j++) {
99
+ const x = chunks[j];
100
+ let ones = [];
101
+ i = i - 1;
102
+
103
+ if (x == 0) {
104
+ continue;
105
+ }
106
+
107
+ const [n1, n2, n3] = this.getDigits(x);
108
+
109
+ if (n3 > 0) {
110
+ words.push(this.hundreds[n3]);
111
+ }
112
+
113
+ if (n2 > 1) {
114
+ words.push(this.twenties[n2]);
115
+ }
116
+
117
+ if (n2 == 1) {
118
+ words.push(this.tens[n1]);
119
+ } else if (n1 > 0) {
120
+ ones = (i == 1 || this.feminine && i == 0) ? this.onesFeminine : this.ones;
121
+ words.push(ones[n1]);
122
+ }
123
+
124
+ if (i > 0) {
125
+ words.push(this.pluralize(x, this.thousands[i]));
126
+ }
127
+ }
128
+
129
+ return words.join(' ');
78
130
  }
79
131
 
80
132
  splitByX(n, x, formatInt = true) {
81
133
  const results = [];
82
134
  const l = n.length;
83
135
  let result;
136
+
84
137
  if (l > x) {
85
138
  const start = l % x;
139
+
86
140
  if (start > 0) {
87
141
  result = n.slice(0, start);
142
+
88
143
  if (formatInt) {
89
- results.push(parseInt(result));
144
+ results.push(BigInt(result));
90
145
  } else {
91
146
  results.push(result);
92
147
  }
93
148
  }
149
+
94
150
  for (let i = start; i < l; i += x) {
95
151
  result = n.slice(i, i + x);
152
+
96
153
  if (formatInt) {
97
- results.push(parseInt(result));
154
+ results.push(BigInt(result));
98
155
  } else {
99
156
  results.push(result);
100
157
  }
101
158
  }
102
159
  } else {
103
160
  if (formatInt) {
104
- results.push(parseInt(n));
161
+ results.push(BigInt(n));
105
162
  } else {
106
163
  results.push(n);
107
164
  }
108
165
  }
166
+
109
167
  return results;
110
168
  }
111
169
 
112
- getDigits(n) {
113
- const a = Array.from(JSON.stringify(n).padStart(3, '0').slice(-3)).reverse();
114
- return a.map(e => parseInt(e));
170
+ getDigits(value) {
171
+ const a = Array.from(value.toString().padStart(3, '0').slice(-3)).reverse();
172
+ return a.map(e => BigInt(e));
115
173
  }
116
174
 
117
175
  pluralize(n, forms) {
118
176
  let form = 2;
119
- if ((n % 100 < 10) || (n % 100 > 20)) {
120
- if (n % 10 == 1) {
177
+ if ((n % 100n < 10n) || (n % 100n > 20n)) {
178
+ if (n % 10n == 1n) {
121
179
  form = 0;
122
- } else if ((n % 10 < 5) && (n % 10 > 1)) {
180
+ } else if ((n % 10n < 5n) && (n % 10n > 1n)) {
123
181
  form = 1;
124
182
  }
125
183
  }
126
184
  return forms[form];
127
185
  }
128
-
129
- toCardinal(number) {
130
- if (parseInt(number) == 0) {
131
- return this.zero;
132
- }
133
- const words = [];
134
- const chunks = this.splitByX(JSON.stringify(number), 3);
135
- let i = chunks.length;
136
- for (let j = 0; j < chunks.length; j++) {
137
- const x = chunks[j];
138
- let ones = [];
139
- i = i - 1;
140
- if (x == 0) {
141
- continue;
142
- }
143
- const [n1, n2, n3] = this.getDigits(x);
144
- if (n3 > 0) {
145
- words.push(this.hundreds[n3]);
146
- }
147
- if (n2 > 1) {
148
- words.push(this.twenties[n2]);
149
- }
150
- if (n2 == 1) {
151
- words.push(this.tens[n1]);
152
- } else if (n1 > 0) {
153
- ones = (i == 1 || this.feminine && i == 0) ? this.onesFeminine : this.ones;
154
- words.push(ones[n1]);
155
- }
156
- if (i > 0) {
157
- words.push(this.pluralize(x, this.thousands[i]));
158
- }
159
- }
160
- return words.join(' ');
161
- }
162
186
  }
163
187
 
164
- export default function(n) {
165
- return new N2WordsRU().floatToCardinal(n);
188
+ /**
189
+ * Converts a value to cardinal (written) form.
190
+ * @param {number|string} value Number to be convert.
191
+ * @throws {Error} Value cannot be invalid.
192
+ * @returns {string} Value in cardinal (written) format.
193
+ */
194
+ export default function(value) {
195
+ return new N2WordsRU().floatToCardinal(value);
166
196
  }
package/lib/i18n/SR.mjs CHANGED
@@ -1,78 +1,84 @@
1
1
  import {N2WordsRU} from './RU.mjs';
2
2
 
3
3
  export class N2WordsSR extends N2WordsRU {
4
- constructor() {
5
- super();
4
+ ones = {
5
+ 1: ['jedan', 'jedna'],
6
+ 2: ['dva', 'dve'],
7
+ 3: ['tri', 'tri'],
8
+ 4: ['četiri', 'četiri'],
9
+ 5: ['pet', 'pet'],
10
+ 6: ['šest', 'šest'],
11
+ 7: ['sedam', 'sedam'],
12
+ 8: ['osam', 'osam'],
13
+ 9: ['devet', 'devet']
14
+ };
15
+
16
+ tens = {
17
+ 0: 'deset',
18
+ 1: 'jedanaest',
19
+ 2: 'dvanaest',
20
+ 3: 'trinaest',
21
+ 4: 'četrnaest',
22
+ 5: 'petnaest',
23
+ 6: 'šesnaest',
24
+ 7: 'sedamnaest',
25
+ 8: 'osamnaest',
26
+ 9: 'devetnaest'
27
+ };
28
+
29
+ twenties = {
30
+ 2: 'dvadeset',
31
+ 3: 'trideset',
32
+ 4: 'četrdeset',
33
+ 5: 'pedeset',
34
+ 6: 'šezdeset',
35
+ 7: 'sedamdeset',
36
+ 8: 'osamdeset',
37
+ 9: 'devedeset'
38
+ };
39
+
40
+ hundreds = {
41
+ 1: 'sto',
42
+ 2: 'dvesta',
43
+ 3: 'trista',
44
+ 4: 'četiristo',
45
+ 5: 'petsto',
46
+ 6: 'šesto',
47
+ 7: 'sedamsto',
48
+ 8: 'osamsto',
49
+ 9: 'devetsto'
50
+ };
6
51
 
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;
52
+ SCALE = {
53
+ 0: ['', '', '', false],
54
+ 1: ['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3
55
+ 2: ['milion', 'miliona', 'miliona', false], // 10 ^ 6
56
+ 3: ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9
57
+ 4: ['bilion', 'biliona', 'biliona', false], // 10 ^ 12
58
+ 5: ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15
59
+ 6: ['trilion', 'triliona', 'triliona', false], // 10 ^ 18
60
+ 7: ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21
61
+ 8: ['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 24
62
+ 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27
63
+ 10: ['kvintilion', 'kvintiliona', 'kvintiliona', false], // 10 ^ 30
64
+ };
65
+
66
+ feminine = false;
67
+
68
+ constructor() {
69
+ super({
70
+ negativeWord: 'minus',
71
+ separatorWord: 'zapeta',
72
+ zero: 'nula'
73
+ });
68
74
  }
69
75
 
70
76
  pluralize(n, forms) {
71
77
  let form = 2;
72
- if ((n % 100 < 10) || (n % 100 > 20)) {
73
- if (n % 10 == 1) {
78
+ if ((n % 100n < 10n) || (n % 100n > 20n)) {
79
+ if (n % 10n == 1n) {
74
80
  form = 0;
75
- } else if ((n % 10 > 1) && (n % 10 < 5)) {
81
+ } else if ((n % 10n > 1n) && (n % 10n < 5n)) {
76
82
  form = 1;
77
83
  }
78
84
  }
@@ -80,11 +86,11 @@ export class N2WordsSR extends N2WordsRU {
80
86
  }
81
87
 
82
88
  toCardinal(number) {
83
- if (parseInt(number) == 0) {
89
+ if (number == 0) {
84
90
  return this.zero;
85
91
  }
86
92
  const words = [];
87
- const chunks = this.splitByX(JSON.stringify(number), 3);
93
+ const chunks = this.splitByX(number.toString(), 3);
88
94
  let i = chunks.length;
89
95
  for (let j = 0; j < chunks.length; j++) {
90
96
  const x = chunks[j];
@@ -112,6 +118,12 @@ export class N2WordsSR extends N2WordsRU {
112
118
  }
113
119
  }
114
120
 
115
- export default function(n) {
116
- return new N2WordsSR().floatToCardinal(n);
121
+ /**
122
+ * Converts a value to cardinal (written) form.
123
+ * @param {number|string} value Number to be convert.
124
+ * @throws {Error} Value cannot be invalid.
125
+ * @returns {string} Value in cardinal (written) format.
126
+ */
127
+ export default function(value) {
128
+ return new N2WordsSR().floatToCardinal(value);
117
129
  }