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,219 +1,164 @@
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 converter for South Asian numbering.
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 = 'పాయింట్'
23
+
24
+ const BELOW_HUNDRED = [
25
+ 'సున్నా', 'ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది',
26
+ 'పది', 'పదకొండు', 'పన్నెండు', 'పదమూడు', 'పద్నాలుగు', 'పదిహేను', 'పదహారు', 'పదిహేడు', 'పద్దెనిమిది', 'పంతొమ్మిది',
27
+ 'ఇరవై', 'ఇరవై ఒక్కటి', 'ఇరవై రెండు', 'ఇరవై మూడు', 'ఇరవై నాలుగు', 'ఇరవై ఐదు', 'ఇరవై ఆరు', 'ఇరవై ఏడు', 'ఇరవై ఎనిమిది', 'ఇరవై తొమ్మిది',
28
+ 'ముప్పై', 'ముప్పై ఒకటి', 'ముప్పై రెండు', 'ముప్పై మూడు', 'ముప్పై నాలుగు', 'ముప్పై ఐదు', 'ముప్పై ఆరు', 'ముప్పై ఏడు', 'ముప్పై ఎనిమిది', 'ముప్పై తొమ్మిది',
29
+ 'నలభై', 'నలభై ఒకటి', 'నలభై రెండు', 'నలభై మూడు', 'నలభై నాలుగు', 'నలభై ఐదు', 'నలభై ఆరు', 'నలభై ఏడు', 'నలభై ఎనిమిది', 'నలభై తొమ్మిది',
30
+ 'యాభై', 'యాభై ఒకటి', 'యాభై రెండు', 'యాభై మూడు', 'యాభై నాలుగు', 'యాభై ఐదు', 'యాభై ఆరు', 'యాభై ఏడు', 'యాభై ఎనిమిది', 'యాభై తొమ్మిది',
31
+ 'అరవై', 'అరవై ఒకటి', 'అరవై రెండు', 'అరవై మూడు', 'అరవై నాలుగు', 'అరవై ఐదు', 'అరవై ఆరు', 'అరవై ఏడు', 'అరవై ఎనిమిది', 'అరవై తొమ్మిది',
32
+ 'డెబ్బై', 'డెబ్బై ఒకటి', 'డెబ్బై రెండు', 'డెబ్బై మూడు', 'డెబ్బై నాలుగు', 'డెబ్బై ఐదు', 'డెబ్బై ఆరు', 'డెబ్బై ఏడు', 'డెబ్బై ఎనిమిది', 'డెబ్బై తొమ్మిది',
33
+ 'ఎనభై', 'ఎనభై ఒకటి', 'ఎనభై రెండు', 'ఎనభై మూడు', 'ఎనభై నాలుగు', 'ఎనభై ఐదు', 'ఎనభై ఆరు', 'ఎనభై ఏడు', 'ఎనభై ఎనిమిది', 'ఎనభై తొమ్మిది',
34
+ 'తొంభై', 'తొంభై ఒకటి', 'తొంభై రెండు', 'తొంభై మూడు', 'తొంభై నాలుగు', 'తొంభై ఐదు', 'తొంభై ఆరు', 'తొంభై ఏడు', 'తొంభై ఎనిమిది', 'తొంభై తొమ్మిది'
35
+ ]
36
+
37
+ // ============================================================================
38
+ // Vocabulary (continued)
39
+ // ============================================================================
40
+
41
+ const HUNDREDS = ['', 'వంద', 'రెండు వందలు', 'మూడు వందలు', 'నాలుగు వందలు', 'ఐదు వందలు', 'ఆరు వందలు', 'ఏడు వందలు', 'ఎనిమిది వందలు', 'తొమ్మిది వందలు']
42
+
43
+ // Ones for decimal reading
44
+ const ONES = ['ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది']
45
+
46
+ // Scale words: index 0 = units, 1 = thousand, 2 = lakh, etc.
47
+ const SCALE_WORDS = ['', 'వెయ్యి', 'లక్ష', 'కోటి', 'అరబ్', 'ఖరబ్', 'నిల్', 'పడ్మ', 'శంకు']
48
+
49
+ // ============================================================================
50
+ // Conversion Functions
51
+ // ============================================================================
52
+
53
+ /**
54
+ * Converts 0-999 to Telugu words.
55
+ */
56
+ function convertBelowThousand (n) {
57
+ if (n === 0) return ''
58
+ if (n < 100) return BELOW_HUNDRED[n]
59
+
60
+ const hundreds = Math.trunc(n / 100)
61
+ const remainder = n % 100
62
+
63
+ if (remainder === 0) {
64
+ return HUNDREDS[hundreds]
65
+ }
66
+ return HUNDREDS[hundreds] + ' ' + BELOW_HUNDRED[remainder]
67
+ }
68
+
69
+ /**
70
+ * Converts a non-negative integer to Telugu words.
71
+ * Uses recursive approach for Indian 3-2-2 grouping pattern.
72
+ *
73
+ * @param {bigint} n - Non-negative integer to convert
74
+ * @returns {string} Telugu words
75
+ */
76
+ function integerToWords (n) {
77
+ if (n === 0n) return ZERO
175
78
 
176
- return parts.join(' ').trim()
79
+ // Fast path: numbers < 1000 (direct lookup)
80
+ if (n < 1000n) {
81
+ return convertBelowThousand(Number(n))
177
82
  }
178
83
 
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)]
84
+ return buildLargeNumberWords(n, 0)
85
+ }
183
86
 
