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/lib/i18n/RU.mjs CHANGED
@@ -1,81 +1,83 @@
1
1
  import N2WordsAbs from '../classes/N2WordsAbs.mjs';
2
2
 
3
- export default function () {
4
- N2WordsAbs.call(this);
3
+ export class N2WordsRU extends N2WordsAbs {
4
+ constructor() {
5
+ super();
5
6
 
6
- this.feminine = false;
7
- this.negative_word = 'минус';
8
- this.separator_word = 'запятая';
9
- this.ZERO = 'ноль';
10
- this.ONES = {
11
- 1: 'один',
12
- 2: 'два',
13
- 3: 'три',
14
- 4: 'четыре',
15
- 5: 'пять',
16
- 6: 'шесть',
17
- 7: 'семь',
18
- 8: 'восемь',
19
- 9: 'девять'
20
- };
21
- this.ONES_FEMININE = {
22
- 1: 'одна',
23
- 2: 'две',
24
- 3: 'три',
25
- 4: 'четыре',
26
- 5: 'пять',
27
- 6: 'шесть',
28
- 7: 'семь',
29
- 8: 'восемь',
30
- 9: 'девять'
31
- };
32
- this.TENS = {
33
- 0: 'десять',
34
- 1: 'одиннадцать',
35
- 2: 'двенадцать',
36
- 3: 'тринадцать',
37
- 4: 'четырнадцать',
38
- 5: 'пятнадцать',
39
- 6: 'шестнадцать',
40
- 7: 'семнадцать',
41
- 8: 'восемнадцать',
42
- 9: 'девятнадцать'
43
- };
44
- this.TWENTIES = {
45
- 2: 'двадцать',
46
- 3: 'тридцать',
47
- 4: 'сорок',
48
- 5: 'пятьдесят',
49
- 6: 'шестьдесят',
50
- 7: 'семьдесят',
51
- 8: 'восемьдесят',
52
- 9: 'девяносто'
53
- };
54
- this.HUNDREDS = {
55
- 1: 'сто',
56
- 2: 'двести',
57
- 3: 'триста',
58
- 4: 'четыреста',
59
- 5: 'пятьсот',
60
- 6: 'шестьсот',
61
- 7: 'семьсот',
62
- 8: 'восемьсот',
63
- 9: 'девятьсот'
64
- };
65
- this.THOUSANDS = {
66
- 1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3
67
- 2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6
68
- 3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9
69
- 4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12
70
- 5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15
71
- 6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18
72
- 7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21
73
- 8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24
74
- 9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27
75
- 10: ['нониллион', 'нониллиона', 'нониллионов'], // 10^ 30
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
- this.splitbyx = (n, x, format_int = true) => {
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 (format_int) {
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 (format_int) {
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 (format_int) {
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
- this.get_digits = (n) => {
112
+ getDigits(n) {
111
113
  const a = Array.from(JSON.stringify(n).padStart(3, '0').slice(-3)).reverse();
112
- return a.map((e) => parseInt(e));
113
- };
114
+ return a.map(e => parseInt(e));
115
+ }
114
116
 
115
- this.pluralize = (n, forms) => {
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
- this.toCardinal = (number) => {
129
+ toCardinal(number) {
128
130
  if (parseInt(number) == 0) {
129
- return this.ZERO;
131
+ return this.zero;
130
132
  }
131
133
  const words = [];
132
- const chunks = this.splitbyx(JSON.stringify(number), 3);
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.get_digits(x);
143
+ const [n1, n2, n3] = this.getDigits(x);
142
144
  if (n3 > 0) {
143
- words.push(this.HUNDREDS[n3]);
145
+ words.push(this.hundreds[n3]);
144
146
  }
145
147
  if (n2 > 1) {
146
- words.push(this.TWENTIES[n2]);
148
+ words.push(this.twenties[n2]);
147
149
  }
148
150
  if (n2 == 1) {
149
- words.push(this.TENS[n1]);
151
+ words.push(this.tens[n1]);
150
152
  } else if (n1 > 0) {
151
- ones = (i == 1 || this.feminine && i == 0) ? this.ONES_FEMININE : this.ONES;
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.THOUSANDS[i]));
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 Num2Word_RU from './RU.mjs';
1
+ import {N2WordsRU} from './RU.mjs';
2
2
 
3
- export default function () {
4
- Num2Word_RU.call(this);
3
+ export class N2WordsSR extends N2WordsRU {
4
+ constructor() {
5
+ super();
5
6
 
6
- this.negative_word = 'minus';
7
- this.separator_word = 'zapeta';
8
- this.ZERO = 'nula';
9
- this.ONES = {
10
- 1: ['jedan', 'jedna'],
11
- 2: ['dva', 'dve'],
12
- 3: ['tri', 'tri'],
13
- 4: ['četiri', 'četiri'],
14
- 5: ['pet', 'pet'],
15
- 6: ['šest', 'šest'],
16
- 7: ['sedam', 'sedam'],
17
- 8: ['osam', 'osam'],
18
- 9: ['devet', 'devet']
19
- };
20
- this.TENS = {
21
- 0: 'deset',
22
- 1: 'jedanaest',
23
- 2: 'dvanaest',
24
- 3: 'trinaest',
25
- 4: 'četrnaest',
26
- 5: 'petnaest',
27
- 6: 'šesnaest',
28
- 7: 'sedamnaest',
29
- 8: 'osamnaest',
30
- 9: 'devetnaest'
31
- };
32
- this.TWENTIES = {
33
- 2: 'dvadeset',
34
- 3: 'trideset',
35
- 4: 'četrdeset',
36
- 5: 'pedeset',
37
- 6: 'šezdeset',
38
- 7: 'sedamdeset',
39
- 8: 'osamdeset',
40
- 9: 'devedeset'
41
- };
42
- this.HUNDREDS = {
43
- 1: 'sto',
44
- 2: 'dvesta',
45
- 3: 'trista',
46
- 4: 'četristo',
47
- 5: 'petsto',
48
- 6: 'šesto',
49
- 7: 'sedamsto',
50
- 8: 'osamsto',
51
- 9: 'devetsto'
52
- };
53
- this.SCALE = {
54
- 0: ['', '', '', false],
55
- 1: ['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3
56
- 2: ['milion', 'miliona', 'miliona', false], // 10 ^ 6
57
- 3: ['bilion', 'biliona', 'biliona', false], // 10 ^ 9
58
- 4: ['trilion', 'triliona', 'triliona', false], // 10 ^ 12
59
- 5: ['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 15
60
- 6: ['kvintilion', 'kvintiliona', 'kvintiliona', false], // 10 ^ 18
61
- 7: ['sekstilion', 'sekstiliona', 'sekstiliona', false], // 10 ^ 21
62
- 8: ['septilion', 'septiliona', 'septiliona', false], // 10 ^ 24
63
- 9: ['oktilion', 'oktiliona', 'oktiliona', false], // 10 ^ 27
64
- 10: ['nonilion', 'noniliona', 'noniliona', false], // 10 ^ 30
65
- };
66
- this.feminine = false;
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
- this.pluralize = (n, forms) => {
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
- this.toCardinal = (number) => {
82
+ toCardinal(number) {
81
83
  if (parseInt(number) == 0) {
82
- return this.ZERO;
84
+ return this.zero;
83
85
  }
84
86
  const words = [];
85
- const chunks = this.splitbyx(JSON.stringify(number), 3);
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.get_digits(x);
93
+ const [n1, n2, n3] = this.getDigits(x);
92
94
  if (n3 > 0) {
93
- words.push(this.HUNDREDS[n3]);
95
+ words.push(this.hundreds[n3]);
94
96
  }
95
97
  if (n2 > 1) {
96
- words.push(this.TWENTIES[n2]);
98
+ words.push(this.twenties[n2]);
97
99
  }
98
100
  if (n2 == 1) {
99
- words.push(this.TENS[n1]);
101
+ words.push(this.tens[n1]);
100
102
  } else if (n1 > 0) {
101
- const is_feminine = (this.feminine || this.SCALE[i][3]);
102
- const gender_idx = is_feminine ? 1 : 0;
103
- words.push(this.ONES[n1][gender_idx]);
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
  }