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.
Files changed (280) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +183 -156
  3. package/dist/languages/am-Latn.js +3 -0
  4. package/dist/languages/am-Latn.js.map +1 -0
  5. package/dist/languages/am.js +3 -0
  6. package/dist/languages/am.js.map +1 -0
  7. package/dist/languages/ar.js +3 -2
  8. package/dist/languages/ar.js.map +1 -1
  9. package/dist/languages/az.js +3 -2
  10. package/dist/languages/az.js.map +1 -1
  11. package/dist/languages/bn.js +3 -2
  12. package/dist/languages/bn.js.map +1 -1
  13. package/dist/languages/cs.js +3 -2
  14. package/dist/languages/cs.js.map +1 -1
  15. package/dist/languages/da.js +3 -2
  16. package/dist/languages/da.js.map +1 -1
  17. package/dist/languages/de.js +3 -2
  18. package/dist/languages/de.js.map +1 -1
  19. package/dist/languages/el.js +3 -2
  20. package/dist/languages/el.js.map +1 -1
  21. package/dist/languages/en.js +3 -2
  22. package/dist/languages/en.js.map +1 -1
  23. package/dist/languages/es.js +3 -2
  24. package/dist/languages/es.js.map +1 -1
  25. package/dist/languages/fa.js +3 -2
  26. package/dist/languages/fa.js.map +1 -1
  27. package/dist/languages/fi.js +3 -0
  28. package/dist/languages/fi.js.map +1 -0
  29. package/dist/languages/fil.js +3 -2
  30. package/dist/languages/fil.js.map +1 -1
  31. package/dist/languages/fr-BE.js +3 -2
  32. package/dist/languages/fr-BE.js.map +1 -1
  33. package/dist/languages/fr.js +3 -2
  34. package/dist/languages/fr.js.map +1 -1
  35. package/dist/languages/gu.js +3 -2
  36. package/dist/languages/gu.js.map +1 -1
  37. package/dist/languages/ha.js +3 -0
  38. package/dist/languages/ha.js.map +1 -0
  39. package/dist/languages/hbo.js +3 -0
  40. package/dist/languages/hbo.js.map +1 -0
  41. package/dist/languages/he.js +3 -2
  42. package/dist/languages/he.js.map +1 -1
  43. package/dist/languages/hi.js +3 -2
  44. package/dist/languages/hi.js.map +1 -1
  45. package/dist/languages/hr.js +3 -2
  46. package/dist/languages/hr.js.map +1 -1
  47. package/dist/languages/hu.js +3 -2
  48. package/dist/languages/hu.js.map +1 -1
  49. package/dist/languages/id.js +3 -2
  50. package/dist/languages/id.js.map +1 -1
  51. package/dist/languages/it.js +3 -2
  52. package/dist/languages/it.js.map +1 -1
  53. package/dist/languages/ja.js +3 -2
  54. package/dist/languages/ja.js.map +1 -1
  55. package/dist/languages/kn.js +3 -2
  56. package/dist/languages/kn.js.map +1 -1
  57. package/dist/languages/ko.js +3 -2
  58. package/dist/languages/ko.js.map +1 -1
  59. package/dist/languages/lt.js +3 -2
  60. package/dist/languages/lt.js.map +1 -1
  61. package/dist/languages/lv.js +3 -2
  62. package/dist/languages/lv.js.map +1 -1
  63. package/dist/languages/mr.js +3 -2
  64. package/dist/languages/mr.js.map +1 -1
  65. package/dist/languages/ms.js +3 -2
  66. package/dist/languages/ms.js.map +1 -1
  67. package/dist/languages/nb.js +3 -2
  68. package/dist/languages/nb.js.map +1 -1
  69. package/dist/languages/nl.js +3 -2
  70. package/dist/languages/nl.js.map +1 -1
  71. package/dist/languages/pa.js +3 -0
  72. package/dist/languages/pa.js.map +1 -0
  73. package/dist/languages/pl.js +3 -2
  74. package/dist/languages/pl.js.map +1 -1
  75. package/dist/languages/pt.js +3 -2
  76. package/dist/languages/pt.js.map +1 -1
  77. package/dist/languages/ro.js +3 -2
  78. package/dist/languages/ro.js.map +1 -1
  79. package/dist/languages/ru.js +3 -2
  80. package/dist/languages/ru.js.map +1 -1
  81. package/dist/languages/sr-Cyrl.js +3 -0
  82. package/dist/languages/sr-Cyrl.js.map +1 -0
  83. package/dist/languages/sr-Latn.js +3 -2
  84. package/dist/languages/sr-Latn.js.map +1 -1
  85. package/dist/languages/sv.js +3 -2
  86. package/dist/languages/sv.js.map +1 -1
  87. package/dist/languages/sw.js +3 -2
  88. package/dist/languages/sw.js.map +1 -1
  89. package/dist/languages/ta.js +3 -2
  90. package/dist/languages/ta.js.map +1 -1
  91. package/dist/languages/te.js +3 -2
  92. package/dist/languages/te.js.map +1 -1
  93. package/dist/languages/th.js +3 -2
  94. package/dist/languages/th.js.map +1 -1
  95. package/dist/languages/tr.js +3 -2
  96. package/dist/languages/tr.js.map +1 -1
  97. package/dist/languages/uk.js +3 -2
  98. package/dist/languages/uk.js.map +1 -1
  99. package/dist/languages/ur.js +3 -2
  100. package/dist/languages/ur.js.map +1 -1
  101. package/dist/languages/vi.js +3 -2
  102. package/dist/languages/vi.js.map +1 -1
  103. package/dist/languages/zh-Hans.js +3 -2
  104. package/dist/languages/zh-Hans.js.map +1 -1
  105. package/dist/languages/zh-Hant.js +3 -0
  106. package/dist/languages/zh-Hant.js.map +1 -0
  107. package/dist/n2words.js +3 -2
  108. package/dist/n2words.js.map +1 -1
  109. package/lib/languages/am-Latn.d.ts +7 -0
  110. package/lib/languages/am-Latn.js +164 -0
  111. package/lib/languages/am.d.ts +7 -0
  112. package/lib/languages/am.js +164 -0
  113. package/lib/languages/ar.d.ts +17 -0
  114. package/lib/languages/ar.js +171 -209
  115. package/lib/languages/az.d.ts +7 -0
  116. package/lib/languages/az.js +167 -49
  117. package/lib/languages/bn.d.ts +7 -0
  118. package/lib/languages/bn.js +142 -123
  119. package/lib/languages/cs.d.ts +18 -0
  120. package/lib/languages/cs.js +303 -176
  121. package/lib/languages/da.d.ts +14 -0
  122. package/lib/languages/da.js +267 -139
  123. package/lib/languages/de.d.ts +17 -0
  124. package/lib/languages/de.js +310 -113
  125. package/lib/languages/el.d.ts +14 -0
  126. package/lib/languages/el.js +225 -98
  127. package/lib/languages/en.d.ts +17 -0
  128. package/lib/languages/en.js +235 -102
  129. package/lib/languages/es.d.ts +21 -0
  130. package/lib/languages/es.js +307 -125
  131. package/lib/languages/fa.d.ts +7 -0
  132. package/lib/languages/fa.js +115 -108
  133. package/lib/languages/fi.d.ts +14 -0
  134. package/lib/languages/fi.js +245 -0
  135. package/lib/languages/fil.d.ts +7 -0
  136. package/lib/languages/fil.js +199 -139
  137. package/lib/languages/fr-BE.d.ts +11 -0
  138. package/lib/languages/fr-BE.js +287 -48
  139. package/lib/languages/fr.d.ts +21 -0
  140. package/lib/languages/fr.js +343 -119
  141. package/lib/languages/gu.d.ts +7 -0
  142. package/lib/languages/gu.js +125 -144
  143. package/lib/languages/ha.d.ts +7 -0
  144. package/lib/languages/ha.js +230 -0
  145. package/lib/languages/hbo.d.ts +13 -0
  146. package/lib/languages/hbo.js +300 -0
  147. package/lib/languages/he.d.ts +13 -0
  148. package/lib/languages/he.js +230 -283
  149. package/lib/languages/hi.d.ts +7 -0
  150. package/lib/languages/hi.js +142 -123
  151. package/lib/languages/hr.d.ts +11 -0
  152. package/lib/languages/hr.js +190 -129
  153. package/lib/languages/hu.d.ts +7 -0
  154. package/lib/languages/hu.js +194 -133
  155. package/lib/languages/id.d.ts +7 -0
  156. package/lib/languages/id.js +167 -140
  157. package/lib/languages/it.d.ts +19 -0
  158. package/lib/languages/it.js +337 -108
  159. package/lib/languages/ja.d.ts +17 -0
  160. package/lib/languages/ja.js +224 -155
  161. package/lib/languages/kn.d.ts +7 -0
  162. package/lib/languages/kn.js +128 -62
  163. package/lib/languages/ko.d.ts +14 -0
  164. package/lib/languages/ko.js +250 -70
  165. package/lib/languages/lt.d.ts +18 -0
  166. package/lib/languages/lt.js +287 -148
  167. package/lib/languages/lv.d.ts +18 -0
  168. package/lib/languages/lv.js +291 -123
  169. package/lib/languages/mr.d.ts +7 -0
  170. package/lib/languages/mr.js +125 -144
  171. package/lib/languages/ms.d.ts +7 -0
  172. package/lib/languages/ms.js +171 -112
  173. package/lib/languages/nb.d.ts +14 -0
  174. package/lib/languages/nb.js +275 -100
  175. package/lib/languages/nl.d.ts +26 -0
  176. package/lib/languages/nl.js +307 -174
  177. package/lib/languages/pa.d.ts +7 -0
  178. package/lib/languages/pa.js +163 -0
  179. package/lib/languages/pl.d.ts +22 -0
  180. package/lib/languages/pl.js +299 -158
  181. package/lib/languages/pt.d.ts +17 -0
  182. package/lib/languages/pt.js +279 -120
  183. package/lib/languages/ro.d.ts +18 -0
  184. package/lib/languages/ro.js +214 -337
  185. package/lib/languages/ru.d.ts +11 -0
  186. package/lib/languages/ru.js +219 -95
  187. package/lib/languages/sr-Cyrl.d.ts +11 -0
  188. package/lib/languages/sr-Cyrl.js +215 -0
  189. package/lib/languages/sr-Latn.d.ts +11 -0
  190. package/lib/languages/sr-Latn.js +190 -132
  191. package/lib/languages/sv.d.ts +14 -0
  192. package/lib/languages/sv.js +280 -103
  193. package/lib/languages/sw.d.ts +7 -0
  194. package/lib/languages/sw.js +135 -103
  195. package/lib/languages/ta.d.ts +7 -0
  196. package/lib/languages/ta.js +133 -205
  197. package/lib/languages/te.d.ts +7 -0
  198. package/lib/languages/te.js +148 -213
  199. package/lib/languages/th.d.ts +7 -0
  200. package/lib/languages/th.js +139 -101
  201. package/lib/languages/tr.d.ts +18 -0
  202. package/lib/languages/tr.js +246 -66
  203. package/lib/languages/uk.d.ts +11 -0
  204. package/lib/languages/uk.js +197 -101
  205. package/lib/languages/ur.d.ts +7 -0
  206. package/lib/languages/ur.js +160 -123
  207. package/lib/languages/vi.d.ts +17 -0
  208. package/lib/languages/vi.js +287 -164
  209. package/lib/languages/zh-Hans.d.ts +11 -0
  210. package/lib/languages/zh-Hans.js +159 -142
  211. package/lib/languages/zh-Hant.d.ts +11 -0
  212. package/lib/languages/zh-Hant.js +202 -0
  213. package/lib/n2words.d.ts +53 -0
  214. package/lib/n2words.js +91 -227
  215. package/lib/utils/is-plain-object.d.ts +13 -0
  216. package/lib/utils/is-plain-object.js +17 -0
  217. package/lib/utils/parse-numeric.d.ts +17 -0
  218. package/lib/utils/parse-numeric.js +108 -0
  219. package/lib/utils/validate-options.d.ts +8 -0
  220. package/lib/utils/validate-options.js +16 -0
  221. package/package.json +118 -67
  222. package/dist/languages/pa-Guru.js +0 -2
  223. package/dist/languages/pa-Guru.js.map +0 -1
  224. package/lib/classes/abstract-language.js +0 -261
  225. package/lib/classes/greedy-scale-language.js +0 -195
  226. package/lib/classes/slavic-language.js +0 -251
  227. package/lib/classes/south-asian-language.js +0 -161
  228. package/lib/classes/turkic-language.js +0 -63
  229. package/lib/languages/pa-Guru.js +0 -126
  230. package/typings/classes/abstract-language.d.ts +0 -144
  231. package/typings/classes/greedy-scale-language.d.ts +0 -148
  232. package/typings/classes/slavic-language.d.ts +0 -145
  233. package/typings/classes/south-asian-language.d.ts +0 -101
  234. package/typings/classes/turkic-language.d.ts +0 -42
  235. package/typings/languages/ar.d.ts +0 -93
  236. package/typings/languages/az.d.ts +0 -25
  237. package/typings/languages/bn.d.ts +0 -1
  238. package/typings/languages/cs.d.ts +0 -120
  239. package/typings/languages/da.d.ts +0 -53
  240. package/typings/languages/de.d.ts +0 -26
  241. package/typings/languages/el.d.ts +0 -11
  242. package/typings/languages/en.d.ts +0 -30
  243. package/typings/languages/es.d.ts +0 -43
  244. package/typings/languages/fa.d.ts +0 -81
  245. package/typings/languages/fil.d.ts +0 -12
  246. package/typings/languages/fr-BE.d.ts +0 -41
  247. package/typings/languages/fr.d.ts +0 -43
  248. package/typings/languages/gu.d.ts +0 -12
  249. package/typings/languages/he.d.ts +0 -197
  250. package/typings/languages/hi.d.ts +0 -1
  251. package/typings/languages/hr.d.ts +0 -110
  252. package/typings/languages/hu.d.ts +0 -37
  253. package/typings/languages/id.d.ts +0 -69
  254. package/typings/languages/it.d.ts +0 -51
  255. package/typings/languages/ja.d.ts +0 -58
  256. package/typings/languages/kn.d.ts +0 -11
  257. package/typings/languages/ko.d.ts +0 -25
  258. package/typings/languages/lt.d.ts +0 -110
  259. package/typings/languages/lv.d.ts +0 -99
  260. package/typings/languages/mr.d.ts +0 -12
  261. package/typings/languages/ms.d.ts +0 -37
  262. package/typings/languages/nb.d.ts +0 -27
  263. package/typings/languages/nl.d.ts +0 -65
  264. package/typings/languages/pa-Guru.d.ts +0 -1
  265. package/typings/languages/pl.d.ts +0 -116
  266. package/typings/languages/pt.d.ts +0 -39
  267. package/typings/languages/ro.d.ts +0 -229
  268. package/typings/languages/ru.d.ts +0 -108
  269. package/typings/languages/sr-Latn.d.ts +0 -98
  270. package/typings/languages/sv.d.ts +0 -30
  271. package/typings/languages/sw.d.ts +0 -1
  272. package/typings/languages/ta.d.ts +0 -1
  273. package/typings/languages/te.d.ts +0 -1
  274. package/typings/languages/th.d.ts +0 -1
  275. package/typings/languages/tr.d.ts +0 -46
  276. package/typings/languages/uk.d.ts +0 -117
  277. package/typings/languages/ur.d.ts +0 -1
  278. package/typings/languages/vi.d.ts +0 -116
  279. package/typings/languages/zh-Hans.d.ts +0 -57
  280. package/typings/n2words.d.ts +0 -177
