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,219 +1,156 @@
1
- import { AbstractLanguage } from '../classes/abstract-language.js'
2
-
3
1
  /**
4
- * Telugu language converter.
2
+ * Telugu language converter - Functional Implementation
3
+ *
4
+ * Self-contained module with its own input validation, ready for subpath exports.
5
5
  *
6
- * Supports:
7
- * - Telugu numbering system
6
+ * Key features:
7
+ * - Indian numbering system (వెయ్యి, లక్ష, కోటి)
8
8
  * - Telugu script
9
+ * - 3-2-2 grouping pattern
9
10
  * - Complete word forms for 0-99
11
+ * - Per-digit decimal reading
10
12
  */
11
- export class Telugu 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 Telugu words. */
159
- convertBelowHundred (number) {
160
- return this.belowHundredWords[number]
161
- }
162
13
 
163
- /** Convert numbers below 1000 to Telugu words. */
164
- convertBelowThousand (number) {
165
- if (number === 0) return ''
166
- if (number < 100) return this.convertBelowHundred(number)
14
+ import { parseNumericValue } from '../utils/parse-numeric.js'
167
15
 
168
- const hundreds = Math.trunc(number / 100)
169
- const remainder = number % 100
170
- const parts = [this.hundredsWords[hundreds]]
16
+ // ============================================================================
17
+ // Vocabulary
18
+ // ============================================================================
171
19
 
172
- if (remainder > 0) {
173
- parts.push(this.convertBelowHundred(remainder))
174
- }
20
+ const ZERO = 'సున్నా'
21
+ const NEGATIVE = 'మైనస్'
22
+ const DECIMAL_SEP = 'పాయింట్'
175
23
 
176
- return parts.join(' ').trim()
177
- }
24
+ const BELOW_HUNDRED = [
25
+ 'సున్నా', 'ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది',
26
+ 'పది', 'పదకొండు', 'పన్నెండు', 'పదమూడు', 'పద్నాలుగు', 'పదిహేను', 'పదహారు', 'పదిహేడు', 'పద్దెనిమిది', 'పంతొమ్మిది',
27
+ 'ఇరవై', 'ఇరవై ఒక్కటి', 'ఇరవై రెండు', 'ఇరవై మూడు', 'ఇరవై నాలుగు', 'ఇరవై ఐదు', 'ఇరవై ఆరు', 'ఇరవై ఏడు', 'ఇరవై ఎనిమిది', 'ఇరవై తొమ్మిది',
28
+ 'ముప్పై', 'ముప్పై ఒకటి', 'ముప్పై రెండు', 'ముప్పై మూడు', 'ముప్పై నాలుగు', 'ముప్పై ఐదు', 'ముప్పై ఆరు', 'ముప్పై ఏడు', 'ముప్పై ఎనిమిది', 'ముప్పై తొమ్మిది',
29
+ 'నలభై', 'నలభై ఒకటి', 'నలభై రెండు', 'నలభై మూడు', 'నలభై నాలుగు', 'నలభై ఐదు', 'నలభై ఆరు', 'నలభై ఏడు', 'నలభై ఎనిమిది', 'నలభై తొమ్మిది',
30
+ 'యాభై', 'యాభై ఒకటి', 'యాభై రెండు', 'యాభై మూడు', 'యాభై నాలుగు', 'యాభై ఐదు', 'యాభై ఆరు', 'యాభై ఏడు', 'యాభై ఎనిమిది', 'యాభై తొమ్మిది',
31
+ 'అరవై', 'అరవై ఒకటి', 'అరవై రెండు', 'అరవై మూడు', 'అరవై నాలుగు', 'అరవై ఐదు', 'అరవై ఆరు', 'అరవై ఏడు', 'అరవై ఎనిమిది', 'అరవై తొమ్మిది',
32
+ 'డెబ్బై', 'డెబ్బై ఒకటి', 'డెబ్బై రెండు', 'డెబ్బై మూడు', 'డెబ్బై నాలుగు', 'డెబ్బై ఐదు', 'డెబ్బై ఆరు', 'డెబ్బై ఏడు', 'డెబ్బై ఎనిమిది', 'డెబ్బై తొమ్మిది',
33
+ 'ఎనభై', 'ఎనభై ఒకటి', 'ఎనభై రెండు', 'ఎనభై మూడు', 'ఎనభై నాలుగు', 'ఎనభై ఐదు', 'ఎనభై ఆరు', 'ఎనభై ఏడు', 'ఎనభై ఎనిమిది', 'ఎనభై తొమ్మిది',
34
+ 'తొంభై', 'తొంభై ఒకటి', 'తొంభై రెండు', 'తొంభై మూడు', 'తొంభై నాలుగు', 'తొంభై ఐదు', 'తొంభై ఆరు', 'తొంభై ఏడు', 'తొంభై ఎనిమిది', 'తొంభై తొమ్మిది'
35
+ ]
178
36
 
