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