n2words 1.24.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +183 -156
  3. package/dist/languages/am-Latn.js +3 -0
  4. package/dist/languages/am-Latn.js.map +1 -0
  5. package/dist/languages/am.js +3 -0
  6. package/dist/languages/am.js.map +1 -0
  7. package/dist/languages/ar.js +3 -2
  8. package/dist/languages/ar.js.map +1 -1
  9. package/dist/languages/az.js +3 -2
  10. package/dist/languages/az.js.map +1 -1
  11. package/dist/languages/bn.js +3 -2
  12. package/dist/languages/bn.js.map +1 -1
  13. package/dist/languages/cs.js +3 -2
  14. package/dist/languages/cs.js.map +1 -1
  15. package/dist/languages/da.js +3 -2
  16. package/dist/languages/da.js.map +1 -1
  17. package/dist/languages/de.js +3 -2
  18. package/dist/languages/de.js.map +1 -1
  19. package/dist/languages/el.js +3 -2
  20. package/dist/languages/el.js.map +1 -1
  21. package/dist/languages/en.js +3 -2
  22. package/dist/languages/en.js.map +1 -1
  23. package/dist/languages/es.js +3 -2
  24. package/dist/languages/es.js.map +1 -1
  25. package/dist/languages/fa.js +3 -2
  26. package/dist/languages/fa.js.map +1 -1
  27. package/dist/languages/fi.js +3 -0
  28. package/dist/languages/fi.js.map +1 -0
  29. package/dist/languages/fil.js +3 -2
  30. package/dist/languages/fil.js.map +1 -1
  31. package/dist/languages/fr-BE.js +3 -2
  32. package/dist/languages/fr-BE.js.map +1 -1
  33. package/dist/languages/fr.js +3 -2
  34. package/dist/languages/fr.js.map +1 -1
  35. package/dist/languages/gu.js +3 -2
  36. package/dist/languages/gu.js.map +1 -1
  37. package/dist/languages/ha.js +3 -0
  38. package/dist/languages/ha.js.map +1 -0
  39. package/dist/languages/hbo.js +3 -0
  40. package/dist/languages/hbo.js.map +1 -0
  41. package/dist/languages/he.js +3 -2
  42. package/dist/languages/he.js.map +1 -1
  43. package/dist/languages/hi.js +3 -2
  44. package/dist/languages/hi.js.map +1 -1
  45. package/dist/languages/hr.js +3 -2
  46. package/dist/languages/hr.js.map +1 -1
  47. package/dist/languages/hu.js +3 -2
  48. package/dist/languages/hu.js.map +1 -1
  49. package/dist/languages/id.js +3 -2
  50. package/dist/languages/id.js.map +1 -1
  51. package/dist/languages/it.js +3 -2
  52. package/dist/languages/it.js.map +1 -1
  53. package/dist/languages/ja.js +3 -2
  54. package/dist/languages/ja.js.map +1 -1
  55. package/dist/languages/kn.js +3 -2
  56. package/dist/languages/kn.js.map +1 -1
  57. package/dist/languages/ko.js +3 -2
  58. package/dist/languages/ko.js.map +1 -1
  59. package/dist/languages/lt.js +3 -2
  60. package/dist/languages/lt.js.map +1 -1
  61. package/dist/languages/lv.js +3 -2
  62. package/dist/languages/lv.js.map +1 -1
  63. package/dist/languages/mr.js +3 -2
  64. package/dist/languages/mr.js.map +1 -1
  65. package/dist/languages/ms.js +3 -2
  66. package/dist/languages/ms.js.map +1 -1
  67. package/dist/languages/nb.js +3 -2
  68. package/dist/languages/nb.js.map +1 -1
  69. package/dist/languages/nl.js +3 -2
  70. package/dist/languages/nl.js.map +1 -1
  71. package/dist/languages/pa.js +3 -0
  72. package/dist/languages/pa.js.map +1 -0
  73. package/dist/languages/pl.js +3 -2
  74. package/dist/languages/pl.js.map +1 -1
  75. package/dist/languages/pt.js +3 -2
  76. package/dist/languages/pt.js.map +1 -1
  77. package/dist/languages/ro.js +3 -2
  78. package/dist/languages/ro.js.map +1 -1
  79. package/dist/languages/ru.js +3 -2
  80. package/dist/languages/ru.js.map +1 -1
  81. package/dist/languages/sr-Cyrl.js +3 -0
  82. package/dist/languages/sr-Cyrl.js.map +1 -0
  83. package/dist/languages/sr-Latn.js +3 -2
  84. package/dist/languages/sr-Latn.js.map +1 -1
  85. package/dist/languages/sv.js +3 -2
  86. package/dist/languages/sv.js.map +1 -1
  87. package/dist/languages/sw.js +3 -2
  88. package/dist/languages/sw.js.map +1 -1
  89. package/dist/languages/ta.js +3 -2
  90. package/dist/languages/ta.js.map +1 -1
  91. package/dist/languages/te.js +3 -2
  92. package/dist/languages/te.js.map +1 -1
  93. package/dist/languages/th.js +3 -2
  94. package/dist/languages/th.js.map +1 -1
  95. package/dist/languages/tr.js +3 -2
  96. package/dist/languages/tr.js.map +1 -1
  97. package/dist/languages/uk.js +3 -2
  98. package/dist/languages/uk.js.map +1 -1
  99. package/dist/languages/ur.js +3 -2
  100. package/dist/languages/ur.js.map +1 -1
  101. package/dist/languages/vi.js +3 -2
  102. package/dist/languages/vi.js.map +1 -1
  103. package/dist/languages/zh-Hans.js +3 -2
  104. package/dist/languages/zh-Hans.js.map +1 -1
  105. package/dist/languages/zh-Hant.js +3 -0
  106. package/dist/languages/zh-Hant.js.map +1 -0
  107. package/dist/n2words.js +3 -2
  108. package/dist/n2words.js.map +1 -1
  109. package/lib/languages/am-Latn.d.ts +7 -0
  110. package/lib/languages/am-Latn.js +164 -0
  111. package/lib/languages/am.d.ts +7 -0
  112. package/lib/languages/am.js +164 -0
  113. package/lib/languages/ar.d.ts +17 -0
  114. package/lib/languages/ar.js +171 -209
  115. package/lib/languages/az.d.ts +7 -0
  116. package/lib/languages/az.js +167 -49
  117. package/lib/languages/bn.d.ts +7 -0
  118. package/lib/languages/bn.js +142 -123
  119. package/lib/languages/cs.d.ts +18 -0
  120. package/lib/languages/cs.js +303 -176
  121. package/lib/languages/da.d.ts +14 -0
  122. package/lib/languages/da.js +267 -139
  123. package/lib/languages/de.d.ts +17 -0
  124. package/lib/languages/de.js +310 -113
  125. package/lib/languages/el.d.ts +14 -0
  126. package/lib/languages/el.js +225 -98
  127. package/lib/languages/en.d.ts +17 -0
  128. package/lib/languages/en.js +235 -102
  129. package/lib/languages/es.d.ts +21 -0
  130. package/lib/languages/es.js +307 -125
  131. package/lib/languages/fa.d.ts +7 -0
  132. package/lib/languages/fa.js +115 -108
  133. package/lib/languages/fi.d.ts +14 -0
  134. package/lib/languages/fi.js +245 -0
  135. package/lib/languages/fil.d.ts +7 -0
  136. package/lib/languages/fil.js +199 -139
  137. package/lib/languages/fr-BE.d.ts +11 -0
  138. package/lib/languages/fr-BE.js +287 -48
  139. package/lib/languages/fr.d.ts +21 -0
  140. package/lib/languages/fr.js +343 -119
  141. package/lib/languages/gu.d.ts +7 -0
  142. package/lib/languages/gu.js +125 -144
  143. package/lib/languages/ha.d.ts +7 -0
  144. package/lib/languages/ha.js +230 -0
  145. package/lib/languages/hbo.d.ts +13 -0
  146. package/lib/languages/hbo.js +300 -0
  147. package/lib/languages/he.d.ts +13 -0
  148. package/lib/languages/he.js +230 -283
  149. package/lib/languages/hi.d.ts +7 -0
  150. package/lib/languages/hi.js +142 -123
  151. package/lib/languages/hr.d.ts +11 -0
  152. package/lib/languages/hr.js +190 -129
  153. package/lib/languages/hu.d.ts +7 -0
  154. package/lib/languages/hu.js +194 -133
  155. package/lib/languages/id.d.ts +7 -0
  156. package/lib/languages/id.js +167 -140
  157. package/lib/languages/it.d.ts +19 -0
  158. package/lib/languages/it.js +337 -108
  159. package/lib/languages/ja.d.ts +17 -0
  160. package/lib/languages/ja.js +224 -155
  161. package/lib/languages/kn.d.ts +7 -0
  162. package/lib/languages/kn.js +128 -62
  163. package/lib/languages/ko.d.ts +14 -0
  164. package/lib/languages/ko.js +250 -70
  165. package/lib/languages/lt.d.ts +18 -0
  166. package/lib/languages/lt.js +287 -148
  167. package/lib/languages/lv.d.ts +18 -0
  168. package/lib/languages/lv.js +291 -123
  169. package/lib/languages/mr.d.ts +7 -0
  170. package/lib/languages/mr.js +125 -144
  171. package/lib/languages/ms.d.ts +7 -0
  172. package/lib/languages/ms.js +171 -112
  173. package/lib/languages/nb.d.ts +14 -0
  174. package/lib/languages/nb.js +275 -100
  175. package/lib/languages/nl.d.ts +26 -0
  176. package/lib/languages/nl.js +307 -174
  177. package/lib/languages/pa.d.ts +7 -0
  178. package/lib/languages/pa.js +163 -0
  179. package/lib/languages/pl.d.ts +22 -0
  180. package/lib/languages/pl.js +299 -158
  181. package/lib/languages/pt.d.ts +17 -0
  182. package/lib/languages/pt.js +279 -120
  183. package/lib/languages/ro.d.ts +18 -0
  184. package/lib/languages/ro.js +214 -337
  185. package/lib/languages/ru.d.ts +11 -0
  186. package/lib/languages/ru.js +219 -95
  187. package/lib/languages/sr-Cyrl.d.ts +11 -0
  188. package/lib/languages/sr-Cyrl.js +215 -0
  189. package/lib/languages/sr-Latn.d.ts +11 -0
  190. package/lib/languages/sr-Latn.js +190 -132
  191. package/lib/languages/sv.d.ts +14 -0
  192. package/lib/languages/sv.js +280 -103
  193. package/lib/languages/sw.d.ts +7 -0
  194. package/lib/languages/sw.js +135 -103
  195. package/lib/languages/ta.d.ts +7 -0
  196. package/lib/languages/ta.js +133 -205
  197. package/lib/languages/te.d.ts +7 -0
  198. package/lib/languages/te.js +148 -213
  199. package/lib/languages/th.d.ts +7 -0
  200. package/lib/languages/th.js +139 -101
  201. package/lib/languages/tr.d.ts +18 -0
  202. package/lib/languages/tr.js +246 -66
  203. package/lib/languages/uk.d.ts +11 -0
  204. package/lib/languages/uk.js +197 -101
  205. package/lib/languages/ur.d.ts +7 -0
  206. package/lib/languages/ur.js +160 -123
  207. package/lib/languages/vi.d.ts +17 -0
  208. package/lib/languages/vi.js +287 -164
  209. package/lib/languages/zh-Hans.d.ts +11 -0
  210. package/lib/languages/zh-Hans.js +159 -142
  211. package/lib/languages/zh-Hant.d.ts +11 -0
  212. package/lib/languages/zh-Hant.js +202 -0
  213. package/lib/n2words.d.ts +53 -0
  214. package/lib/n2words.js +91 -227
  215. package/lib/utils/is-plain-object.d.ts +13 -0
  216. package/lib/utils/is-plain-object.js +17 -0
  217. package/lib/utils/parse-numeric.d.ts +17 -0
  218. package/lib/utils/parse-numeric.js +108 -0
  219. package/lib/utils/validate-options.d.ts +8 -0
  220. package/lib/utils/validate-options.js +16 -0
  221. package/package.json +118 -67
  222. package/dist/languages/pa-Guru.js +0 -2
  223. package/dist/languages/pa-Guru.js.map +0 -1
  224. package/lib/classes/abstract-language.js +0 -261
  225. package/lib/classes/greedy-scale-language.js +0 -195
  226. package/lib/classes/slavic-language.js +0 -251
  227. package/lib/classes/south-asian-language.js +0 -161
  228. package/lib/classes/turkic-language.js +0 -63
  229. package/lib/languages/pa-Guru.js +0 -126
  230. package/typings/classes/abstract-language.d.ts +0 -144
  231. package/typings/classes/greedy-scale-language.d.ts +0 -148
  232. package/typings/classes/slavic-language.d.ts +0 -145
  233. package/typings/classes/south-asian-language.d.ts +0 -101
  234. package/typings/classes/turkic-language.d.ts +0 -42
  235. package/typings/languages/ar.d.ts +0 -93
  236. package/typings/languages/az.d.ts +0 -25
  237. package/typings/languages/bn.d.ts +0 -1
  238. package/typings/languages/cs.d.ts +0 -120
  239. package/typings/languages/da.d.ts +0 -53
  240. package/typings/languages/de.d.ts +0 -26
  241. package/typings/languages/el.d.ts +0 -11
  242. package/typings/languages/en.d.ts +0 -30
  243. package/typings/languages/es.d.ts +0 -43
  244. package/typings/languages/fa.d.ts +0 -81
  245. package/typings/languages/fil.d.ts +0 -12
  246. package/typings/languages/fr-BE.d.ts +0 -41
  247. package/typings/languages/fr.d.ts +0 -43
  248. package/typings/languages/gu.d.ts +0 -12
  249. package/typings/languages/he.d.ts +0 -197
  250. package/typings/languages/hi.d.ts +0 -1
  251. package/typings/languages/hr.d.ts +0 -110
  252. package/typings/languages/hu.d.ts +0 -37
  253. package/typings/languages/id.d.ts +0 -69
  254. package/typings/languages/it.d.ts +0 -51
  255. package/typings/languages/ja.d.ts +0 -58
  256. package/typings/languages/kn.d.ts +0 -11
  257. package/typings/languages/ko.d.ts +0 -25
  258. package/typings/languages/lt.d.ts +0 -110
  259. package/typings/languages/lv.d.ts +0 -99
  260. package/typings/languages/mr.d.ts +0 -12
  261. package/typings/languages/ms.d.ts +0 -37
  262. package/typings/languages/nb.d.ts +0 -27
  263. package/typings/languages/nl.d.ts +0 -65
  264. package/typings/languages/pa-Guru.d.ts +0 -1
  265. package/typings/languages/pl.d.ts +0 -116
  266. package/typings/languages/pt.d.ts +0 -39
  267. package/typings/languages/ro.d.ts +0 -229
  268. package/typings/languages/ru.d.ts +0 -108
  269. package/typings/languages/sr-Latn.d.ts +0 -98
  270. package/typings/languages/sv.d.ts +0 -30
  271. package/typings/languages/sw.d.ts +0 -1
  272. package/typings/languages/ta.d.ts +0 -1
  273. package/typings/languages/te.d.ts +0 -1
  274. package/typings/languages/th.d.ts +0 -1
  275. package/typings/languages/tr.d.ts +0 -46
  276. package/typings/languages/uk.d.ts +0 -117
  277. package/typings/languages/ur.d.ts +0 -1
  278. package/typings/languages/vi.d.ts +0 -116
  279. package/typings/languages/zh-Hans.d.ts +0 -57
  280. package/typings/n2words.d.ts +0 -177