179
- /** Split a number using Indian-style grouping (3-2-2 digits from right). */
180
- splitIndian (number) {
181
- const numStr = number.toString()
182
- if (numStr.length <= 3) return [Number(numStr)]
37
+ const HUNDREDS = ['', 'వంద', 'రెండు వందలు', 'మూడు వందలు', 'నాలుగు వందలు', 'ఐదు వందలు', 'ఆరు వందలు', 'ఏడు వందలు', 'ఎనిమిది వందలు', 'తొమ్మిది వందలు']
183
38
 
184
- const groups = []
185
- const last3 = numStr.slice(-3)
186
- groups.unshift(Number(last3))
39
+ // Ones for decimal reading
40
+ const ONES = ['ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది']
187
41
 
188
- let remaining = numStr.slice(0, -3)
189
- while (remaining.length > 0) {
190
- const group = remaining.slice(-2)
191
- groups.unshift(Number(group))
192
- remaining = remaining.slice(0, -2)
193
- }
42
+ // Scale words: index 0 = units, 1 = thousand, 2 = lakh, etc.
43
+ const SCALE_WORDS = ['', 'వెయ్యి', 'లక్ష', 'కోటి', 'అరబ్', 'ఖరబ్', 'నిల్', 'పడ్మ', 'శంకు']
44
+
45
+ // ============================================================================
46
+ // Segment Building
47
+ // ============================================================================
48
+
49
+ /**
50
+ * Builds words for a 0-999 segment.
51
+ */
52
+ function buildSegment (n) {
53
+ if (n === 0) return ''
54
+ if (n < 100) return BELOW_HUNDRED[n]
194
55
 
195
- return groups
56
+ const hundreds = Math.trunc(n / 100)
57
+ const remainder = n % 100
58
+
59
+ if (remainder === 0) {
60
+ return HUNDREDS[hundreds]
196
61
  }
62
+ return HUNDREDS[hundreds] + ' ' + BELOW_HUNDRED[remainder]
63
+ }
64
+
65
+ // ============================================================================
66
+ // Conversion Functions
67
+ // ============================================================================
68
+
69
+ /**
70
+ * Converts a non-negative integer to Telugu words.
71
+ *
72
+ * Uses BigInt modulo for segment extraction (faster than string slicing).
73
+ * South Asian 3-2-2 grouping: first 3 digits, then groups of 2.
74
+ *
75
+ * @param {bigint} n - Non-negative integer to convert
76
+ * @returns {string} Telugu words
77
+ */
78
+ function integerToWords (n) {
79
+ if (n === 0n) return ZERO
197
80
 
198
- integerToWords (integerPart) {
199
- if (integerPart === 0n) return this.zeroWord
81
+ // Fast path: numbers < 1000 (direct lookup)
82
+ if (n < 1000n) {
83
+ return buildSegment(Number(n))
84
+ }
200
85
 
201
- const groups = this.splitIndian(integerPart)
202
- const groupCount = groups.length
203
- const words = []
86
+ // Extract segments using BigInt modulo
87
+ const segments = []
88
+ segments.push(Number(n % 1000n))
89
+ let temp = n / 1000n
204
90
 
205
- for (let i = 0; i < groupCount; i++) {
206
- const groupValue = groups[i]
207
- if (groupValue === 0) continue
91
+ while (temp > 0n) {
92
+ segments.push(Number(temp % 100n))
93
+ temp = temp / 100n
94
+ }
208
95
 
209
- const scaleIndex = groupCount - i - 1
210
- const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
96
+ // Build result string (process from most-significant to least)
97
+ const words = []
98
+ for (let i = segments.length - 1; i >= 0; i--) {
99
+ const segment = segments[i]
100
+ if (segment === 0) continue
101
+
102
+ if (i === 0) {
103
+ words.push(buildSegment(segment))
104
+ } else {
105
+ // Use 'ఒక' for 1 at scale positions
106
+ const groupWords = (segment === 1) ? 'ఒక' : BELOW_HUNDRED[segment]
211
107
  words.push(groupWords)
212
- if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
213
- words.push(this.scaleWords[scaleIndex])
214
- }
215
108
  }
216
109
 
217
- return words.join(' ').trim()
110
+ if (i > 0 && SCALE_WORDS[i]) {
111
+ words.push(SCALE_WORDS[i])
112
+ }
113
+ }
114
+
115
+ return words.join(' ')
116
+ }
117
+
118
+ function decimalPartToWords (decimalPart) {
119
+ // Per-digit decimal reading
120
+ const digits = []
121
+ for (const char of decimalPart) {
122
+ const d = parseInt(char, 10)
123
+ digits.push(d === 0 ? ZERO : ONES[d - 1])
218
124
  }
125
+ return digits.join(' ')
219
126
  }
127
+
128
+ /**
129
+ * Converts a numeric value to Telugu words.
130
+ *
131
+ * @param {number | string | bigint} value - The numeric value to convert
132
+ * @returns {string} The number in Telugu words
133
+ */
134
+ function toWords (value) {
135
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
136
+
137
+ let result = ''
138
+
139
+ if (isNegative) {
140
+ result = NEGATIVE + ' '
141
+ }
142
+
143
+ result += integerToWords(integerPart)
144
+
145
+ if (decimalPart) {
146
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
147
+ }
148
+
149
+ return result
150
+ }
151
+
152
+ // ============================================================================
153
+ // Exports
154
+ // ============================================================================
155
+
156
+ export { toWords }
@@ -1,17 +1,7 @@
1
1
  /**
2
- * Thai language converter.
2
+ * Converts a numeric value to Thai words.
3
3
  *
4
- * Supports:
5
- * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
6
- * - No word separators (continuous Thai script)
7
- * - Digit-by-digit decimal reading
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Thai words
8
6
  */
9
- export class Thai extends AbstractLanguage {
10
- onesWords: string[];
11
- /** Converts numbers below one million to Thai words. */
12
- convertBelowMillion(number: any): string;
13
- /** Split a number into million-sized groups for processing. */
14
- splitMillionGroups(number: any): number[];
15
- integerToWords(integerPart: any): string;
16
- }
17
- import { AbstractLanguage } from '../classes/abstract-language.js';
7
+ export function toWords(value: number | string | bigint): string;
@@ -1,117 +1,161 @@
1
- import { AbstractLanguage } from '../classes/abstract-language.js'
2
-
3
1
  /**
4
- * Thai language converter.
2
+ * Thai language converter - Functional Implementation
3
+ *
4
+ * Self-contained converter with precomputed lookup tables.
5
5
  *
6
- * Supports:
7
- * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
6
+ * Key features:
8
7
  * - No word separators (continuous Thai script)
9
- * - Digit-by-digit decimal reading
8
+ * - Million-based grouping (ล้าน)
9
+ * - Special handling for 1 as "เอ็ด" in compounds
10
+ * - 20 is "ยี่สิบ" (not "สองสิบ")
11
+ * - Per-digit decimal reading
10
12
  */
11
- export class Thai extends AbstractLanguage {
12
- negativeWord = 'ลบ'
13
- decimalSeparatorWord = 'จุด'
14
- zeroWord = 'ศูนย์'
15
- wordSeparator = ''
16
- usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
17
-
18
- // Ones words map 1–9
19
- onesWords = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']
20
-
21
- /** Converts numbers below one million to Thai words. */
22
- convertBelowMillion (number) {
23
- if (number === 0) return ''
24
-
25
- let value = number
26
- const parts = []
27
-
28
- const hundredThousands = Math.trunc(value / 100000)
29
- value %= 100000
30
- const tenThousands = Math.trunc(value / 10000)
31
- value %= 10000
32
- const thousands = Math.trunc(value / 1000)
33
- value %= 1000
34
- const hundreds = Math.trunc(value / 100)
35
- value %= 100
36
- const tens = Math.trunc(value / 10)
37
- const ones = value % 10
38
-
39
- if (hundredThousands > 0) {
40
- parts.push(this.onesWords[hundredThousands - 1] + 'แสน')
41
- }
42
13
 
43
- if (tenThousands > 0) {
44
- if (tenThousands === 1) {
45
- parts.push('หนึ่งหมื่น')
46
- } else {
47
- parts.push(this.onesWords[tenThousands - 1] + 'หมื่น')
48
- }
49
- }
14
+ import { parseNumericValue } from '../utils/parse-numeric.js'
50
15
 
51
- if (thousands > 0) {
52
- parts.push(this.onesWords[thousands - 1] + 'พัน')
53
- }
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 = []
54
35
 
55
- if (hundreds > 0) {
56
- parts.push(this.onesWords[hundreds - 1] + 'ร้อย')
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
+ }
50
+
51
+ if (tenThousands > 0) {
52
+ if (tenThousands === 1) {
53
+ parts.push('หนึ่งหมื่น')
54
+ } else {
55
+ parts.push(ONES[tenThousands - 1] + 'หมื่น')
57
56
  }
57
+ }
58
+
59
+ if (thousands > 0) {
60
+ parts.push(ONES[thousands - 1] + 'พัน')
61
+ }
62
+
63
+ if (hundreds > 0) {
64
+ parts.push(ONES[hundreds - 1] + 'ร้อย')
65
+ }
58
66
 
59
- if (tens > 0) {
60
- if (tens === 1) {
61
- parts.push('สิบ')
62
- } else if (tens === 2) {
63
- parts.push('ยี่สิบ')
64
- } else {
65
- parts.push(this.onesWords[tens - 1] + 'สิบ')
66
- }
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] + 'สิบ')
67
74
  }
75
+ }
68
76
 
69
- if (ones > 0) {
70
- const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0
71
- if (ones === 1 && (tens > 0 || hasHigher)) {
72
- parts.push('เอ็ด')
73
- } else {
74
- parts.push(this.onesWords[ones - 1])
75
- }
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])
76
83
  }
