n2words 1.24.0 → 3.0.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/CHANGELOG.md +49 -0
- package/README.md +183 -156
- package/dist/languages/am-Latn.js +3 -0
- package/dist/languages/am-Latn.js.map +1 -0
- package/dist/languages/am.js +3 -0
- package/dist/languages/am.js.map +1 -0
- package/dist/languages/ar.js +3 -2
- package/dist/languages/ar.js.map +1 -1
- package/dist/languages/az.js +3 -2
- package/dist/languages/az.js.map +1 -1
- package/dist/languages/bn.js +3 -2
- package/dist/languages/bn.js.map +1 -1
- package/dist/languages/cs.js +3 -2
- package/dist/languages/cs.js.map +1 -1
- package/dist/languages/da.js +3 -2
- package/dist/languages/da.js.map +1 -1
- package/dist/languages/de.js +3 -2
- package/dist/languages/de.js.map +1 -1
- package/dist/languages/el.js +3 -2
- package/dist/languages/el.js.map +1 -1
- package/dist/languages/en.js +3 -2
- package/dist/languages/en.js.map +1 -1
- package/dist/languages/es.js +3 -2
- package/dist/languages/es.js.map +1 -1
- package/dist/languages/fa.js +3 -2
- package/dist/languages/fa.js.map +1 -1
- package/dist/languages/fi.js +3 -0
- package/dist/languages/fi.js.map +1 -0
- package/dist/languages/fil.js +3 -2
- package/dist/languages/fil.js.map +1 -1
- package/dist/languages/fr-BE.js +3 -2
- package/dist/languages/fr-BE.js.map +1 -1
- package/dist/languages/fr.js +3 -2
- package/dist/languages/fr.js.map +1 -1
- package/dist/languages/gu.js +3 -2
- package/dist/languages/gu.js.map +1 -1
- package/dist/languages/ha.js +3 -0
- package/dist/languages/ha.js.map +1 -0
- package/dist/languages/hbo.js +3 -0
- package/dist/languages/hbo.js.map +1 -0
- package/dist/languages/he.js +3 -2
- package/dist/languages/he.js.map +1 -1
- package/dist/languages/hi.js +3 -2
- package/dist/languages/hi.js.map +1 -1
- package/dist/languages/hr.js +3 -2
- package/dist/languages/hr.js.map +1 -1
- package/dist/languages/hu.js +3 -2
- package/dist/languages/hu.js.map +1 -1
- package/dist/languages/id.js +3 -2
- package/dist/languages/id.js.map +1 -1
- package/dist/languages/it.js +3 -2
- package/dist/languages/it.js.map +1 -1
- package/dist/languages/ja.js +3 -2
- package/dist/languages/ja.js.map +1 -1
- package/dist/languages/kn.js +3 -2
- package/dist/languages/kn.js.map +1 -1
- package/dist/languages/ko.js +3 -2
- package/dist/languages/ko.js.map +1 -1
- package/dist/languages/lt.js +3 -2
- package/dist/languages/lt.js.map +1 -1
- package/dist/languages/lv.js +3 -2
- package/dist/languages/lv.js.map +1 -1
- package/dist/languages/mr.js +3 -2
- package/dist/languages/mr.js.map +1 -1
- package/dist/languages/ms.js +3 -2
- package/dist/languages/ms.js.map +1 -1
- package/dist/languages/nb.js +3 -2
- package/dist/languages/nb.js.map +1 -1
- package/dist/languages/nl.js +3 -2
- package/dist/languages/nl.js.map +1 -1
- package/dist/languages/pa.js +3 -0
- package/dist/languages/pa.js.map +1 -0
- package/dist/languages/pl.js +3 -2
- package/dist/languages/pl.js.map +1 -1
- package/dist/languages/pt.js +3 -2
- package/dist/languages/pt.js.map +1 -1
- package/dist/languages/ro.js +3 -2
- package/dist/languages/ro.js.map +1 -1
- package/dist/languages/ru.js +3 -2
- package/dist/languages/ru.js.map +1 -1
- package/dist/languages/sr-Cyrl.js +3 -0
- package/dist/languages/sr-Cyrl.js.map +1 -0
- package/dist/languages/sr-Latn.js +3 -2
- package/dist/languages/sr-Latn.js.map +1 -1
- package/dist/languages/sv.js +3 -2
- package/dist/languages/sv.js.map +1 -1
- package/dist/languages/sw.js +3 -2
- package/dist/languages/sw.js.map +1 -1
- package/dist/languages/ta.js +3 -2
- package/dist/languages/ta.js.map +1 -1
- package/dist/languages/te.js +3 -2
- package/dist/languages/te.js.map +1 -1
- package/dist/languages/th.js +3 -2
- package/dist/languages/th.js.map +1 -1
- package/dist/languages/tr.js +3 -2
- package/dist/languages/tr.js.map +1 -1
- package/dist/languages/uk.js +3 -2
- package/dist/languages/uk.js.map +1 -1
- package/dist/languages/ur.js +3 -2
- package/dist/languages/ur.js.map +1 -1
- package/dist/languages/vi.js +3 -2
- package/dist/languages/vi.js.map +1 -1
- package/dist/languages/zh-Hans.js +3 -2
- package/dist/languages/zh-Hans.js.map +1 -1
- package/dist/languages/zh-Hant.js +3 -0
- package/dist/languages/zh-Hant.js.map +1 -0
- package/dist/n2words.js +3 -2
- package/dist/n2words.js.map +1 -1
- package/lib/languages/am-Latn.d.ts +7 -0
- package/lib/languages/am-Latn.js +164 -0
- package/lib/languages/am.d.ts +7 -0
- package/lib/languages/am.js +164 -0
- package/lib/languages/ar.d.ts +17 -0
- package/lib/languages/ar.js +171 -209
- package/lib/languages/az.d.ts +7 -0
- package/lib/languages/az.js +167 -49
- package/lib/languages/bn.d.ts +7 -0
- package/lib/languages/bn.js +142 -123
- package/lib/languages/cs.d.ts +18 -0
- package/lib/languages/cs.js +303 -176
- package/lib/languages/da.d.ts +14 -0
- package/lib/languages/da.js +267 -139
- package/lib/languages/de.d.ts +17 -0
- package/lib/languages/de.js +310 -113
- package/lib/languages/el.d.ts +14 -0
- package/lib/languages/el.js +225 -98
- package/lib/languages/en.d.ts +17 -0
- package/lib/languages/en.js +235 -102
- package/lib/languages/es.d.ts +21 -0
- package/lib/languages/es.js +307 -125
- package/lib/languages/fa.d.ts +7 -0
- package/lib/languages/fa.js +115 -108
- package/lib/languages/fi.d.ts +14 -0
- package/lib/languages/fi.js +245 -0
- package/lib/languages/fil.d.ts +7 -0
- package/lib/languages/fil.js +199 -139
- package/lib/languages/fr-BE.d.ts +11 -0
- package/lib/languages/fr-BE.js +287 -48
- package/lib/languages/fr.d.ts +21 -0
- package/lib/languages/fr.js +343 -119
- package/lib/languages/gu.d.ts +7 -0
- package/lib/languages/gu.js +125 -144
- package/lib/languages/ha.d.ts +7 -0
- package/lib/languages/ha.js +230 -0
- package/lib/languages/hbo.d.ts +13 -0
- package/lib/languages/hbo.js +300 -0
- package/lib/languages/he.d.ts +13 -0
- package/lib/languages/he.js +230 -283
- package/lib/languages/hi.d.ts +7 -0
- package/lib/languages/hi.js +142 -123
- package/lib/languages/hr.d.ts +11 -0
- package/lib/languages/hr.js +190 -129
- package/lib/languages/hu.d.ts +7 -0
- package/lib/languages/hu.js +194 -133
- package/lib/languages/id.d.ts +7 -0
- package/lib/languages/id.js +167 -140
- package/lib/languages/it.d.ts +19 -0
- package/lib/languages/it.js +337 -108
- package/lib/languages/ja.d.ts +17 -0
- package/lib/languages/ja.js +224 -155
- package/lib/languages/kn.d.ts +7 -0
- package/lib/languages/kn.js +128 -62
- package/lib/languages/ko.d.ts +14 -0
- package/lib/languages/ko.js +250 -70
- package/lib/languages/lt.d.ts +18 -0
- package/lib/languages/lt.js +287 -148
- package/lib/languages/lv.d.ts +18 -0
- package/lib/languages/lv.js +291 -123
- package/lib/languages/mr.d.ts +7 -0
- package/lib/languages/mr.js +125 -144
- package/lib/languages/ms.d.ts +7 -0
- package/lib/languages/ms.js +171 -112
- package/lib/languages/nb.d.ts +14 -0
- package/lib/languages/nb.js +275 -100
- package/lib/languages/nl.d.ts +26 -0
- package/lib/languages/nl.js +307 -174
- package/lib/languages/pa.d.ts +7 -0
- package/lib/languages/pa.js +163 -0
- package/lib/languages/pl.d.ts +22 -0
- package/lib/languages/pl.js +299 -158
- package/lib/languages/pt.d.ts +17 -0
- package/lib/languages/pt.js +279 -120
- package/lib/languages/ro.d.ts +18 -0
- package/lib/languages/ro.js +214 -337
- package/lib/languages/ru.d.ts +11 -0
- package/lib/languages/ru.js +219 -95
- package/lib/languages/sr-Cyrl.d.ts +11 -0
- package/lib/languages/sr-Cyrl.js +215 -0
- package/lib/languages/sr-Latn.d.ts +11 -0
- package/lib/languages/sr-Latn.js +190 -132
- package/lib/languages/sv.d.ts +14 -0
- package/lib/languages/sv.js +280 -103
- package/lib/languages/sw.d.ts +7 -0
- package/lib/languages/sw.js +135 -103
- package/lib/languages/ta.d.ts +7 -0
- package/lib/languages/ta.js +133 -205
- package/lib/languages/te.d.ts +7 -0
- package/lib/languages/te.js +148 -213
- package/lib/languages/th.d.ts +7 -0
- package/lib/languages/th.js +139 -101
- package/lib/languages/tr.d.ts +18 -0
- package/lib/languages/tr.js +246 -66
- package/lib/languages/uk.d.ts +11 -0
- package/lib/languages/uk.js +197 -101
- package/lib/languages/ur.d.ts +7 -0
- package/lib/languages/ur.js +160 -123
- package/lib/languages/vi.d.ts +17 -0
- package/lib/languages/vi.js +287 -164
- package/lib/languages/zh-Hans.d.ts +11 -0
- package/lib/languages/zh-Hans.js +159 -142
- package/lib/languages/zh-Hant.d.ts +11 -0
- package/lib/languages/zh-Hant.js +202 -0
- package/lib/n2words.d.ts +53 -0
- package/lib/n2words.js +91 -227
- package/lib/utils/is-plain-object.d.ts +13 -0
- package/lib/utils/is-plain-object.js +17 -0
- package/lib/utils/parse-numeric.d.ts +17 -0
- package/lib/utils/parse-numeric.js +108 -0
- package/lib/utils/validate-options.d.ts +8 -0
- package/lib/utils/validate-options.js +16 -0
- package/package.json +118 -67
- package/dist/languages/pa-Guru.js +0 -2
- package/dist/languages/pa-Guru.js.map +0 -1
- package/lib/classes/abstract-language.js +0 -261
- package/lib/classes/greedy-scale-language.js +0 -195
- package/lib/classes/slavic-language.js +0 -251
- package/lib/classes/south-asian-language.js +0 -161
- package/lib/classes/turkic-language.js +0 -63
- package/lib/languages/pa-Guru.js +0 -126
- package/typings/classes/abstract-language.d.ts +0 -144
- package/typings/classes/greedy-scale-language.d.ts +0 -148
- package/typings/classes/slavic-language.d.ts +0 -145
- package/typings/classes/south-asian-language.d.ts +0 -101
- package/typings/classes/turkic-language.d.ts +0 -42
- package/typings/languages/ar.d.ts +0 -93
- package/typings/languages/az.d.ts +0 -25
- package/typings/languages/bn.d.ts +0 -1
- package/typings/languages/cs.d.ts +0 -120
- package/typings/languages/da.d.ts +0 -53
- package/typings/languages/de.d.ts +0 -26
- package/typings/languages/el.d.ts +0 -11
- package/typings/languages/en.d.ts +0 -30
- package/typings/languages/es.d.ts +0 -43
- package/typings/languages/fa.d.ts +0 -81
- package/typings/languages/fil.d.ts +0 -12
- package/typings/languages/fr-BE.d.ts +0 -41
- package/typings/languages/fr.d.ts +0 -43
- package/typings/languages/gu.d.ts +0 -12
- package/typings/languages/he.d.ts +0 -197
- package/typings/languages/hi.d.ts +0 -1
- package/typings/languages/hr.d.ts +0 -110
- package/typings/languages/hu.d.ts +0 -37
- package/typings/languages/id.d.ts +0 -69
- package/typings/languages/it.d.ts +0 -51
- package/typings/languages/ja.d.ts +0 -58
- package/typings/languages/kn.d.ts +0 -11
- package/typings/languages/ko.d.ts +0 -25
- package/typings/languages/lt.d.ts +0 -110
- package/typings/languages/lv.d.ts +0 -99
- package/typings/languages/mr.d.ts +0 -12
- package/typings/languages/ms.d.ts +0 -37
- package/typings/languages/nb.d.ts +0 -27
- package/typings/languages/nl.d.ts +0 -65
- package/typings/languages/pa-Guru.d.ts +0 -1
- package/typings/languages/pl.d.ts +0 -116
- package/typings/languages/pt.d.ts +0 -39
- package/typings/languages/ro.d.ts +0 -229
- package/typings/languages/ru.d.ts +0 -108
- package/typings/languages/sr-Latn.d.ts +0 -98
- package/typings/languages/sv.d.ts +0 -30
- package/typings/languages/sw.d.ts +0 -1
- package/typings/languages/ta.d.ts +0 -1
- package/typings/languages/te.d.ts +0 -1
- package/typings/languages/th.d.ts +0 -1
- package/typings/languages/tr.d.ts +0 -46
- package/typings/languages/uk.d.ts +0 -117
- package/typings/languages/ur.d.ts +0 -1
- package/typings/languages/vi.d.ts +0 -116
- package/typings/languages/zh-Hans.d.ts +0 -57
- package/typings/n2words.d.ts +0 -177
package/lib/languages/hu.js
CHANGED
|
@@ -1,155 +1,216 @@
|
|
|
1
|
-
import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
* Hungarian language converter
|
|
2
|
+
* Hungarian language converter - Functional Implementation
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
* - Agglutinative structure for compound numbers
|
|
8
|
-
* - No spaces between tens and units (e.g., "huszonegy" = twenty-one)
|
|
9
|
-
* - Special handling for "egy" (one) - often omitted as multiplier
|
|
10
|
-
* - Vowel harmony in compound words
|
|
4
|
+
* Self-contained converter with agglutinative word formation.
|
|
11
5
|
*
|
|
12
|
-
*
|
|
13
|
-
* -
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Agglutinative structure (no spaces between compound parts)
|
|
8
|
+
* - Special handling for "egy" (one) omission
|
|
14
9
|
* - Pre-composed twenties (huszonegy through huszonkilenc)
|
|
15
|
-
* - "
|
|
16
|
-
* - Support for very large numbers (up to quadrilliards)
|
|
10
|
+
* - "két" instead of "kettő" in compound forms
|
|
17
11
|
*/
|
|
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
|
-
|
|
12
|
+
|
|
13
|
+
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Vocabulary
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
// Word map using BigInt keys for scale values
|
|
20
|
+
const WORDS = new Map([
|
|
21
|
+
[1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],
|
|
22
|
+
[1_000_000_000_000_000_000_000_000n, 'quadrillió'],
|
|
23
|
+
[1_000_000_000_000_000_000_000n, 'trilliárd'],
|
|
24
|
+
[1_000_000_000_000_000_000n, 'trillió'],
|
|
25
|
+
[1_000_000_000_000_000n, 'billiárd'],
|
|
26
|
+
[1_000_000_000_000n, 'billió'],
|
|
27
|
+
[1_000_000_000n, 'milliárd'],
|
|
28
|
+
[1_000_000n, 'millió'],
|
|
29
|
+
[1000n, 'ezer'],
|
|
30
|
+
[100n, 'száz'],
|
|
31
|
+
[90n, 'kilencven'],
|
|
32
|
+
[80n, 'nyolcvan'],
|
|
33
|
+
[70n, 'hetven'],
|
|
34
|
+
[60n, 'hatvan'],
|
|
35
|
+
[50n, 'ötven'],
|
|
36
|
+
[40n, 'negyven'],
|
|
37
|
+
[30n, 'harminc'],
|
|
38
|
+
[29n, 'huszonkilenc'],
|
|
39
|
+
[28n, 'huszonnyolc'],
|
|
40
|
+
[27n, 'huszonhét'],
|
|
41
|
+
[26n, 'huszonhat'],
|
|
42
|
+
[25n, 'huszonöt'],
|
|
43
|
+
[24n, 'huszonnégy'],
|
|
44
|
+
[23n, 'huszonhárom'],
|
|
45
|
+
[22n, 'huszonkettő'],
|
|
46
|
+
[21n, 'huszonegy'],
|
|
47
|
+
[20n, 'húsz'],
|
|
48
|
+
[19n, 'tizenkilenc'],
|
|
49
|
+
[18n, 'tizennyolc'],
|
|
50
|
+
[17n, 'tizenhét'],
|
|
51
|
+
[16n, 'tizenhat'],
|
|
52
|
+
[15n, 'tizenöt'],
|
|
53
|
+
[14n, 'tizennégy'],
|
|
54
|
+
[13n, 'tizenhárom'],
|
|
55
|
+
[12n, 'tizenkettő'],
|
|
56
|
+
[11n, 'tizenegy'],
|
|
57
|
+
[10n, 'tíz'],
|
|
58
|
+
[9n, 'kilenc'],
|
|
59
|
+
[8n, 'nyolc'],
|
|
60
|
+
[7n, 'hét'],
|
|
61
|
+
[6n, 'hat'],
|
|
62
|
+
[5n, 'öt'],
|
|
63
|
+
[4n, 'négy'],
|
|
64
|
+
[3n, 'három'],
|
|
65
|
+
[2n, 'kettő'],
|
|
66
|
+
[1n, 'egy'],
|
|
67
|
+
[0n, 'nulla']
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
const ZERO = 'nulla'
|
|
71
|
+
const NEGATIVE = 'mínusz'
|
|
72
|
+
const DECIMAL_SEP = 'egész'
|
|
73
|
+
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// Conversion Functions
|
|
76
|
+
// ============================================================================
|
|
77
|
+
|
|
78
|
+
function wordForScale (value) {
|
|
79
|
+
return WORDS.get(value)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function tensToCardinal (n) {
|
|
83
|
+
if (WORDS.has(n)) {
|
|
84
|
+
return WORDS.get(n)
|
|
81
85
|
}
|
|
86
|
+
const tens = n / 10n
|
|
87
|
+
const units = n % 10n
|
|
88
|
+
return wordForScale(tens * 10n) + integerToWordsInner(units)
|
|
89
|
+
}
|
|
82
90
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
const postfix = this.convertWholePart(number % 100n, '')
|
|
90
|
-
return prefix + postfix
|
|
91
|
+
function hundredsToCardinal (n) {
|
|
92
|
+
const hundreds = n / 100n
|
|
93
|
+
let prefix = 'száz'
|
|
94
|
+
if (hundreds !== 1n) {
|
|
95
|
+
prefix = integerToWordsInner(hundreds, '') + prefix
|
|
91
96
|
}
|
|
97
|
+
const postfix = integerToWordsInner(n % 100n, '')
|
|
98
|
+
return prefix + postfix
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function thousandsToCardinal (n) {
|
|
102
|
+
const thousands = n / 1000n
|
|
103
|
+
let prefix = 'ezer'
|
|
104
|
+
if (thousands !== 1n) {
|
|
105
|
+
prefix = integerToWordsInner(thousands, '') + prefix
|
|
106
|
+
}
|
|
107
|
+
const postfix = integerToWordsInner(n % 1000n, '')
|
|
108
|
+
const middle = (n <= 2000n || postfix === '') ? '' : '-'
|
|
109
|
+
return prefix + middle + postfix
|
|
110
|
+
}
|
|
92
111
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
112
|
+
// Scale values for finding appropriate scale (avoids toString)
|
|
113
|
+
const SCALES = [
|
|
114
|
+
1_000_000_000_000_000_000_000_000_000n,
|
|
115
|
+
1_000_000_000_000_000_000_000_000n,
|
|
116
|
+
1_000_000_000_000_000_000_000n,
|
|
117
|
+
1_000_000_000_000_000_000n,
|
|
118
|
+
1_000_000_000_000_000n,
|
|
119
|
+
1_000_000_000_000n,
|
|
120
|
+
1_000_000_000n,
|
|
121
|
+
1_000_000n
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
function bigNumberToCardinal (n) {
|
|
125
|
+
// Find appropriate scale using BigInt comparison (avoids toString)
|
|
126
|
+
let exp = 1_000_000n
|
|
127
|
+
for (const scale of SCALES) {
|
|
128
|
+
if (n >= scale) {
|
|
129
|
+
exp = scale
|
|
130
|
+
break
|
|
98
131
|
}
|
|
99
|
-
const postfix = this.convertWholePart(number % 1000n, '')
|
|
100
|
-
const middle = (number <= 2000n || postfix === '') ? '' : '-'
|
|
101
|
-
return prefix + middle + postfix
|
|
102
132
|
}
|
|
103
133
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
134
|
+
const prefix = integerToWordsInner(n / exp, '')
|
|
135
|
+
const rest = integerToWordsInner(n % exp, '')
|
|
136
|
+
const postfix = (rest === '') ? '' : ('-' + rest)
|
|
137
|
+
return prefix + wordForScale(exp) + postfix
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function integerToWordsInner (n, zeroWord = ZERO) {
|
|
141
|
+
// Normalize to BigInt for consistent comparisons
|
|
142
|
+
if (typeof n !== 'bigint') n = BigInt(n)
|
|
143
|
+
|
|
144
|
+
if (n === 0n) {
|
|
145
|
+
return zeroWord
|
|
146
|
+
}
|
|
147
|
+
if (zeroWord === '' && n === 2n) {
|
|
148
|
+
return 'két'
|
|
112
149
|
}
|
|
150
|
+
if (n < 30n) {
|
|
151
|
+
return wordForScale(n)
|
|
152
|
+
}
|
|
153
|
+
if (n < 100n) {
|
|
154
|
+
return tensToCardinal(n)
|
|
155
|
+
}
|
|
156
|
+
if (n < 1000n) {
|
|
157
|
+
return hundredsToCardinal(n)
|
|
158
|
+
}
|
|
159
|
+
if (n < 1_000_000n) {
|
|
160
|
+
return thousandsToCardinal(n)
|
|
161
|
+
}
|
|
162
|
+
return bigNumberToCardinal(n)
|
|
163
|
+
}
|
|
113
164
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
words = zeroWord
|
|
122
|
-
} else if (zeroWord === '' && number === 2n) {
|
|
123
|
-
words = 'két'
|
|
124
|
-
} else if (number < 30n) {
|
|
125
|
-
words = this.getScaleWord(number)
|
|
126
|
-
} else if (number < 100n) {
|
|
127
|
-
words = this.tensToCardinal(number)
|
|
128
|
-
} else if (number < 1000n) {
|
|
129
|
-
words = this.hundredsToCardinal(number)
|
|
130
|
-
} else if (number < 1_000_000n) {
|
|
131
|
-
words = this.thousandsToCardinal(number)
|
|
132
|
-
} else {
|
|
133
|
-
words = this.bigNumberToCardinal(number)
|
|
134
|
-
}
|
|
165
|
+
function integerToWords (n) {
|
|
166
|
+
return integerToWordsInner(n, ZERO)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function decimalPartToWords (decimalPart) {
|
|
170
|
+
let result = ''
|
|
171
|
+
let i = 0
|
|
135
172
|
|
|
136
|
-
|
|
173
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
174
|
+
if (result) result += ' '
|
|
175
|
+
result += ZERO
|
|
176
|
+
i++
|
|
137
177
|
}
|
|
178
|
+
|
|
179
|
+
const remainder = decimalPart.slice(i)
|
|
180
|
+
if (remainder) {
|
|
181
|
+
if (result) result += ' '
|
|
182
|
+
result += integerToWords(BigInt(remainder))
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return result
|
|
138
186
|
}
|
|
139
187
|
|
|
140
188
|
/**
|
|
141
|
-
* Converts a
|
|
189
|
+
* Converts a numeric value to Hungarian words.
|
|
142
190
|
*
|
|
143
|
-
* @param {number|string|bigint} value The
|
|
144
|
-
* @
|
|
145
|
-
* @returns {string} The number expressed in Hungarian words.
|
|
146
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
147
|
-
* @throws {Error} If value is an invalid number string.
|
|
148
|
-
*
|
|
149
|
-
* @example
|
|
150
|
-
* convertToWords(42); // 'negyvenkettő'
|
|
151
|
-
* convertToWords(21); // 'huszonegy'
|
|
191
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
192
|
+
* @returns {string} The number in Hungarian words
|
|
152
193
|
*/
|
|
153
|
-
|
|
154
|
-
|
|
194
|
+
function toWords (value) {
|
|
195
|
+
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
196
|
+
|
|
197
|
+
let result = ''
|
|
198
|
+
|
|
199
|
+
if (isNegative) {
|
|
200
|
+
result = NEGATIVE + ' '
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
result += integerToWords(integerPart)
|
|
204
|
+
|
|
205
|
+
if (decimalPart) {
|
|
206
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return result
|
|
155
210
|
}
|
|
211
|
+
|
|
212
|
+
// ============================================================================
|
|
213
|
+
// Exports
|
|
214
|
+
// ============================================================================
|
|
215
|
+
|
|
216
|
+
export { toWords }
|