@@ -1,226 +1,154 @@
1
- import AbstractLanguage from '../classes/abstract-language.js'
2
-
3
- class Tamil extends AbstractLanguage {
4
- negativeWord = 'மைனஸ்'
5
- decimalSeparatorWord = 'புள்ளி'
6
- zeroWord = 'பூஜ்ஜியம்'
7
- convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion
8
- belowHundred = [
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 Tamil words.
151
- *
152
- * @param {number} number The number to convert (0-99).
153
- * @returns {string} The Tamil representation.
154
- */
155
- convertBelowHundred (number) {
156
- return this.belowHundred[number]
1
+ /**
2
+ * Tamil language converter - Functional Implementation
3
+ *
4
+ * Self-contained converter for South Asian numbering.
5
+ *
6
+ * Key features:
7
+ * - Indian numbering system (ஆயிரம், லட்சம், கோடி)
8
+ * - Tamil script
9
+ * - 3-2-2 grouping pattern
10
+ * - Complete word forms for 0-99
11
+ * - Special hundred word transformations
12
+ * - Per-digit decimal reading
13
+ */
14
+
15
+ import { parseNumericValue } from '../utils/parse-numeric.js'
16
+
17
+ // ============================================================================
18
+ // Vocabulary
19
+ // ============================================================================
20
+
21
+ const ZERO = 'பூஜ்ஜியம்'
22
+ const NEGATIVE = 'மைனஸ்'
23
+ const DECIMAL_SEP = 'புள்ளி'
24
+
25
+ const BELOW_HUNDRED = [
26
+ 'பூஜ்ஜியம்', 'ஒன்று', 'இரண்டு', 'மூன்று', 'நான்கு', 'ஐந்து', 'ஆறு', 'ஏழு', 'எட்டு', 'ஒன்பது',
27
+ 'பத்து', 'பதினொன்று', 'பன்னிரண்டு', 'பதிமூன்று', 'பதினான்கு', 'பதினைந்து', 'பதினாறு', 'பதினேழு', 'பதினெட்டு', 'பத்தொன்பது',
28
+ 'இருபது', 'இருபத்தொன்று', 'இருபத்திரண்டு', 'இருபத்திமூன்று', 'இருபத்திநான்கு', 'இருபத்தைந்து', 'இருபத்தாறு', 'இருபத்தேழு', 'இருபத்தெட்டு', 'இருபத்தொன்பது',
29
+ 'முப்பது', 'முப்பத்தொன்று', 'முப்பத்திரண்டு', 'முப்பத்திமூன்று', 'முப்பத்திநான்கு', 'முப்பத்தைந்து', 'முப்பத்தாறு', 'முப்பத்தேழு', 'முப்பத்தெட்டு', 'முப்பத்தொன்பது',
30
+ 'நாற்பது', 'நாற்பத்தொன்று', 'நாற்பத்திரண்டு', 'நாற்பத்திமூன்று', 'நாற்பத்திநான்கு', 'நாற்பத்தைந்து', 'நாற்பத்தாறு', 'நாற்பத்தேழு', 'நாற்பத்தெட்டு', 'நாற்பத்தொன்பது',
31
+ 'ஐம்பது', 'ஐம்பத்தொன்று', 'ஐம்பத்திரண்டு', 'ஐம்பத்திமூன்று', 'ஐம்பத்திநான்கு', 'ஐம்பத்தைந்து', 'ஐம்பத்தாறு', 'ஐம்பத்தேழு', 'ஐம்பத்தெட்டு', 'ஐம்பத்தொன்பது',
32
+ 'அறுபது', 'அறுபத்தொன்று', 'அறுபத்திரண்டு', 'அறுபத்திமூன்று', 'அறுபத்திநான்கு', 'அறுபத்தைந்து', 'அறுபத்தாறு', 'அறுபத்தேழு', 'அறுபத்தெட்டு', 'அறுபத்தொன்பது',
33
+ 'எழுபது', 'எழுபத்தொன்று', 'எழுபத்திரண்டு', 'எழுபத்திமூன்று', 'எழுபத்திநான்கு', 'எழுபத்தைந்து', 'எழுபத்தாறு', 'எழுபத்தேழு', 'எழுபத்தெட்டு', 'எழுபத்தொன்பது',
34
+ 'எண்பது', 'எண்பத்தொன்று', 'எண்பத்திரண்டு', 'எண்பத்திமூன்று', 'எண்பத்திநான்கு', 'எண்பத்தைந்து', 'எண்பத்தாறு', 'எண்பத்தேழு', 'எண்பத்தெட்டு', 'எண்பத்தொன்பது',
35
+ 'தொண்ணூறு', 'தொண்ணூற்று ஒன்று', 'தொண்ணூற்று இரண்டு', 'தொண்ணூற்று மூன்று', 'தொண்ணூற்று நான்கு', 'தொண்ணூற்று ஐந்து', 'தொண்ணூற்று ஆறு', 'தொண்ணூற்று ஏழு', 'தொண்ணூற்று எட்டு', 'தொண்ணூற்று ஒன்பது'
36
+ ]
37
+
38
+ // Standalone hundreds (when not followed by remainder)
39
+ const HUNDREDS = ['', 'நூறு', 'இருநூறு', 'முன்னூறு', 'நானூறு', 'ஐநூறு', 'அறுநூறு', 'எழுநூறு', 'எண்நூறு', 'தொள்ளாயிரம்']
40
+
41
+ // Connected form of hundreds (when followed by remainder) - precomputed
42
+ const HUNDREDS_CONNECTED = ['', 'நூற்று', 'இருநூற்று', 'முன்னூற்று', 'நானூற்று', 'ஐநூற்று', 'அறுநூற்று', 'எழுநூற்று', 'எண்நூற்று', 'தொள்ளாயிரத்து']
43
+
44
+ // Ones for decimal reading
45
+ const ONES = ['ஒன்று', 'இரண்டு', 'மூன்று', 'நான்கு', 'ஐந்து', 'ஆறு', 'ஏழு', 'எட்டு', 'ஒன்பது']
46
+
47
+ // Scale words: index 0 = units, 1 = thousand, 2 = lakh, etc.
48
+ const SCALE_WORDS = ['', 'ஆயிரம்', 'லட்சம்', 'கோடி', 'அரபு', 'கராபு', 'நீல்', 'பத்ம', 'சங்கு']
49
+
50
+ // ============================================================================
51
+ // Segment Splitting (inlined for performance)
52
+ // ============================================================================
53
+
54
+ function groupByThreeThenTwos (n) {
55
+ const numStr = n.toString()
56
+
57
+ if (numStr.length <= 3) {
58
+ return [Number(numStr)]
157
59
  }
158
60
 
159
- convertBelowThousand (number) {
160
- if (number === 0) return ''
161
- if (number < 100) return this.convertBelowHundred(number)
61
+ const segments = []
62
+ const last3 = numStr.slice(-3)
63
+ segments.unshift(Number(last3))
162
64
 
163
- const hundreds = Math.trunc(number / 100)
164
- const remainder = number % 100
165
- let hundredPart = this.hundreds[hundreds]
65
+ let remaining = numStr.slice(0, -3)
66
+ while (remaining.length > 0) {
67
+ const segment = remaining.slice(-2)
68
+ segments.unshift(Number(segment))
69
+ remaining = remaining.slice(0, -2)
70
+ }
166
71
 
167
- if (remainder > 0) {
168
- if (hundredPart.endsWith('ம்')) {
169
- hundredPart = hundredPart.replace(/ம்$/, 'த்து')
170
- } else if (hundredPart.endsWith('று')) {
171
- hundredPart = hundredPart.slice(0, -2) + 'ற்று'
172
- }
173
- }
72
+ return segments
73
+ }
174
74
 
175
- const parts = [hundredPart]
176
- if (remainder > 0) {
177
- parts.push(this.convertBelowHundred(remainder))
178
- }
75
+ // ============================================================================
76
+ // Conversion Functions
77
+ // ============================================================================
78
+
79
+ function convertBelowThousand (n) {
80
+ if (n === 0) return ''
81
+ if (n < 100) return BELOW_HUNDRED[n]
179
82
 
180
- return parts.join(' ').trim()
83
+ const hundreds = Math.trunc(n / 100)
84
+ const remainder = n % 100
85
+
86
+ if (remainder === 0) {
87
+ return HUNDREDS[hundreds]
181
88
  }
182
89
 
183
- splitIndian (number) {
184
- const numStr = number.toString()
185
- if (numStr.length <= 3) return [Number(numStr)]
90
+ // Use precomputed connected form
91
+ return HUNDREDS_CONNECTED[hundreds] + ' ' + BELOW_HUNDRED[remainder]
92
+ }
93
+
94
+ function integerToWords (n) {
95
+ if (n === 0n) return ZERO
96
+
97
+ const groups = groupByThreeThenTwos(n)
98
+ const groupCount = groups.length
99
+ const words = []
186
100
 
187
- const groups = []
188
- const last3 = numStr.slice(-3)
189
- groups.unshift(Number(last3))
101
+ for (let i = 0; i < groupCount; i++) {
102
+ const groupValue = groups[i]
103
+ if (groupValue === 0) continue
190
104
 
191
- let remaining = numStr.slice(0, -3)
192
- while (remaining.length > 0) {
193
- const group = remaining.slice(-2)
194
- groups.unshift(Number(group))
195
- remaining = remaining.slice(0, -2)
105
+ const scaleIndex = groupCount - i - 1
106
+ const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : convertBelowThousand(groupValue)
107
+ words.push(groupWords)
108
+ if (scaleIndex > 0 && SCALE_WORDS[scaleIndex]) {
109
+ words.push(SCALE_WORDS[scaleIndex])
196
110
  }
111
+ }
112
+
113
+ return words.join(' ').trim()
114
+ }
197
115
 
198
- return groups
116
+ function decimalPartToWords (decimalPart) {
117
+ // Per-digit decimal reading
118
+ const digits = []
119
+ for (const char of decimalPart) {
120
+ const d = parseInt(char, 10)
121
+ digits.push(d === 0 ? ZERO : ONES[d - 1])
199
122
  }
123
+ return digits.join(' ')
124
+ }
200
125
 
201
- convertWholePart (number) {
202
- if (number === 0n) return this.zeroWord
126
+ /**
127
+ * Converts a numeric value to Tamil words.
128
+ *
129
+ * @param {number | string | bigint} value - The numeric value to convert
130
+ * @returns {string} The number in Tamil words
131
+ */
132
+ function toWords (value) {
133
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
203
134
 
204
- const groups = this.splitIndian(number)
205
- const groupCount = groups.length
206
- const words = []
135
+ let result = ''
207
136
 
208
- for (let i = 0; i < groupCount; i++) {
209
- const groupValue = groups[i]
210
- if (groupValue === 0) continue
137
+ if (isNegative) {
138
+ result = NEGATIVE + ' '
139
+ }
211
140
 
212
- const scaleIndex = groupCount - i - 1
213
- const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)
214
- words.push(groupWords)
215
- if (scaleIndex > 0 && this.scales[scaleIndex]) {
216
- words.push(this.scales[scaleIndex])
217
- }
218
- }
141
+ result += integerToWords(integerPart)
219
142
 
220
- return words.join(' ').trim()
143
+ if (decimalPart) {
144
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
221
145
  }
222
- }
223
146
 
224
- export default function convertToWords (value, options = {}) {
225
- return new Tamil(options).convertToWords(value)
147
+ return result
226
148
  }
149
+
150
+ // ============================================================================
151
+ // Exports
152
+ // ============================================================================
153
+
154
+ export { toWords }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Converts a numeric value to Telugu words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Telugu words
6
+ */
7
+ export function toWords(value: number | string | bigint): string;