n2words 2.0.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 (327) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +86 -188
  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 -0
  8. package/dist/languages/ar.js.map +1 -0
  9. package/dist/languages/az.js +3 -0
  10. package/dist/languages/az.js.map +1 -0
  11. package/dist/languages/bn.js +3 -0
  12. package/dist/languages/bn.js.map +1 -0
  13. package/dist/languages/cs.js +3 -0
  14. package/dist/languages/cs.js.map +1 -0
  15. package/dist/languages/da.js +3 -0
  16. package/dist/languages/da.js.map +1 -0
  17. package/dist/languages/de.js +3 -0
  18. package/dist/languages/de.js.map +1 -0
  19. package/dist/languages/el.js +3 -0
  20. package/dist/languages/el.js.map +1 -0
  21. package/dist/languages/en.js +3 -0
  22. package/dist/languages/en.js.map +1 -0
  23. package/dist/languages/es.js +3 -0
  24. package/dist/languages/es.js.map +1 -0
  25. package/dist/languages/fa.js +3 -0
  26. package/dist/languages/fa.js.map +1 -0
  27. package/dist/languages/fi.js +3 -0
  28. package/dist/languages/fi.js.map +1 -0
  29. package/dist/languages/fil.js +3 -0
  30. package/dist/languages/fil.js.map +1 -0
  31. package/dist/languages/fr-BE.js +3 -0
  32. package/dist/languages/fr-BE.js.map +1 -0
  33. package/dist/languages/fr.js +3 -0
  34. package/dist/languages/fr.js.map +1 -0
  35. package/dist/languages/gu.js +3 -0
  36. package/dist/languages/gu.js.map +1 -0
  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 -0
  42. package/dist/languages/he.js.map +1 -0
  43. package/dist/languages/hi.js +3 -0
  44. package/dist/languages/hi.js.map +1 -0
  45. package/dist/languages/hr.js +3 -0
  46. package/dist/languages/hr.js.map +1 -0
  47. package/dist/languages/hu.js +3 -0
  48. package/dist/languages/hu.js.map +1 -0
  49. package/dist/languages/id.js +3 -0
  50. package/dist/languages/id.js.map +1 -0
  51. package/dist/languages/it.js +3 -0
  52. package/dist/languages/it.js.map +1 -0
  53. package/dist/languages/ja.js +3 -0
  54. package/dist/languages/ja.js.map +1 -0
  55. package/dist/languages/kn.js +3 -0
  56. package/dist/languages/kn.js.map +1 -0
  57. package/dist/languages/ko.js +3 -0
  58. package/dist/languages/ko.js.map +1 -0
  59. package/dist/languages/lt.js +3 -0
  60. package/dist/languages/lt.js.map +1 -0
  61. package/dist/languages/lv.js +3 -0
  62. package/dist/languages/lv.js.map +1 -0
  63. package/dist/languages/mr.js +3 -0
  64. package/dist/languages/mr.js.map +1 -0
  65. package/dist/languages/ms.js +3 -0
  66. package/dist/languages/ms.js.map +1 -0
  67. package/dist/languages/nb.js +3 -0
  68. package/dist/languages/nb.js.map +1 -0
  69. package/dist/languages/nl.js +3 -0
  70. package/dist/languages/nl.js.map +1 -0
  71. package/dist/languages/pa.js +3 -0
  72. package/dist/languages/pa.js.map +1 -0
  73. package/dist/languages/pl.js +3 -0
  74. package/dist/languages/pl.js.map +1 -0
  75. package/dist/languages/pt.js +3 -0
  76. package/dist/languages/pt.js.map +1 -0
  77. package/dist/languages/ro.js +3 -0
  78. package/dist/languages/ro.js.map +1 -0
  79. package/dist/languages/ru.js +3 -0
  80. package/dist/languages/ru.js.map +1 -0
  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 -0
  84. package/dist/languages/sr-Latn.js.map +1 -0
  85. package/dist/languages/sv.js +3 -0
  86. package/dist/languages/sv.js.map +1 -0
  87. package/dist/languages/sw.js +3 -0
  88. package/dist/languages/sw.js.map +1 -0
  89. package/dist/languages/ta.js +3 -0
  90. package/dist/languages/ta.js.map +1 -0
  91. package/dist/languages/te.js +3 -0
  92. package/dist/languages/te.js.map +1 -0
  93. package/dist/languages/th.js +3 -0
  94. package/dist/languages/th.js.map +1 -0
  95. package/dist/languages/tr.js +3 -0
  96. package/dist/languages/tr.js.map +1 -0
  97. package/dist/languages/uk.js +3 -0
  98. package/dist/languages/uk.js.map +1 -0
  99. package/dist/languages/ur.js +3 -0
  100. package/dist/languages/ur.js.map +1 -0
  101. package/dist/languages/vi.js +3 -0
  102. package/dist/languages/vi.js.map +1 -0
  103. package/dist/languages/zh-Hans.js +3 -0
  104. package/dist/languages/zh-Hans.js.map +1 -0
  105. package/dist/languages/zh-Hant.js +3 -0
  106. package/dist/languages/zh-Hant.js.map +1 -0
  107. package/dist/n2words.js +2 -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 +14 -27
  114. package/lib/languages/ar.js +175 -129
  115. package/lib/languages/az.d.ts +4 -9
  116. package/lib/languages/az.js +171 -37
  117. package/lib/languages/bn.d.ts +4 -8
  118. package/lib/languages/bn.js +138 -124
  119. package/lib/languages/cs.d.ts +15 -85
  120. package/lib/languages/cs.js +310 -114
  121. package/lib/languages/da.d.ts +11 -12
  122. package/lib/languages/da.js +276 -101
  123. package/lib/languages/de.d.ts +14 -11
  124. package/lib/languages/de.js +317 -86
  125. package/lib/languages/el.d.ts +11 -11
  126. package/lib/languages/el.js +231 -78
  127. package/lib/languages/en.d.ts +14 -13
  128. package/lib/languages/en.js +242 -72
  129. package/lib/languages/es.d.ts +18 -12
  130. package/lib/languages/es.js +317 -103
  131. package/lib/languages/fa.d.ts +4 -44
  132. package/lib/languages/fa.js +112 -122
  133. package/lib/languages/fi.d.ts +14 -0
  134. package/lib/languages/fi.js +245 -0
  135. package/lib/languages/fil.d.ts +4 -13
  136. package/lib/languages/fil.js +207 -106
  137. package/lib/languages/fr-BE.d.ts +8 -8
  138. package/lib/languages/fr-BE.js +294 -19
  139. package/lib/languages/fr.d.ts +18 -12
  140. package/lib/languages/fr.js +352 -89
  141. package/lib/languages/gu.d.ts +4 -8
  142. package/lib/languages/gu.js +130 -125
  143. package/lib/languages/ha.d.ts +7 -0
  144. package/lib/languages/ha.js +230 -0
  145. package/lib/languages/hbo.d.ts +10 -110
  146. package/lib/languages/hbo.js +263 -214
  147. package/lib/languages/he.d.ts +10 -77
  148. package/lib/languages/he.js +242 -172
  149. package/lib/languages/hi.d.ts +4 -8
  150. package/lib/languages/hi.js +138 -124
  151. package/lib/languages/hr.d.ts +8 -77
  152. package/lib/languages/hr.js +194 -89
  153. package/lib/languages/hu.d.ts +4 -19
  154. package/lib/languages/hu.js +198 -119
  155. package/lib/languages/id.d.ts +4 -34
  156. package/lib/languages/id.js +171 -129
  157. package/lib/languages/it.d.ts +16 -34
  158. package/lib/languages/it.js +339 -94
  159. package/lib/languages/ja.d.ts +14 -14
  160. package/lib/languages/ja.js +233 -111
  161. package/lib/languages/kn.d.ts +4 -8
  162. package/lib/languages/kn.js +130 -35
  163. package/lib/languages/ko.d.ts +11 -11
  164. package/lib/languages/ko.js +257 -49
  165. package/lib/languages/lt.d.ts +15 -67
  166. package/lib/languages/lt.js +296 -122
  167. package/lib/languages/lv.d.ts +15 -67
  168. package/lib/languages/lv.js +297 -106
  169. package/lib/languages/mr.d.ts +4 -8
  170. package/lib/languages/mr.js +130 -125
  171. package/lib/languages/ms.d.ts +4 -28
  172. package/lib/languages/ms.js +171 -116
  173. package/lib/languages/nb.d.ts +11 -9
  174. package/lib/languages/nb.js +282 -87
  175. package/lib/languages/nl.d.ts +23 -13
  176. package/lib/languages/nl.js +317 -133
  177. package/lib/languages/pa.d.ts +4 -8
  178. package/lib/languages/pa.js +156 -124
  179. package/lib/languages/pl.d.ts +19 -77
  180. package/lib/languages/pl.js +307 -87
  181. package/lib/languages/pt.d.ts +14 -26
  182. package/lib/languages/pt.js +286 -92
  183. package/lib/languages/ro.d.ts +15 -155
  184. package/lib/languages/ro.js +219 -235
  185. package/lib/languages/ru.d.ts +8 -82
  186. package/lib/languages/ru.js +222 -78
  187. package/lib/languages/sr-Cyrl.d.ts +8 -77
  188. package/lib/languages/sr-Cyrl.js +191 -89
  189. package/lib/languages/sr-Latn.d.ts +8 -77
  190. package/lib/languages/sr-Latn.js +191 -89
  191. package/lib/languages/sv.d.ts +11 -11
  192. package/lib/languages/sv.js +288 -74
  193. package/lib/languages/sw.d.ts +4 -36
  194. package/lib/languages/sw.js +133 -106
  195. package/lib/languages/ta.d.ts +4 -17
  196. package/lib/languages/ta.js +129 -201
  197. package/lib/languages/te.d.ts +4 -19
  198. package/lib/languages/te.js +141 -196
  199. package/lib/languages/th.d.ts +4 -14
  200. package/lib/languages/th.js +135 -91
  201. package/lib/languages/tr.d.ts +15 -9
  202. package/lib/languages/tr.js +256 -49
  203. package/lib/languages/uk.d.ts +8 -82
  204. package/lib/languages/uk.js +200 -78
  205. package/lib/languages/ur.d.ts +4 -8
  206. package/lib/languages/ur.js +156 -124
  207. package/lib/languages/vi.d.ts +14 -69
  208. package/lib/languages/vi.js +294 -125
  209. package/lib/languages/zh-Hans.d.ts +8 -18
  210. package/lib/languages/zh-Hans.js +163 -92
  211. package/lib/languages/zh-Hant.d.ts +8 -18
  212. package/lib/languages/zh-Hant.js +181 -90
  213. package/lib/n2words.d.ts +53 -209
  214. package/lib/n2words.js +111 -530
  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 +26 -14
  222. package/dist/ArabicConverter.js +0 -3
  223. package/dist/ArabicConverter.js.map +0 -1
  224. package/dist/AzerbaijaniConverter.js +0 -3
  225. package/dist/AzerbaijaniConverter.js.map +0 -1
  226. package/dist/BanglaConverter.js +0 -3
  227. package/dist/BanglaConverter.js.map +0 -1
  228. package/dist/BiblicalHebrewConverter.js +0 -3
  229. package/dist/BiblicalHebrewConverter.js.map +0 -1
  230. package/dist/CroatianConverter.js +0 -3
  231. package/dist/CroatianConverter.js.map +0 -1
  232. package/dist/CzechConverter.js +0 -3
  233. package/dist/CzechConverter.js.map +0 -1
  234. package/dist/DanishConverter.js +0 -3
  235. package/dist/DanishConverter.js.map +0 -1
  236. package/dist/DutchConverter.js +0 -3
  237. package/dist/DutchConverter.js.map +0 -1
  238. package/dist/EnglishConverter.js +0 -3
  239. package/dist/EnglishConverter.js.map +0 -1
  240. package/dist/FilipinoConverter.js +0 -3
  241. package/dist/FilipinoConverter.js.map +0 -1
  242. package/dist/FrenchBelgiumConverter.js +0 -3
  243. package/dist/FrenchBelgiumConverter.js.map +0 -1
  244. package/dist/FrenchConverter.js +0 -3
  245. package/dist/FrenchConverter.js.map +0 -1
  246. package/dist/GermanConverter.js +0 -3
  247. package/dist/GermanConverter.js.map +0 -1
  248. package/dist/GreekConverter.js +0 -3
  249. package/dist/GreekConverter.js.map +0 -1
  250. package/dist/GujaratiConverter.js +0 -3
  251. package/dist/GujaratiConverter.js.map +0 -1
  252. package/dist/HebrewConverter.js +0 -3
  253. package/dist/HebrewConverter.js.map +0 -1
  254. package/dist/HindiConverter.js +0 -3
  255. package/dist/HindiConverter.js.map +0 -1
  256. package/dist/HungarianConverter.js +0 -3
  257. package/dist/HungarianConverter.js.map +0 -1
  258. package/dist/IndonesianConverter.js +0 -3
  259. package/dist/IndonesianConverter.js.map +0 -1
  260. package/dist/ItalianConverter.js +0 -3
  261. package/dist/ItalianConverter.js.map +0 -1
  262. package/dist/JapaneseConverter.js +0 -3
  263. package/dist/JapaneseConverter.js.map +0 -1
  264. package/dist/KannadaConverter.js +0 -3
  265. package/dist/KannadaConverter.js.map +0 -1
  266. package/dist/KoreanConverter.js +0 -3
  267. package/dist/KoreanConverter.js.map +0 -1
  268. package/dist/LatvianConverter.js +0 -3
  269. package/dist/LatvianConverter.js.map +0 -1
  270. package/dist/LithuanianConverter.js +0 -3
  271. package/dist/LithuanianConverter.js.map +0 -1
  272. package/dist/MalayConverter.js +0 -3
  273. package/dist/MalayConverter.js.map +0 -1
  274. package/dist/MarathiConverter.js +0 -3
  275. package/dist/MarathiConverter.js.map +0 -1
  276. package/dist/NorwegianBokmalConverter.js +0 -3
  277. package/dist/NorwegianBokmalConverter.js.map +0 -1
  278. package/dist/PersianConverter.js +0 -3
  279. package/dist/PersianConverter.js.map +0 -1
  280. package/dist/PolishConverter.js +0 -3
  281. package/dist/PolishConverter.js.map +0 -1
  282. package/dist/PortugueseConverter.js +0 -3
  283. package/dist/PortugueseConverter.js.map +0 -1
  284. package/dist/PunjabiConverter.js +0 -3
  285. package/dist/PunjabiConverter.js.map +0 -1
  286. package/dist/RomanianConverter.js +0 -3
  287. package/dist/RomanianConverter.js.map +0 -1
  288. package/dist/RussianConverter.js +0 -3
  289. package/dist/RussianConverter.js.map +0 -1
  290. package/dist/SerbianCyrillicConverter.js +0 -3
  291. package/dist/SerbianCyrillicConverter.js.map +0 -1
  292. package/dist/SerbianLatinConverter.js +0 -3
  293. package/dist/SerbianLatinConverter.js.map +0 -1
  294. package/dist/SimplifiedChineseConverter.js +0 -3
  295. package/dist/SimplifiedChineseConverter.js.map +0 -1
  296. package/dist/SpanishConverter.js +0 -3
  297. package/dist/SpanishConverter.js.map +0 -1
  298. package/dist/SwahiliConverter.js +0 -3
  299. package/dist/SwahiliConverter.js.map +0 -1
  300. package/dist/SwedishConverter.js +0 -3
  301. package/dist/SwedishConverter.js.map +0 -1
  302. package/dist/TamilConverter.js +0 -3
  303. package/dist/TamilConverter.js.map +0 -1
  304. package/dist/TeluguConverter.js +0 -3
  305. package/dist/TeluguConverter.js.map +0 -1
  306. package/dist/ThaiConverter.js +0 -3
  307. package/dist/ThaiConverter.js.map +0 -1
  308. package/dist/TraditionalChineseConverter.js +0 -3
  309. package/dist/TraditionalChineseConverter.js.map +0 -1
  310. package/dist/TurkishConverter.js +0 -3
  311. package/dist/TurkishConverter.js.map +0 -1
  312. package/dist/UkrainianConverter.js +0 -3
  313. package/dist/UkrainianConverter.js.map +0 -1
  314. package/dist/UrduConverter.js +0 -3
  315. package/dist/UrduConverter.js.map +0 -1
  316. package/dist/VietnameseConverter.js +0 -3
  317. package/dist/VietnameseConverter.js.map +0 -1
  318. package/lib/classes/abstract-language.d.ts +0 -178
  319. package/lib/classes/abstract-language.js +0 -268
  320. package/lib/classes/greedy-scale-language.d.ts +0 -109
  321. package/lib/classes/greedy-scale-language.js +0 -201
  322. package/lib/classes/slavic-language.d.ts +0 -148
  323. package/lib/classes/slavic-language.js +0 -281
  324. package/lib/classes/south-asian-language.d.ts +0 -70
  325. package/lib/classes/south-asian-language.js +0 -154
  326. package/lib/classes/turkic-language.d.ts +0 -26
  327. package/lib/classes/turkic-language.js +0 -59