84
+ }
77
85
 
78
- return parts.join('')
86
+ return parts.join('')
87
+ }
88
+
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
79
98
  }
80
99
 
81
- /** Split a number into million-sized groups for processing. */
82
- splitMillionGroups (number) {
83
- const groups = []
84
- let remaining = number
100
+ return groups
101
+ }
102
+
103
+ function integerToWords (n) {
104
+ if (n === 0n) return ZERO
85
105
 
86
- const million = 1_000_000n
87
- while (remaining > 0n) {
88
- const chunk = Number(remaining % million)
89
- groups.unshift(chunk)
90
- remaining = remaining / million
106
+ const groups = splitMillionGroups(n)
107
+ const parts = []
108
+
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))
91
117
  }
118
+ }
119
+
120
+ return parts.join('')
121
+ }
92
122
 
93
- return groups
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])
94
129
  }
130
+ return digits.join('')
131
+ }
95
132
 
96
- integerToWords (integerPart) {
97
- if (integerPart === 0n) {
98
- return this.zeroWord
99
- }
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)
100
141
 
101
- const groups = this.splitMillionGroups(integerPart)
102
- const parts = []
142
+ let result = ''
103
143
 
104
- for (let i = 0; i < groups.length; i++) {
105
- const groupValue = groups[i]
106
- if (groupValue === 0) continue
144
+ if (isNegative) {
145
+ result = NEGATIVE
146
+ }
107
147
 
108
- parts.push(this.convertBelowMillion(groupValue))
109
- const remaining = groups.length - i - 1
110
- if (remaining > 0) {
111
- parts.push('ล้าน'.repeat(remaining))
112
- }
113
- }
148
+ result += integerToWords(integerPart)
114
149
 
