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/te.js
CHANGED
|
@@ -1,229 +1,164 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
'యాభై ఆరు',
|
|
66
|
-
'యాభై ఏడు',
|
|
67
|
-
'యాభై ఎనిమిది',
|
|
68
|
-
'యాభై తొమ్మిది',
|
|
69
|
-
'అరవై',
|
|
70
|
-
'అరవై ఒకటి',
|
|
71
|
-
'అరవై రెండు',
|
|
72
|
-
'అరవై మూడు',
|
|
73
|
-
'అరవై నాలుగు',
|
|
74
|
-
'అరవై ఐదు',
|
|
75
|
-
'అరవై ఆరు',
|
|
76
|
-
'అరవై ఏడు',
|
|
77
|
-
'అరవై ఎనిమిది',
|
|
78
|
-
'అరవై తొమ్మిది',
|
|
79
|
-
'డెబ్బై',
|
|
80
|
-
'డెబ్బై ఒకటి',
|
|
81
|
-
'డెబ్బై రెండు',
|
|
82
|
-
'డెబ్బై మూడు',
|
|
83
|
-
'డెబ్బై నాలుగు',
|
|
84
|
-
'డెబ్బై ఐదు',
|
|
85
|
-
'డెబ్బై ఆరు',
|
|
86
|
-
'డెబ్బై ఏడు',
|
|
87
|
-
'డెబ్బై ఎనిమిది',
|
|
88
|
-
'డెబ్బై తొమ్మిది',
|
|
89
|
-
'ఎనభై',
|
|
90
|
-
'ఎనభై ఒకటి',
|
|
91
|
-
'ఎనభై రెండు',
|
|
92
|
-
'ఎనభై మూడు',
|
|
93
|
-
'ఎనభై నాలుగు',
|
|
94
|
-
'ఎనభై ఐదు',
|
|
95
|
-
'ఎనభై ఆరు',
|
|
96
|
-
'ఎనభై ఏడు',
|
|
97
|
-
'ఎనభై ఎనిమిది',
|
|
98
|
-
'ఎనభై తొమ్మిది',
|
|
99
|
-
'తొంభై',
|
|
100
|
-
'తొంభై ఒకటి',
|
|
101
|
-
'తొంభై రెండు',
|
|
102
|
-
'తొంభై మూడు',
|
|
103
|
-
'తొంభై నాలుగు',
|
|
104
|
-
'తొంభై ఐదు',
|
|
105
|
-
'తొంభై ఆరు',
|
|
106
|
-
'తొంభై ఏడు',
|
|
107
|
-
'తొంభై ఎనిమిది',
|
|
108
|
-
'తొంభై తొమ్మిది'
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
hundreds = [
|
|
112
|
-
'',
|
|
113
|
-
'వంద',
|
|
114
|
-
'రెండు వందలు',
|
|
115
|
-
'మూడు వందలు',
|
|
116
|
-
'నాలుగు వందలు',
|
|
117
|
-
'ఐదు వందలు',
|
|
118
|
-
'ఆరు వందలు',
|
|
119
|
-
'ఏడు వందలు',
|
|
120
|
-
'ఎనిమిది వందలు',
|
|
121
|
-
'తొమ్మిది వందలు'
|
|
122
|
-
]
|
|
123
|
-
|
|
124
|
-
// Digits map 1–9 for decimal reading
|
|
125
|
-
digits = [
|
|
126
|
-
'ఒకటి',
|
|
127
|
-
'రెండు',
|
|
128
|
-
'మూడు',
|
|
129
|
-
'నాలుగు',
|
|
130
|
-
'ఐదు',
|
|
131
|
-
'ఆరు',
|
|
132
|
-
'ఏడు',
|
|
133
|
-
'ఎనిమిది',
|
|
134
|
-
'తొమ్మిది'
|
|
135
|
-
]
|
|
136
|
-
|
|
137
|
-
scales = [
|
|
138
|
-
'',
|
|
139
|
-
'వెయ్యి',
|
|
140
|
-
'లక్ష',
|
|
141
|
-
'కోటి',
|
|
142
|
-
'అరబ్',
|
|
143
|
-
'ఖరబ్',
|
|
144
|
-
'నిల్',
|
|
145
|
-
'పడ్మ',
|
|
146
|
-
'శంకు'
|
|
147
|
-
]
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Convert numbers below 100 to Telugu words.
|
|
151
|
-
*
|
|
152
|
-
* @param {number} number The number to convert (0-99).
|
|
153
|
-
* @returns {string} The Telugu representation.
|
|
154
|
-
*/
|
|
155
|
-
convertBelowHundred (number) {
|
|
156
|
-
return this.belowHundred[number]
|
|
1
|
+
/**
|
|
2
|
+
* Telugu language converter - Functional Implementation
|
|
3
|
+
*
|
|
4
|
+
* Self-contained converter for South Asian numbering.
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Indian numbering system (వెయ్యి, లక్ష, కోటి)
|
|
8
|
+
* - Telugu script
|
|
9
|
+
* - 3-2-2 grouping pattern
|
|
10
|
+
* - Complete word forms for 0-99
|
|
11
|
+
* - Per-digit decimal reading
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Vocabulary
|
|
18
|
+
// ============================================================================
|
|
19
|
+
|
|
20
|
+
const ZERO = 'సున్నా'
|
|
21
|
+
const NEGATIVE = 'మైనస్'
|
|
22
|
+
const DECIMAL_SEP = 'పాయింట్'
|
|
23
|
+
|
|
24
|
+
const BELOW_HUNDRED = [
|
|
25
|
+
'సున్నా', 'ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది',
|
|
26
|
+
'పది', 'పదకొండు', 'పన్నెండు', 'పదమూడు', 'పద్నాలుగు', 'పదిహేను', 'పదహారు', 'పదిహేడు', 'పద్దెనిమిది', 'పంతొమ్మిది',
|
|
27
|
+
'ఇరవై', 'ఇరవై ఒక్కటి', 'ఇరవై రెండు', 'ఇరవై మూడు', 'ఇరవై నాలుగు', 'ఇరవై ఐదు', 'ఇరవై ఆరు', 'ఇరవై ఏడు', 'ఇరవై ఎనిమిది', 'ఇరవై తొమ్మిది',
|
|
28
|
+
'ముప్పై', 'ముప్పై ఒకటి', 'ముప్పై రెండు', 'ముప్పై మూడు', 'ముప్పై నాలుగు', 'ముప్పై ఐదు', 'ముప్పై ఆరు', 'ముప్పై ఏడు', 'ముప్పై ఎనిమిది', 'ముప్పై తొమ్మిది',
|
|
29
|
+
'నలభై', 'నలభై ఒకటి', 'నలభై రెండు', 'నలభై మూడు', 'నలభై నాలుగు', 'నలభై ఐదు', 'నలభై ఆరు', 'నలభై ఏడు', 'నలభై ఎనిమిది', 'నలభై తొమ్మిది',
|
|
30
|
+
'యాభై', 'యాభై ఒకటి', 'యాభై రెండు', 'యాభై మూడు', 'యాభై నాలుగు', 'యాభై ఐదు', 'యాభై ఆరు', 'యాభై ఏడు', 'యాభై ఎనిమిది', 'యాభై తొమ్మిది',
|
|
31
|
+
'అరవై', 'అరవై ఒకటి', 'అరవై రెండు', 'అరవై మూడు', 'అరవై నాలుగు', 'అరవై ఐదు', 'అరవై ఆరు', 'అరవై ఏడు', 'అరవై ఎనిమిది', 'అరవై తొమ్మిది',
|
|
32
|
+
'డెబ్బై', 'డెబ్బై ఒకటి', 'డెబ్బై రెండు', 'డెబ్బై మూడు', 'డెబ్బై నాలుగు', 'డెబ్బై ఐదు', 'డెబ్బై ఆరు', 'డెబ్బై ఏడు', 'డెబ్బై ఎనిమిది', 'డెబ్బై తొమ్మిది',
|
|
33
|
+
'ఎనభై', 'ఎనభై ఒకటి', 'ఎనభై రెండు', 'ఎనభై మూడు', 'ఎనభై నాలుగు', 'ఎనభై ఐదు', 'ఎనభై ఆరు', 'ఎనభై ఏడు', 'ఎనభై ఎనిమిది', 'ఎనభై తొమ్మిది',
|
|
34
|
+
'తొంభై', 'తొంభై ఒకటి', 'తొంభై రెండు', 'తొంభై మూడు', 'తొంభై నాలుగు', 'తొంభై ఐదు', 'తొంభై ఆరు', 'తొంభై ఏడు', 'తొంభై ఎనిమిది', 'తొంభై తొమ్మిది'
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Vocabulary (continued)
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
const HUNDREDS = ['', 'వంద', 'రెండు వందలు', 'మూడు వందలు', 'నాలుగు వందలు', 'ఐదు వందలు', 'ఆరు వందలు', 'ఏడు వందలు', 'ఎనిమిది వందలు', 'తొమ్మిది వందలు']
|
|
42
|
+
|
|
43
|
+
// Ones for decimal reading
|
|
44
|
+
const ONES = ['ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది']
|
|
45
|
+
|
|
46
|
+
// Scale words: index 0 = units, 1 = thousand, 2 = lakh, etc.
|
|
47
|
+
const SCALE_WORDS = ['', 'వెయ్యి', 'లక్ష', 'కోటి', 'అరబ్', 'ఖరబ్', 'నిల్', 'పడ్మ', 'శంకు']
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Conversion Functions
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Converts 0-999 to Telugu words.
|
|
55
|
+
*/
|
|
56
|
+
function convertBelowThousand (n) {
|
|
57
|
+
if (n === 0) return ''
|
|
58
|
+
if (n < 100) return BELOW_HUNDRED[n]
|
|
59
|
+
|
|
60
|
+
const hundreds = Math.trunc(n / 100)
|
|
61
|
+
const remainder = n % 100
|
|
62
|
+
|
|
63
|
+
if (remainder === 0) {
|
|
64
|
+
return HUNDREDS[hundreds]
|
|
157
65
|
}
|
|
66
|
+
return HUNDREDS[hundreds] + ' ' + BELOW_HUNDRED[remainder]
|
|
67
|
+
}
|
|
158
68
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (remainder > 0) {
|
|
174
|
-
parts.push(this.convertBelowHundred(remainder))
|
|
175
|
-
}
|
|
69
|
+
/**
|
|
70
|
+
* Converts a non-negative integer to Telugu words.
|
|
71
|
+
* Uses recursive approach for Indian 3-2-2 grouping pattern.
|
|
72
|
+
*
|
|
73
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
74
|
+
* @returns {string} Telugu words
|
|
75
|
+
*/
|
|
76
|
+
function integerToWords (n) {
|
|
77
|
+
if (n === 0n) return ZERO
|
|
78
|
+
|
|
79
|
+
// Fast path: numbers < 1000 (direct lookup)
|
|
80
|
+
if (n < 1000n) {
|
|
81
|
+
return convertBelowThousand(Number(n))
|
|
82
|
+
}
|
|
176
83
|
|
|
177
|
-
|
|
84
|
+
return buildLargeNumberWords(n, 0)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Recursively builds words for numbers >= 1000.
|
|
89
|
+
* Indian grouping: first 3 digits, then 2-digit groups.
|
|
90
|
+
*
|
|
91
|
+
* @param {bigint} n - Number to convert
|
|
92
|
+
* @param {number} scale - Current scale index (0=units, 1=thousands, etc.)
|
|
93
|
+
* @returns {string} Telugu words
|
|
94
|
+
*/
|
|
95
|
+
function buildLargeNumberWords (n, scale) {
|
|
96
|
+
if (n === 0n) return ''
|
|
97
|
+
|
|
98
|
+
// Determine divisor: 1000 for first split, 100 for rest
|
|
99
|
+
const divisor = scale === 0 ? 1000n : 100n
|
|
100
|
+
const segment = Number(n % divisor)
|
|
101
|
+
const rest = n / divisor
|
|
102
|
+
|
|
103
|
+
// Build higher segments first (recursive)
|
|
104
|
+
let result = ''
|
|
105
|
+
if (rest > 0n) {
|
|
106
|
+
result = buildLargeNumberWords(rest, scale + 1)
|
|
178
107
|
}
|
|
179
108
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const last3 = numStr.slice(-3)
|
|
192
|
-
groups.unshift(Number(last3))
|
|
193
|
-
|
|
194
|
-
let remaining = numStr.slice(0, -3)
|
|
195
|
-
while (remaining.length > 0) {
|
|
196
|
-
const group = remaining.slice(-2)
|
|
197
|
-
groups.unshift(Number(group))
|
|
198
|
-
remaining = remaining.slice(0, -2)
|
|
109
|
+
// Add current segment
|
|
110
|
+
if (segment > 0) {
|
|
111
|
+
if (result) result += ' '
|
|
112
|
+
|
|
113
|
+
if (scale === 0) {
|
|
114
|
+
// Units segment (0-999)
|
|
115
|
+
result += convertBelowThousand(segment)
|
|
116
|
+
} else {
|
|
117
|
+
// Scale segments (0-99)
|
|
118
|
+
const groupWords = (segment === 1) ? 'ఒక' : BELOW_HUNDRED[segment]
|
|
119
|
+
result += groupWords + ' ' + SCALE_WORDS[scale]
|
|
199
120
|
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return result
|
|
124
|
+
}
|
|
200
125
|
|
|
201
|
-
|
|
126
|
+
function decimalPartToWords (decimalPart) {
|
|
127
|
+
// Per-digit decimal reading
|
|
128
|
+
const digits = []
|
|
129
|
+
for (const char of decimalPart) {
|
|
130
|
+
const d = parseInt(char, 10)
|
|
131
|
+
digits.push(d === 0 ? ZERO : ONES[d - 1])
|
|
202
132
|
}
|
|
133
|
+
return digits.join(' ')
|
|
134
|
+
}
|
|
203
135
|
|
|
204
|
-
|
|
205
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Converts a numeric value to Telugu words.
|
|
138
|
+
*
|
|
139
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
140
|
+
* @returns {string} The number in Telugu words
|
|
141
|
+
*/
|
|
142
|
+
function toWords (value) {
|
|
143
|
+
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
206
144
|
|
|
207
|
-
|
|
208
|
-
const groupCount = groups.length
|
|
209
|
-
const words = []
|
|
145
|
+
let result = ''
|
|
210
146
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
147
|
+
if (isNegative) {
|
|
148
|
+
result = NEGATIVE + ' '
|
|
149
|
+
}
|
|
214
150
|
|
|
215
|
-
|
|
216
|
-
const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
|
|
217
|
-
words.push(groupWords)
|
|
218
|
-
if (scaleIndex > 0 && this.scales[scaleIndex]) {
|
|
219
|
-
words.push(this.scales[scaleIndex])
|
|
220
|
-
}
|
|
221
|
-
}
|
|
151
|
+
result += integerToWords(integerPart)
|
|
222
152
|
|
|
223
|
-
|
|
153
|
+
if (decimalPart) {
|
|
154
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
224
155
|
}
|
|
225
|
-
}
|
|
226
156
|
|
|
227
|
-
|
|
228
|
-
return new Telugu(options).convertToWords(value)
|
|
157
|
+
return result
|
|
229
158
|
}
|
|
159
|
+
|
|
160
|
+
// ============================================================================
|
|
161
|
+
// Exports
|
|
162
|
+
// ============================================================================
|
|
163
|
+
|
|
164
|
+
export { toWords }
|
package/lib/languages/th.js
CHANGED
|
@@ -1,123 +1,161 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Thai language converter - Functional Implementation
|
|
3
|
+
*
|
|
4
|
+
* Self-contained converter with precomputed lookup tables.
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - No word separators (continuous Thai script)
|
|
8
|
+
* - Million-based grouping (ล้าน)
|
|
9
|
+
* - Special handling for 1 as "เอ็ด" in compounds
|
|
10
|
+
* - 20 is "ยี่สิบ" (not "สองสิบ")
|
|
11
|
+
* - Per-digit decimal reading
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Vocabulary
|
|
18
|
+
// ============================================================================
|
|
19
|
+
|
|
20
|
+
const ONES = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']
|
|
21
|
+
|
|
22
|
+
const ZERO = 'ศูนย์'
|
|
23
|
+
const NEGATIVE = 'ลบ'
|
|
24
|
+
const DECIMAL_SEP = 'จุด'
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Conversion Functions
|
|
28
|
+
// ============================================================================
|
|
29
|
+
|
|
30
|
+
function convertBelowMillion (n) {
|
|
31
|
+
if (n === 0) return ''
|
|
32
|
+
|
|
33
|
+
let value = n
|
|
34
|
+
const parts = []
|
|
35
|
+
|
|
36
|
+
const hundredThousands = Math.trunc(value / 100000)
|
|
37
|
+
value %= 100000
|
|
38
|
+
const tenThousands = Math.trunc(value / 10000)
|
|
39
|
+
value %= 10000
|
|
40
|
+
const thousands = Math.trunc(value / 1000)
|
|
41
|
+
value %= 1000
|
|
42
|
+
const hundreds = Math.trunc(value / 100)
|
|
43
|
+
value %= 100
|
|
44
|
+
const tens = Math.trunc(value / 10)
|
|
45
|
+
const ones = value % 10
|
|
46
|
+
|
|
47
|
+
if (hundredThousands > 0) {
|
|
48
|
+
parts.push(ONES[hundredThousands - 1] + 'แสน')
|
|
49
|
+
}
|
|
39
50
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
51
|
+
if (tenThousands > 0) {
|
|
52
|
+
if (tenThousands === 1) {
|
|
53
|
+
parts.push('หนึ่งหมื่น')
|
|
54
|
+
} else {
|
|
55
|
+
parts.push(ONES[tenThousands - 1] + 'หมื่น')
|
|
46
56
|
}
|
|
57
|
+
}
|
|
47
58
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
if (thousands > 0) {
|
|
60
|
+
parts.push(ONES[thousands - 1] + 'พัน')
|
|
61
|
+
}
|
|
51
62
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
63
|
+
if (hundreds > 0) {
|
|
64
|
+
parts.push(ONES[hundreds - 1] + 'ร้อย')
|
|
65
|
+
}
|
|
55
66
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
67
|
+
if (tens > 0) {
|
|
68
|
+
if (tens === 1) {
|
|
69
|
+
parts.push('สิบ')
|
|
70
|
+
} else if (tens === 2) {
|
|
71
|
+
parts.push('ยี่สิบ')
|
|
72
|
+
} else {
|
|
73
|
+
parts.push(ONES[tens - 1] + 'สิบ')
|
|
64
74
|
}
|
|
75
|
+
}
|
|
65
76
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
77
|
+
if (ones > 0) {
|
|
78
|
+
const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0
|
|
79
|
+
if (ones === 1 && (tens > 0 || hasHigher)) {
|
|
80
|
+
parts.push('เอ็ด')
|
|
81
|
+
} else {
|
|
82
|
+
parts.push(ONES[ones - 1])
|
|
73
83
|
}
|
|
74
|
-
|
|
75
|
-
return parts.join('')
|
|
76
84
|
}
|
|
77
85
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*
|
|
81
|
-
* @param {bigint} number The number to split.
|
|
82
|
-
* @returns {number[]} Array of number groups.
|
|
83
|
-
*/
|
|
84
|
-
splitMillionGroups (number) {
|
|
85
|
-
const groups = []
|
|
86
|
-
let remaining = number
|
|
87
|
-
|
|
88
|
-
const million = 1_000_000n
|
|
89
|
-
while (remaining > 0n) {
|
|
90
|
-
const chunk = Number(remaining % million)
|
|
91
|
-
groups.unshift(chunk)
|
|
92
|
-
remaining = remaining / million
|
|
93
|
-
}
|
|
86
|
+
return parts.join('')
|
|
87
|
+
}
|
|
94
88
|
|
|
95
|
-
|
|
89
|
+
function splitMillionGroups (n) {
|
|
90
|
+
const groups = []
|
|
91
|
+
let remaining = n
|
|
92
|
+
|
|
93
|
+
const million = 1_000_000n
|
|
94
|
+
while (remaining > 0n) {
|
|
95
|
+
const chunk = Number(remaining % million)
|
|
96
|
+
groups.unshift(chunk)
|
|
97
|
+
remaining = remaining / million
|
|
96
98
|
}
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return this.zeroWord
|
|
101
|
-
}
|
|
100
|
+
return groups
|
|
101
|
+
}
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
function integerToWords (n) {
|
|
104
|
+
if (n === 0n) return ZERO
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (groupValue === 0) continue
|
|
106
|
+
const groups = splitMillionGroups(n)
|
|
107
|
+
const parts = []
|
|
109
108
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
for (let i = 0; i < groups.length; i++) {
|
|
110
|
+
const groupValue = groups[i]
|
|
111
|
+
if (groupValue === 0) continue
|
|
112
|
+
|
|
113
|
+
parts.push(convertBelowMillion(groupValue))
|
|
114
|
+
const remaining = groups.length - i - 1
|
|
115
|
+
if (remaining > 0) {
|
|
116
|
+
parts.push('ล้าน'.repeat(remaining))
|
|
115
117
|
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return parts.join('')
|
|
121
|
+
}
|
|
116
122
|
|
|
117
|
-
|
|
123
|
+
function decimalPartToWords (decimalPart) {
|
|
124
|
+
// Per-digit decimal reading
|
|
125
|
+
const digits = []
|
|
126
|
+
for (const char of decimalPart) {
|
|
127
|
+
const d = parseInt(char, 10)
|
|
128
|
+
digits.push(d === 0 ? ZERO : ONES[d - 1])
|
|
118
129
|
}
|
|
130
|
+
return digits.join('')
|
|
119
131
|
}
|
|
120
132
|
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Converts a numeric value to Thai words.
|
|
135
|
+
*
|
|
136
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
137
|
+
* @returns {string} The number in Thai words
|
|
138
|
+
*/
|
|
139
|
+
function toWords (value) {
|
|
140
|
+
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
141
|
+
|
|
142
|
+
let result = ''
|
|
143
|
+
|
|
144
|
+
if (isNegative) {
|
|
145
|
+
result = NEGATIVE
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
result += integerToWords(integerPart)
|
|
149
|
+
|
|
150
|
+
if (decimalPart) {
|
|
151
|
+
result += DECIMAL_SEP + decimalPartToWords(decimalPart)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return result
|
|
123
155
|
}
|
|
156
|
+
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Exports
|
|
159
|
+
// ============================================================================
|
|
160
|
+
|
|
161
|
+
export { toWords }
|