@@ -1,20 +1,7 @@
1
1
  /**
2
- * Tamil language converter.
2
+ * Converts a numeric value to Tamil words.
3
3
  *
4
- * Supports:
5
- * - Tamil numbering system
6
- * - Tamil script
7
- * - Complete word forms for 0-99
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Tamil words
8
6
  */
9
- export class Tamil extends AbstractLanguage {
10
- belowHundredWords: string[];
11
- hundredsWords: string[];
12
- onesWords: string[];
13
- scaleWords: string[];
14
- /** Convert numbers below 100 to Tamil words. */
15
- convertBelowHundred(number: any): string;
16
- convertBelowThousand(number: any): string;
17
- splitIndian(number: any): number[];
18
- integerToWords(integerPart: any): string;
19
- }
20
- import { AbstractLanguage } from '../classes/abstract-language.js';
7
+ export function toWords(value: number | string | bigint): string;
@@ -1,226 +1,154 @@
1
- import { AbstractLanguage } from '../classes/abstract-language.js'
2
-
3
1
  /**
4
- * Tamil language converter.
2
+ * Tamil language converter - Functional Implementation
3
+ *
4
+ * Self-contained converter for South Asian numbering.
5
5
  *
6
- * Supports:
7
- * - Tamil numbering system
6
+ * Key features:
7
+ * - Indian numbering system (ஆயிரம், லட்சம், கோடி)
8
8
  * - Tamil script
9
+ * - 3-2-2 grouping pattern
9
10
  * - Complete word forms for 0-99
11
+ * - Special hundred word transformations
12
+ * - Per-digit decimal reading
10
13
  */