184
- const groups = []
185
- const last3 = numStr.slice(-3)
186
- groups.unshift(Number(last3))
87
+ /**
88
+ * Recursively builds words for numbers >= 1000.
89
+ * Indian grouping: first 3 digits, then 2-digit groups.
90
+ *
91
+ * @param {bigint} n - Number to convert
92
+ * @param {number} scale - Current scale index (0=units, 1=thousands, etc.)
93
+ * @returns {string} Telugu words
94
+ */
95
+ function buildLargeNumberWords (n, scale) {
96
+ if (n === 0n) return ''
97
+
98
+ // Determine divisor: 1000 for first split, 100 for rest
99
+ const divisor = scale === 0 ? 1000n : 100n
100
+ const segment = Number(n % divisor)
101
+ const rest = n / divisor
102
+
103
+ // Build higher segments first (recursive)
104
+ let result = ''
105
+ if (rest > 0n) {
106
+ result = buildLargeNumberWords(rest, scale + 1)
107
+ }
187
108
 
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)
109
+ // Add current segment
110
+ if (segment > 0) {
111
+ if (result) result += ' '
112
+
113
+ if (scale === 0) {
114
+ // Units segment (0-999)
115
+ result += convertBelowThousand(segment)
116
+ } else {
117
+ // Scale segments (0-99)
118
+ const groupWords = (segment === 1) ? 'ఒక' : BELOW_HUNDRED[segment]
119
+ result += groupWords + ' ' + SCALE_WORDS[scale]
193
120
  }
121
+ }
122
+
123
+ return result
124
+ }
194
125
 
195
- return groups
126
+ function decimalPartToWords (decimalPart) {
127
+ // Per-digit decimal reading
128
+ const digits = []
129
+ for (const char of decimalPart) {
130
+ const d = parseInt(char, 10)
131
+ digits.push(d === 0 ? ZERO : ONES[d - 1])
196
132
  }
133
+ return digits.join(' ')
134
+ }
197
135
 
198
- integerToWords (integerPart) {
199
- if (integerPart === 0n) return this.zeroWord
136
+ /**
137
+ * Converts a numeric value to Telugu words.
138
+ *
139
+ * @param {number | string | bigint} value - The numeric value to convert
140
+ * @returns {string} The number in Telugu words
141
+ */
142
+ function toWords (value) {
143
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
200
144
 
201
- const groups = this.splitIndian(integerPart)
202
- const groupCount = groups.length
203
- const words = []
145
+ let result = ''
204
146
 
205
- for (let i = 0; i < groupCount; i++) {
206
- const groupValue = groups[i]
207
- if (groupValue === 0) continue
147
+ if (isNegative) {
148
+ result = NEGATIVE + ' '
149
+ }
208
150
 
209
- const scaleIndex = groupCount - i - 1
210
- const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
211
- words.push(groupWords)
212
- if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
213
- words.push(this.scaleWords[scaleIndex])
214
- }
215
- }
151
+ result += integerToWords(integerPart)
216
152
 
217
- return words.join(' ').trim()
153
+ if (decimalPart) {
154
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
218
155
  }
156
+
157
+ return result
219
158
  }
159
+
160
+ // ============================================================================
161
+ // Exports
162
+ // ============================================================================
163
+
164
+ 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;