@@ -1,126 +1,145 @@
1
- import SouthAsianLanguage from '../classes/south-asian-language.js'
2
-
3
- class Bengali extends SouthAsianLanguage {
4
- negativeWord = 'মাইনাস'
5
- decimalSeparatorWord = 'দশমিক'
6
- zeroWord = 'শূন্য'
7
- hundredWord = 'শত'
8
- belowHundred = [
9
- 'শূন্য',
10
- 'এক',
11
- 'দুই',
12
- 'তিন',
13
- 'চার',
14
- 'পাঁচ',
15
- 'ছয়',
16
- 'সাত',
17
- 'আট',
18
- 'নয়',
19
- 'দশ',
20
- 'এগারো',
21
- 'বারো',
22
- 'তেরো',
23
- 'চৌদ্দ',
24
- 'পনেরো',
25
- 'ষোল',
26
- 'সতেরো',
27
- 'আঠারো',
28
- 'উনিশ',
29
- 'বিশ',
30
- 'একুশ',
31
- 'বাইশ',
32
- 'তেইশ',
33
- 'চব্বিশ',
34
- 'পঁচিশ',
35
- 'ছাব্বিশ',
36
- 'সাতাশ',
37
- 'আঠাশ',
38
- 'উনত্রিশ',
39
- 'ত্রিশ',
40
- 'একত্রিশ',
41
- 'বত্রিশ',
42
- 'তেত্রিশ',
43
- 'চৌত্রিশ',
44
- 'পঁয়ত্রিশ',
45
- 'ছত্রিশ',
46
- 'সাঁইত্রিশ',
47
- 'আটত্রিশ',
48
- 'উনচল্লিশ',
49
- 'চল্লিশ',
50
- 'একচল্লিশ',
51
- 'বেয়াল্লিশ',
52
- 'তেতাল্লিশ',
53
- 'চুয়াল্লিশ',
54
- 'পঁয়তাল্লিশ',
55
- 'ছেচল্লিশ',
56
- 'সাতচল্লিশ',
57
- 'আটচল্লিশ',
58
- 'উনপঞ্চাশ',
59
- 'পঞ্চাশ',
60
- 'একান্ন',
61
- 'বাহান্ন',
62
- 'তিপ্পান্ন',
63
- 'চুয়ান্ন',
64
- 'পঞ্চান্ন',
65
- 'ছাপ্পান্ন',
66
- 'সাতান্ন',
67
- 'আটান্ন',
68
- 'উনষাট',
69
- 'ষাট',
70
- 'একষট্টি',
71
- 'বাষট্টি',
72
- 'তেষট্টি',
73
- 'চৌষট্টি',
74
- 'পঁয়ষট্টি',
75
- 'ছেষট্টি',
76
- 'সাতষট্টি',
77
- 'আটষট্টি',
78
- 'ঊনসত্তর',
79
- 'সত্তর',
80
- 'একাত্তর',
81
- 'বাহাত্তর',
82
- 'তেহাত্তর',
83
- 'চুয়াত্তর',
84
- 'পঁচাত্তর',
85
- 'ছিয়াত্তর',
86
- 'সাতাত্তর',
87
- 'আটাত্তর',
88
- 'উনআশি',
89
- 'আশি',
90
- 'একাশি',
91
- 'বিরাশি',
92
- 'তিরাশি',
93
- 'চুরাশি',
94
- 'পঁচাশি',
95
- 'ছিয়াশি',
96
- 'সাতাশি',
97
- 'আটাশি',
98
- 'উননব্বই',
99
- 'নব্বই',
100
- 'একানব্বই',
101
- 'বিরানব্বই',
102
- 'তিরানব্বই',
103
- 'চুরানব্বই',
104
- 'পঁচানব্বই',
105
- 'ছিয়ানব্বই',
106
- 'সাতানব্বই',
107
- 'আটানব্বই',
108
- 'নিরানব্বই'
109
- ]
110
-
111
- scaleWords = [
112
- '',
113
- 'হাজার',
114
- 'লাখ',
115
- 'কোটি',
116
- 'আরব',
117
- 'খরব',
118
- 'নীল',
119
- 'পদ্ম',
120
- 'শঙ্খ'
121
- ]
1
+ /**
2
+ * Bangla language converter - Functional Implementation
3
+ *
4
+ * Self-contained converter for South Asian numbering.
5
+ *
6
+ * Key features:
7
+ * - Indian numbering system (হাজার, লাখ, কোটি)
8
+ * - Bangla script (Bengali)
9
+ * - 3-2-2 grouping pattern (last 3 digits, then groups of 2)
10
+ * - Complete word forms for 0-99
11
+ */
12
+
13
+ import { parseNumericValue } from '../utils/parse-numeric.js'
14
+
15
+ // ============================================================================
16
+ // Vocabulary
17
+ // ============================================================================
18
+
19
+ const ZERO = 'শূন্য'
20
+ const NEGATIVE = 'মাইনাস'
21
+ const DECIMAL_SEP = 'দশমিক'
22
+ const HUNDRED = 'শত'
23
+
24
+ const BELOW_HUNDRED = [
25
+ 'শূন্য', 'এক', 'দুই', 'তিন', 'চার', 'পাঁচ', 'ছয়', 'সাত', 'আট', 'নয়',
26
+ 'দশ', 'এগারো', 'বারো', 'তেরো', 'চৌদ্দ', 'পনেরো', 'ষোল', 'সতেরো', 'আঠারো', 'উনিশ',
27
+ 'বিশ', 'একুশ', 'বাইশ', 'তেইশ', 'চব্বিশ', 'পঁচিশ', 'ছাব্বিশ', 'সাতাশ', 'আঠাশ', 'উনত্রিশ',
28
+ 'ত্রিশ', 'একত্রিশ', 'বত্রিশ', 'তেত্রিশ', 'চৌত্রিশ', 'পঁয়ত্রিশ', 'ছত্রিশ', 'সাঁইত্রিশ', 'আটত্রিশ', 'উনচল্লিশ',
29
+ 'চল্লিশ', 'একচল্লিশ', 'বেয়াল্লিশ', 'তেতাল্লিশ', 'চুয়াল্লিশ', 'পঁয়তাল্লিশ', 'ছেচল্লিশ', 'সাতচল্লিশ', 'আটচল্লিশ', 'উনপঞ্চাশ',
30
+ 'পঞ্চাশ', 'একান্ন', 'বাহান্ন', 'তিপ্পান্ন', 'চুয়ান্ন', 'পঞ্চান্ন', 'ছাপ্পান্ন', 'সাতান্ন', 'আটান্ন', 'উনষাট',
31
+ 'ষাট', 'একষট্টি', 'বাষট্টি', 'তেষট্টি', 'চৌষট্টি', 'পঁয়ষট্টি', 'ছেষট্টি', 'সাতষট্টি', 'আটষট্টি', 'ঊনসত্তর',
32
+ 'সত্তর', 'একাত্তর', 'বাহাত্তর', 'তেহাত্তর', 'চুয়াত্তর', 'পঁচাত্তর', 'ছিয়াত্তর', 'সাতাত্তর', 'আটাত্তর', 'উনআশি',
33
+ 'আশি', 'একাশি', 'বিরাশি', 'তিরাশি', 'চুরাশি', 'পঁচাশি', 'ছিয়াশি', 'সাতাশি', 'আটাশি', 'উননব্বই',
34
+ 'নব্বই', 'একানব্বই', 'বিরানব্বই', 'তিরানব্বই', 'চুরানব্বই', 'পঁচানব্বই', 'ছিয়ানব্বই', 'সাতানব্বই', 'আটানব্বই', 'নিরানব্বই'
35
+ ]
36
+
37
+ // Scale words: index 0 = units (empty), 1 = thousand, 2 = lakh, 3 = crore, etc.
38
+ const SCALE_WORDS = ['', 'হাজার', 'লাখ', 'কোটি', 'আরব', 'খরব', 'নীল', 'পদ্ম', 'শঙ্খ']
39
+
40
+ // ============================================================================
41
+ // Segment Splitting (inlined for performance)
42
+ // ============================================================================
43
+
44
+ function groupByThreeThenTwos (n) {
45
+ const numStr = n.toString()
46
+ if (numStr.length <= 3) return [Number(numStr)]
47
+
48
+ const segments = []
49
+ segments.unshift(Number(numStr.slice(-3)))
50
+
51
+ let remaining = numStr.slice(0, -3)
52
+ while (remaining.length > 0) {
53
+ segments.unshift(Number(remaining.slice(-2)))
54
+ remaining = remaining.slice(0, -2)
55
+ }
56
+
57
+ return segments
122
58
  }
123
59
 
124
- export default function convertToWords (value, options = {}) {
125
- return new Bengali(options).convertToWords(value)
60
+ function segmentToWords (n) {
61
+ if (n === 0) return ''
62
+ if (n < 100) return BELOW_HUNDRED[n]
63
+
64
+ const hundreds = Math.trunc(n / 100)
65
+ const remainder = n % 100
66
+
67
+ if (remainder === 0) {
68
+ return BELOW_HUNDRED[hundreds] + ' ' + HUNDRED
69
+ }
70
+ return BELOW_HUNDRED[hundreds] + ' ' + HUNDRED + ' ' + BELOW_HUNDRED[remainder]
126
71
  }
72
+
73
+ // ============================================================================
74
+ // Conversion Functions
75
+ // ============================================================================
76
+
77
+ function integerToWords (n) {
78
+ if (n === 0n) return ZERO
79
+
80
+ const segments = groupByThreeThenTwos(n)
81
+ const segmentCount = segments.length
82
+ const words = []
83
+
84
+ for (let i = 0; i < segmentCount; i++) {
85
+ const segmentValue = segments[i]
86
+ if (segmentValue === 0) continue
87
+
88
+ const scaleIndex = segmentCount - i - 1
89
+ words.push(segmentToWords(segmentValue))
90
+ if (scaleIndex > 0 && SCALE_WORDS[scaleIndex]) {
91
+ words.push(SCALE_WORDS[scaleIndex])
92
+ }
93
+ }
94
+
95
+ return words.join(' ').trim()
96
+ }
97
+
98
+ function decimalPartToWords (decimalPart) {
99
+ let result = ''
100
+ let i = 0
101
+
102
+ while (i < decimalPart.length && decimalPart[i] === '0') {
103
+ if (result) result += ' '
104
+ result += ZERO
105
+ i++
106
+ }
107
+
108
+ const remainder = decimalPart.slice(i)
109
+ if (remainder) {
110
+ if (result) result += ' '
111
+ result += integerToWords(BigInt(remainder))
112
+ }
113
+
114
+ return result
115
+ }
116
+
117
+ /**
118
+ * Converts a numeric value to Bengali words.
119
+ *
120
+ * @param {number | string | bigint} value - The numeric value to convert
121
+ * @returns {string} The number in Bengali words
122
+ */
123
+ function toWords (value) {
124
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
125
+
126
+ let result = ''
127
+
128
+ if (isNegative) {
129
+ result = NEGATIVE + ' '
130
+ }
131
+
132
+ result += integerToWords(integerPart)
133
+
134
+ if (decimalPart) {
135
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
136
+ }
137
+
138
+ return result
139
+ }
140
+
141
+ // ============================================================================
142
+ // Exports
143
+ // ============================================================================
144
+
145
+ export { toWords }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Converts a numeric value to Czech words.
3
+ *
4
+ * This is the main public API. It accepts any valid numeric input
5
+ * (number, string, or bigint) and handles parsing internally.
6
+ *
7
+ * @param {number | string | bigint} value - The numeric value to convert
8
+ * @returns {string} The number in Czech words
9
+ * @throws {TypeError} If value is not a valid numeric type
10
+ * @throws {Error} If value is not a valid number format
11
+ *
12
+ * @example
13
+ * toWords(21) // 'dvacet jedna'
14
+ * toWords(1000) // 'tisíc'
15
+ * toWords(2000) // 'dva tisíce'
16
+ * toWords(5000) // 'pět tisíc'
17
+ */
18
+ export function toWords(value: number | string | bigint): string;