11
- export class Tamil extends AbstractLanguage {
12
- negativeWord = 'மைனஸ்'
13
- decimalSeparatorWord = 'புள்ளி'
14
- zeroWord = 'பூஜ்ஜியம்'
15
- usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
16
-
17
- belowHundredWords = [
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
- 'தொண்ணூற்று மூன்று',
112
- 'தொண்ணூற்று நான்கு',
113
- 'தொண்ணூற்று ஐந்து',
114
- 'தொண்ணூற்று ஆறு',
115
- 'தொண்ணூற்று ஏழு',
116
- 'தொண்ணூற்று எட்டு',
117
- 'தொண்ணூற்று ஒன்பது'
118
- ]
119
-
120
- hundredsWords = [
121
- '',
122
- 'நூறு',
123
- 'இருநூறு',
124
- 'முன்னூறு',
125
- 'நானூறு',
126
- 'ஐநூறு',
127
- 'அறுநூறு',
128
- 'எழுநூறு',
129
- 'எண்நூறு',
130
- 'தொள்ளாயிரம்'
131
- ]
132
-
133
- // Ones words map 1–9 for decimal reading
134
- onesWords = [
135
- 'ஒன்று',
136
- 'இரண்டு',
137
- 'மூன்று',
138
- 'நான்கு',
139
- 'ஐந்து',
140
- 'ஆறு',
141
- 'ஏழு',
142
- 'எட்டு',
143
- 'ஒன்பது'
144
- ]
145
-
146
- scaleWords = [
147
- '',
148
- 'ஆயிரம்',
149
- 'லட்சம்',
150
- 'கோடி',
151
- 'அரபு',
152
- 'கராபு',
153
- 'நீல்',
154
- 'பத்ம',
155
- 'சங்கு'
156
- ]
157
-
158
- /** Convert numbers below 100 to Tamil words. */
159
- convertBelowHundred (number) {
160
- return this.belowHundredWords[number]
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)]
161
59
  }