115
- return parts.join('')
150
+ if (decimalPart) {
151
+ result += DECIMAL_SEP + decimalPartToWords(decimalPart)
116
152
  }
153
+
154
+ return result
117
155
  }
156
+
157
+ // ============================================================================
158
+ // Exports
159
+ // ============================================================================
160
+
161
+ export { toWords }
@@ -1,12 +1,18 @@
1
1
  /**
2
- * Turkish language converter.
2
+ * Converts a numeric value to Turkish words.
3
3
  *
4
- * Supports:
5
- * - Omits 'bir' (one) before hundreds and thousands
6
- * - Optional space removal via dropSpaces option
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Conversion options
6
+ * @param {boolean} [options.dropSpaces=false] - Remove spaces for compound form
7
+ * @returns {string} The number in Turkish words
8
+ * @throws {TypeError} If value is not a valid numeric type
9
+ * @throws {Error} If value is not a valid number format
10
+ *
11
+ * @example
12
+ * toWords(21) // 'yirmi bir'
13
+ * toWords(21, { dropSpaces: true }) // 'yirmibir'
14
+ * toWords(1000) // 'bin'
7
15
  */
8
- export class Turkish extends TurkicLanguage {
9
- constructor(options?: {});
10
- scaleWords: (string | bigint)[][];
11
- }
12
- import { TurkicLanguage } from '../classes/turkic-language.js';
16
+ export function toWords(value: number | string | bigint, options?: {
17
+ dropSpaces?: boolean | undefined;
18
+ }): string;