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/el.js
CHANGED
|
@@ -1,116 +1,243 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Greek language converter - Functional Implementation
|
|
3
|
+
*
|
|
4
|
+
* A performance-optimized number-to-words converter using precomputed lookup tables.
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Space-separated number composition
|
|
8
|
+
* - Implicit "one" (ένα) omission before scale words
|
|
9
|
+
* - Irregular hundreds (διακόσια, τριακόσια, etc.)
|
|
10
|
+
* - Per-digit decimal reading
|
|
4
11
|
*/
|
|
5
12
|
|
|
6
|
-
import
|
|
13
|
+
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Vocabulary (module-level constants)
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
const ONES = ['', 'ένα', 'δύο', 'τρία', 'τέσσερα', 'πέντε', 'έξι', 'επτά', 'οκτώ', 'εννέα']
|
|
20
|
+
|
|
21
|
+
const TEENS = ['δέκα', 'έντεκα', 'δώδεκα', 'δεκατρία', 'δεκατέσσερα', 'δεκαπέντε', 'δεκαέξι', 'δεκαεπτά', 'δεκαοκτώ', 'δεκαεννέα']
|
|
22
|
+
|
|
23
|
+
const TENS = ['', '', 'είκοσι', 'τριάντα', 'σαράντα', 'πενήντα', 'εξήντα', 'εβδομήντα', 'ογδόντα', 'ενενήντα']
|
|
24
|
+
|
|
25
|
+
// Greek has irregular hundreds
|
|
26
|
+
const HUNDREDS = ['', 'εκατό', 'διακόσια', 'τριακόσια', 'τετρακόσια', 'πεντακόσια', 'εξακόσια', 'επτακόσια', 'οκτακόσια', 'εννιακόσια']
|
|
27
|
+
|
|
28
|
+
const THOUSAND = 'χίλια'
|
|
29
|
+
|
|
30
|
+
const ZERO = 'μηδέν'
|
|
31
|
+
const NEGATIVE = 'μείον'
|
|
32
|
+
const DECIMAL_SEP = 'κόμμα'
|
|
33
|
+
|
|
34
|
+
// Short scale
|
|
35
|
+
const SCALES = ['εκατομμύριο', 'δισεκατομμύριο', 'τρισεκατομμύριο']
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Precomputed Lookup Tables (built once at module load)
|
|
39
|
+
// ============================================================================
|
|
7
40
|
|
|
8
41
|
/**
|
|
9
|
-
*
|
|
10
|
-
* @extends GreedyScaleLanguage
|
|
42
|
+
* Builds segment word for 0-999.
|
|
11
43
|
*/
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const rightNumber = Object.values(rightPair)[0]
|
|
85
|
-
|
|
86
|
-
// Implicit one: omit "ένα" before any following value (> 0)
|
|
87
|
-
if (leftNumber === 1n) {
|
|
88
|
-
return rightPair
|
|
44
|
+
function buildSegment (n) {
|
|
45
|
+
if (n === 0) return ''
|
|
46
|
+
|
|
47
|
+
const ones = n % 10
|
|
48
|
+
const tens = Math.floor(n / 10) % 10
|
|
49
|
+
const hundreds = Math.floor(n / 100)
|
|
50
|
+
|
|
51
|
+
const parts = []
|
|
52
|
+
|
|
53
|
+
// Hundreds (irregular forms)
|
|
54
|
+
if (hundreds > 0) {
|
|
55
|
+
parts.push(HUNDREDS[hundreds])
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Tens and ones
|
|
59
|
+
const tensOnes = n % 100
|
|
60
|
+
|
|
61
|
+
if (tensOnes === 0) {
|
|
62
|
+
// Just hundreds
|
|
63
|
+
} else if (tensOnes < 10) {
|
|
64
|
+
parts.push(ONES[ones])
|
|
65
|
+
} else if (tensOnes < 20) {
|
|
66
|
+
parts.push(TEENS[ones])
|
|
67
|
+
} else if (ones === 0) {
|
|
68
|
+
parts.push(TENS[tens])
|
|
69
|
+
} else {
|
|
70
|
+
parts.push(TENS[tens] + ' ' + ONES[ones])
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return parts.join(' ')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Precompute all 1000 segment words (0-999)
|
|
77
|
+
const SEGMENTS = new Array(1000)
|
|
78
|
+
|
|
79
|
+
for (let i = 0; i < 1000; i++) {
|
|
80
|
+
SEGMENTS[i] = buildSegment(i)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Conversion Functions
|
|
85
|
+
// ============================================================================
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Converts a non-negative integer to Greek words.
|
|
89
|
+
*
|
|
90
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
91
|
+
* @returns {string} Greek words
|
|
92
|
+
*/
|
|
93
|
+
function integerToWords (n) {
|
|
94
|
+
if (n === 0n) return ZERO
|
|
95
|
+
|
|
96
|
+
// Fast path: numbers < 1000 (direct lookup)
|
|
97
|
+
if (n < 1000n) {
|
|
98
|
+
return SEGMENTS[Number(n)]
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Fast path: numbers < 1,000,000 (thousands)
|
|
102
|
+
if (n < 1_000_000n) {
|
|
103
|
+
const thousands = Number(n / 1000n)
|
|
104
|
+
const remainder = Number(n % 1000n)
|
|
105
|
+
|
|
106
|
+
// Omit "ένα" before χίλια
|
|
107
|
+
let result
|
|
108
|
+
if (thousands === 1) {
|
|
109
|
+
result = THOUSAND
|
|
110
|
+
} else {
|
|
111
|
+
result = SEGMENTS[thousands] + ' ' + THOUSAND
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (remainder > 0) {
|
|
115
|
+
result += ' ' + SEGMENTS[remainder]
|
|
89
116
|
}
|
|
90
117
|
|
|
91
|
-
|
|
92
|
-
|
|
118
|
+
return result
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// For numbers >= 1,000,000, use scale decomposition
|
|
122
|
+
return buildLargeNumberWords(n)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Builds words for numbers >= 1,000,000.
|
|
127
|
+
*
|
|
128
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
129
|
+
* @returns {string} Greek words
|
|
130
|
+
*/
|
|
131
|
+
function buildLargeNumberWords (n) {
|
|
132
|
+
const numStr = n.toString()
|
|
133
|
+
const len = numStr.length
|
|
134
|
+
|
|
135
|
+
// Build segments of 3 digits from right to left
|
|
136
|
+
const segments = []
|
|
137
|
+
const segmentSize = 3
|
|
138
|
+
|
|
139
|
+
const remainderLen = len % segmentSize
|
|
140
|
+
let pos = 0
|
|
141
|
+
if (remainderLen > 0) {
|
|
142
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
143
|
+
pos = remainderLen
|
|
144
|
+
}
|
|
145
|
+
while (pos < len) {
|
|
146
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
147
|
+
pos += segmentSize
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Convert segments to words
|
|
151
|
+
const parts = []
|
|
152
|
+
let scaleIndex = segments.length - 1
|
|
153
|
+
|
|
154
|
+
for (let i = 0; i < segments.length; i++) {
|
|
155
|
+
const segment = segments[i]
|
|
93
156
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
157
|
+
if (segment !== 0) {
|
|
158
|
+
const segmentWord = SEGMENTS[segment]
|
|
159
|
+
|
|
160
|
+
if (scaleIndex === 0) {
|
|
161
|
+
// Units segment
|
|
162
|
+
parts.push(segmentWord)
|
|
163
|
+
} else if (scaleIndex === 1) {
|
|
164
|
+
// Thousands - omit "ένα" before χίλια
|
|
165
|
+
if (segment === 1) {
|
|
166
|
+
parts.push(THOUSAND)
|
|
167
|
+
} else {
|
|
168
|
+
parts.push(segmentWord + ' ' + THOUSAND)
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
// Millions+ - omit "ένα" before scale words
|
|
172
|
+
const scaleWord = SCALES[scaleIndex - 2]
|
|
173
|
+
if (segment === 1) {
|
|
174
|
+
parts.push(scaleWord)
|
|
175
|
+
} else {
|
|
176
|
+
parts.push(segmentWord + ' ' + scaleWord)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
97
179
|
}
|
|
98
180
|
|
|
99
|
-
|
|
100
|
-
return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }
|
|
181
|
+
scaleIndex--
|
|
101
182
|
}
|
|
183
|
+
|
|
184
|
+
return parts.join(' ')
|
|
102
185
|
}
|
|
103
186
|
|
|
104
187
|
/**
|
|
105
|
-
* Converts
|
|
106
|
-
*
|
|
107
|
-
* @param {
|
|
108
|
-
* @returns {string}
|
|
188
|
+
* Converts decimal digits to Greek words (per-digit).
|
|
189
|
+
*
|
|
190
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
191
|
+
* @returns {string} Greek words for decimal part
|
|
192
|
+
*/
|
|
193
|
+
function decimalPartToWords (decimalPart) {
|
|
194
|
+
const parts = []
|
|
195
|
+
|
|
196
|
+
for (const digit of decimalPart) {
|
|
197
|
+
const d = parseInt(digit, 10)
|
|
198
|
+
if (d === 0) {
|
|
199
|
+
parts.push(ZERO)
|
|
200
|
+
} else {
|
|
201
|
+
parts.push(ONES[d])
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return parts.join(' ')
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Converts a numeric value to Greek words.
|
|
210
|
+
*
|
|
211
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
212
|
+
* @returns {string} The number in Greek words
|
|
213
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
214
|
+
* @throws {Error} If value is not a valid number format
|
|
215
|
+
*
|
|
109
216
|
* @example
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
217
|
+
* toWords(21) // 'είκοσι ένα'
|
|
218
|
+
* toWords(1000) // 'χίλια'
|
|
219
|
+
* toWords('3.14') // 'τρία κόμμα ένα τέσσερα'
|
|
113
220
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
221
|
+
function toWords (value) {
|
|
222
|
+
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
223
|
+
|
|
224
|
+
let result = ''
|
|
225
|
+
|
|
226
|
+
if (isNegative) {
|
|
227
|
+
result = NEGATIVE + ' '
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
result += integerToWords(integerPart)
|
|
231
|
+
|
|
232
|
+
if (decimalPart) {
|
|
233
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return result
|
|
116
237
|
}
|
|
238
|
+
|
|
239
|
+
// ============================================================================
|
|
240
|
+
// Public API
|
|
241
|
+
// ============================================================================
|
|
242
|
+
|
|
243
|
+
export { toWords }
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to English words.
|
|
3
|
+
*
|
|
4
|
+
* This is the main public API. It accepts any valid numeric input
|
|
5
|
+
* (number, string, or bigint) and handles parsing internally.
|
|
6
|
+
*
|
|
7
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
8
|
+
* @returns {string} The number in English words
|
|
9
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
10
|
+
* @throws {Error} If value is not a valid number format
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* toWords(42) // 'forty-two'
|
|
14
|
+
* toWords(-3.14) // 'minus three point one four'
|
|
15
|
+
* toWords('1000000') // 'one million'
|
|
16
|
+
*/
|
|
17
|
+
export function toWords(value: number | string | bigint): string;
|