162
60
 
163
- convertBelowThousand (number) {
164
- if (number === 0) return ''
165
- if (number < 100) return this.convertBelowHundred(number)
61
+ const segments = []
62
+ const last3 = numStr.slice(-3)
63
+ segments.unshift(Number(last3))
166
64
 
167
- const hundreds = Math.trunc(number / 100)
168
- const remainder = number % 100
169
- let hundredPart = this.hundredsWords[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
+ }
170
71
 
171
- if (remainder > 0) {
172
- if (hundredPart.endsWith('ம்')) {
173
- hundredPart = hundredPart.replace(/ம்$/, 'த்து')
174
- } else if (hundredPart.endsWith('று')) {
175
- hundredPart = hundredPart.slice(0, -2) + 'ற்று'
176
- }
177
- }
72
+ return segments
73
+ }
178
74
 
179
- const parts = [hundredPart]
180
- if (remainder > 0) {
181
- parts.push(this.convertBelowHundred(remainder))
182
- }
75
+ // ============================================================================
76
+ // Conversion Functions
77
+ // ============================================================================
183
78
 
184
- return parts.join(' ').trim()
79
+ function convertBelowThousand (n) {
80
+ if (n === 0) return ''
81
+ if (n < 100) return BELOW_HUNDRED[n]
82
+
83
+ const hundreds = Math.trunc(n / 100)
84
+ const remainder = n % 100
85
+
86
+ if (remainder === 0) {
87
+ return HUNDREDS[hundreds]
185
88
  }
186
89
 
187
- splitIndian (number) {
188
- const numStr = number.toString()
189
- 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 = []
190
100
 
191
- const groups = []
192
- const last3 = numStr.slice(-3)
193
- groups.unshift(Number(last3))
101
+ for (let i = 0; i < groupCount; i++) {
102
+ const groupValue = groups[i]
103
+ if (groupValue === 0) continue
194
104
 
195
- let remaining = numStr.slice(0, -3)
196
- while (remaining.length > 0) {
197
- const group = remaining.slice(-2)
198
- groups.unshift(Number(group))
199
- 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])
200
110
  }
111
+ }
112
+
113
+ return words.join(' ').trim()
114
+ }
201
115
 
202
- 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])
203
122
  }
123
+ return digits.join(' ')
124
+ }
204
125
 
205
- integerToWords (integerPart) {
206
- if (integerPart === 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)
207
134
 
208
- const groups = this.splitIndian(integerPart)
209
- const groupCount = groups.length
210
- const words = []
135
+ let result = ''
211
136
 
212
- for (let i = 0; i < groupCount; i++) {
213
- const groupValue = groups[i]
214
- if (groupValue === 0) continue
137
+ if (isNegative) {
138
+ result = NEGATIVE + ' '
139
+ }
215
140
 
216
- const scaleIndex = groupCount - i - 1
217
- const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)
218
- words.push(groupWords)
219
- if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
220
- words.push(this.scaleWords[scaleIndex])
221
- }
222
- }
141
+ result += integerToWords(integerPart)
223
142
 
224
- return words.join(' ').trim()
143
+ if (decimalPart) {
144
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
225
145
  }
146
+
147
+ return result
226
148
  }
149
+
150
+ // ============================================================================
151
+ // Exports
152
+ // ============================================================================
153
+
154
+ export { toWords }
@@ -1,22 +1,7 @@
1
1
  /**
2
- * Telugu language converter.
2
+ * Converts a numeric value to Telugu words.
3
3
  *
4
- * Supports:
5
- * - Telugu numbering system
6
- * - Telugu script
7
- * - Complete word forms for 0-99
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Telugu words
8
6
  */
9
- export class Telugu extends AbstractLanguage {
10
- belowHundredWords: string[];
11
- hundredsWords: string[];
12
- onesWords: string[];
13
- scaleWords: string[];
14
- /** Convert numbers below 100 to Telugu words. */
15
- convertBelowHundred(number: any): string;
16
- /** Convert numbers below 1000 to Telugu words. */
17
- convertBelowThousand(number: any): string;
18
- /** Split a number using Indian-style grouping (3-2-2 digits from right). */
19
- splitIndian(number: any): number[];
20
- integerToWords(integerPart: any): string;
21
- }
22
- import { AbstractLanguage } from '../classes/abstract-language.js';
7
+ export function toWords(value: number | string | bigint): string;