n2words 3.0.0 → 4.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 (488) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/LICENSE +1 -1
  3. package/README.md +64 -184
  4. package/dist/am-ET.js +2 -0
  5. package/dist/am-ET.umd.js +2 -0
  6. package/dist/am-Latn-ET.js +2 -0
  7. package/dist/am-Latn-ET.umd.js +2 -0
  8. package/dist/ar-SA.js +2 -0
  9. package/dist/ar-SA.umd.js +2 -0
  10. package/dist/az-AZ.js +2 -0
  11. package/dist/az-AZ.umd.js +2 -0
  12. package/dist/bn-BD.js +2 -0
  13. package/dist/bn-BD.umd.js +2 -0
  14. package/dist/cs-CZ.js +2 -0
  15. package/dist/cs-CZ.umd.js +2 -0
  16. package/dist/da-DK.js +2 -0
  17. package/dist/da-DK.umd.js +2 -0
  18. package/dist/de-DE.js +2 -0
  19. package/dist/de-DE.umd.js +2 -0
  20. package/dist/el-GR.js +2 -0
  21. package/dist/el-GR.umd.js +2 -0
  22. package/dist/en-AU.js +2 -0
  23. package/dist/en-AU.umd.js +2 -0
  24. package/dist/en-BD.js +2 -0
  25. package/dist/en-BD.umd.js +2 -0
  26. package/dist/en-CA.js +2 -0
  27. package/dist/en-CA.umd.js +2 -0
  28. package/dist/en-GB.js +2 -0
  29. package/dist/en-GB.umd.js +2 -0
  30. package/dist/en-GH.js +2 -0
  31. package/dist/en-GH.umd.js +2 -0
  32. package/dist/en-IE.js +2 -0
  33. package/dist/en-IE.umd.js +2 -0
  34. package/dist/en-IN.js +2 -0
  35. package/dist/en-IN.umd.js +2 -0
  36. package/dist/en-KE.js +2 -0
  37. package/dist/en-KE.umd.js +2 -0
  38. package/dist/en-MY.js +2 -0
  39. package/dist/en-MY.umd.js +2 -0
  40. package/dist/en-NG.js +2 -0
  41. package/dist/en-NG.umd.js +2 -0
  42. package/dist/en-NZ.js +2 -0
  43. package/dist/en-NZ.umd.js +2 -0
  44. package/dist/en-PH.js +2 -0
  45. package/dist/en-PH.umd.js +2 -0
  46. package/dist/en-PK.js +2 -0
  47. package/dist/en-PK.umd.js +2 -0
  48. package/dist/en-SG.js +2 -0
  49. package/dist/en-SG.umd.js +2 -0
  50. package/dist/en-US.js +2 -0
  51. package/dist/en-US.umd.js +2 -0
  52. package/dist/en-ZA.js +2 -0
  53. package/dist/en-ZA.umd.js +2 -0
  54. package/dist/es-ES.js +2 -0
  55. package/dist/es-ES.umd.js +2 -0
  56. package/dist/es-MX.js +2 -0
  57. package/dist/es-MX.umd.js +2 -0
  58. package/dist/es-US.js +2 -0
  59. package/dist/es-US.umd.js +2 -0
  60. package/dist/fa-IR.js +2 -0
  61. package/dist/fa-IR.umd.js +2 -0
  62. package/dist/fi-FI.js +2 -0
  63. package/dist/fi-FI.umd.js +2 -0
  64. package/dist/fil-PH.js +2 -0
  65. package/dist/fil-PH.umd.js +2 -0
  66. package/dist/fr-BE.js +2 -0
  67. package/dist/fr-BE.umd.js +2 -0
  68. package/dist/fr-FR.js +2 -0
  69. package/dist/fr-FR.umd.js +2 -0
  70. package/dist/gu-IN.js +2 -0
  71. package/dist/gu-IN.umd.js +2 -0
  72. package/dist/ha-NG.js +2 -0
  73. package/dist/ha-NG.umd.js +2 -0
  74. package/dist/hbo-IL.js +2 -0
  75. package/dist/hbo-IL.umd.js +2 -0
  76. package/dist/he-IL.js +2 -0
  77. package/dist/he-IL.umd.js +2 -0
  78. package/dist/hi-IN.js +2 -0
  79. package/dist/hi-IN.umd.js +2 -0
  80. package/dist/hr-HR.js +2 -0
  81. package/dist/hr-HR.umd.js +2 -0
  82. package/dist/hu-HU.js +2 -0
  83. package/dist/hu-HU.umd.js +2 -0
  84. package/dist/id-ID.js +2 -0
  85. package/dist/id-ID.umd.js +2 -0
  86. package/dist/it-IT.js +2 -0
  87. package/dist/it-IT.umd.js +2 -0
  88. package/dist/ja-JP.js +2 -0
  89. package/dist/ja-JP.umd.js +2 -0
  90. package/dist/ka-GE.js +2 -0
  91. package/dist/ka-GE.umd.js +2 -0
  92. package/dist/kn-IN.js +2 -0
  93. package/dist/kn-IN.umd.js +2 -0
  94. package/dist/ko-KR.js +2 -0
  95. package/dist/ko-KR.umd.js +2 -0
  96. package/dist/lt-LT.js +2 -0
  97. package/dist/lt-LT.umd.js +2 -0
  98. package/dist/lv-LV.js +2 -0
  99. package/dist/lv-LV.umd.js +2 -0
  100. package/dist/mr-IN.js +2 -0
  101. package/dist/mr-IN.umd.js +2 -0
  102. package/dist/ms-MY.js +2 -0
  103. package/dist/ms-MY.umd.js +2 -0
  104. package/dist/nb-NO.js +2 -0
  105. package/dist/nb-NO.umd.js +2 -0
  106. package/dist/nl-NL.js +2 -0
  107. package/dist/nl-NL.umd.js +2 -0
  108. package/dist/pa-IN.js +2 -0
  109. package/dist/pa-IN.umd.js +2 -0
  110. package/dist/pl-PL.js +2 -0
  111. package/dist/pl-PL.umd.js +2 -0
  112. package/dist/pt-PT.js +2 -0
  113. package/dist/pt-PT.umd.js +2 -0
  114. package/dist/ro-RO.js +2 -0
  115. package/dist/ro-RO.umd.js +2 -0
  116. package/dist/ru-RU.js +2 -0
  117. package/dist/ru-RU.umd.js +2 -0
  118. package/dist/sr-Cyrl-RS.js +2 -0
  119. package/dist/sr-Cyrl-RS.umd.js +2 -0
  120. package/dist/sr-Latn-RS.js +2 -0
  121. package/dist/sr-Latn-RS.umd.js +2 -0
  122. package/dist/sv-SE.js +2 -0
  123. package/dist/sv-SE.umd.js +2 -0
  124. package/dist/sw-KE.js +2 -0
  125. package/dist/sw-KE.umd.js +2 -0
  126. package/dist/ta-IN.js +2 -0
  127. package/dist/ta-IN.umd.js +2 -0
  128. package/dist/te-IN.js +2 -0
  129. package/dist/te-IN.umd.js +2 -0
  130. package/dist/th-TH.js +2 -0
  131. package/dist/th-TH.umd.js +2 -0
  132. package/dist/tr-TR.js +2 -0
  133. package/dist/tr-TR.umd.js +2 -0
  134. package/dist/uk-UA.js +2 -0
  135. package/dist/uk-UA.umd.js +2 -0
  136. package/dist/ur-PK.js +2 -0
  137. package/dist/ur-PK.umd.js +2 -0
  138. package/dist/vi-VN.js +2 -0
  139. package/dist/vi-VN.umd.js +2 -0
  140. package/dist/yo-NG.js +2 -0
  141. package/dist/yo-NG.umd.js +2 -0
  142. package/dist/zh-Hans-CN.js +2 -0
  143. package/dist/zh-Hans-CN.umd.js +2 -0
  144. package/dist/zh-Hant-TW.js +2 -0
  145. package/dist/zh-Hant-TW.umd.js +2 -0
  146. package/package.json +47 -82
  147. package/src/am-ET.d.ts +40 -0
  148. package/src/am-ET.js +269 -0
  149. package/src/am-Latn-ET.d.ts +35 -0
  150. package/src/am-Latn-ET.js +264 -0
  151. package/src/ar-SA.d.ts +49 -0
  152. package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
  153. package/src/az-AZ.d.ts +37 -0
  154. package/src/az-AZ.js +312 -0
  155. package/src/bn-BD.d.ts +36 -0
  156. package/src/bn-BD.js +270 -0
  157. package/src/cs-CZ.d.ts +49 -0
  158. package/{lib/languages/cs.js → src/cs-CZ.js} +249 -40
  159. package/src/da-DK.d.ts +44 -0
  160. package/{lib/languages/da.js → src/da-DK.js} +136 -23
  161. package/src/de-DE.d.ts +57 -0
  162. package/src/de-DE.js +603 -0
  163. package/src/el-GR.d.ts +40 -0
  164. package/src/el-GR.js +418 -0
  165. package/src/en-AU.d.ts +47 -0
  166. package/src/en-AU.js +423 -0
  167. package/src/en-BD.d.ts +49 -0
  168. package/src/en-BD.js +415 -0
  169. package/src/en-CA.d.ts +63 -0
  170. package/src/en-CA.js +518 -0
  171. package/src/en-GB.d.ts +56 -0
  172. package/src/en-GB.js +469 -0
  173. package/src/en-GH.d.ts +11 -0
  174. package/src/en-GH.js +345 -0
  175. package/src/en-IE.d.ts +56 -0
  176. package/src/en-IE.js +479 -0
  177. package/src/en-IN.d.ts +49 -0
  178. package/src/en-IN.js +415 -0
  179. package/src/en-KE.d.ts +11 -0
  180. package/src/en-KE.js +345 -0
  181. package/src/en-MY.d.ts +11 -0
  182. package/src/en-MY.js +347 -0
  183. package/src/en-NG.d.ts +56 -0
  184. package/src/en-NG.js +479 -0
  185. package/src/en-NZ.d.ts +11 -0
  186. package/src/en-NZ.js +375 -0
  187. package/src/en-PH.d.ts +11 -0
  188. package/src/en-PH.js +345 -0
  189. package/src/en-PK.d.ts +49 -0
  190. package/src/en-PK.js +415 -0
  191. package/src/en-SG.d.ts +11 -0
  192. package/src/en-SG.js +345 -0
  193. package/src/en-US.d.ts +63 -0
  194. package/src/en-US.js +516 -0
  195. package/src/en-ZA.d.ts +56 -0
  196. package/src/en-ZA.js +478 -0
  197. package/src/es-ES.d.ts +65 -0
  198. package/src/es-ES.js +541 -0
  199. package/src/es-MX.d.ts +58 -0
  200. package/{lib/languages/es.js → src/es-MX.js} +237 -47
  201. package/src/es-US.d.ts +58 -0
  202. package/src/es-US.js +446 -0
  203. package/src/fa-IR.d.ts +38 -0
  204. package/src/fa-IR.js +246 -0
  205. package/src/fi-FI.d.ts +46 -0
  206. package/src/fi-FI.js +379 -0
  207. package/src/fil-PH.d.ts +37 -0
  208. package/{lib/languages/fil.js → src/fil-PH.js} +149 -24
  209. package/src/fr-BE.d.ts +49 -0
  210. package/src/fr-BE.js +453 -0
  211. package/src/fr-FR.d.ts +63 -0
  212. package/{lib/languages/fr.js → src/fr-FR.js} +200 -47
  213. package/src/gu-IN.d.ts +35 -0
  214. package/src/gu-IN.js +259 -0
  215. package/src/ha-NG.d.ts +37 -0
  216. package/{lib/languages/ha.js → src/ha-NG.js} +110 -16
  217. package/src/hbo-IL.d.ts +39 -0
  218. package/{lib/languages/hbo.js → src/hbo-IL.js} +217 -43
  219. package/src/he-IL.d.ts +37 -0
  220. package/src/he-IL.js +537 -0
  221. package/src/hi-IN.d.ts +36 -0
  222. package/src/hi-IN.js +280 -0
  223. package/src/hr-HR.d.ts +42 -0
  224. package/src/hr-HR.js +463 -0
  225. package/src/hu-HU.d.ts +38 -0
  226. package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
  227. package/src/id-ID.d.ts +38 -0
  228. package/{lib/languages/id.js → src/id-ID.js} +106 -20
  229. package/src/it-IT.d.ts +59 -0
  230. package/src/it-IT.js +506 -0
  231. package/src/ja-JP.d.ts +49 -0
  232. package/{lib/languages/ja.js → src/ja-JP.js} +119 -32
  233. package/src/ka-GE.d.ts +44 -0
  234. package/src/ka-GE.js +393 -0
  235. package/src/kn-IN.d.ts +35 -0
  236. package/{lib/languages/kn.js → src/kn-IN.js} +156 -34
  237. package/src/ko-KR.d.ts +45 -0
  238. package/{lib/languages/ko.js → src/ko-KR.js} +99 -24
  239. package/src/lt-LT.d.ts +49 -0
  240. package/src/lt-LT.js +543 -0
  241. package/src/lv-LV.d.ts +49 -0
  242. package/src/lv-LV.js +595 -0
  243. package/src/mr-IN.d.ts +36 -0
  244. package/src/mr-IN.js +260 -0
  245. package/src/ms-MY.d.ts +37 -0
  246. package/{lib/languages/ms.js → src/ms-MY.js} +118 -20
  247. package/src/nb-NO.d.ts +44 -0
  248. package/{lib/languages/nb.js → src/nb-NO.js} +165 -33
  249. package/src/nl-NL.d.ts +54 -0
  250. package/{lib/languages/nl.js → src/nl-NL.js} +271 -47
  251. package/src/pa-IN.d.ts +36 -0
  252. package/src/pa-IN.js +268 -0
  253. package/src/pl-PL.d.ts +55 -0
  254. package/src/pl-PL.js +585 -0
  255. package/src/pt-PT.d.ts +45 -0
  256. package/src/pt-PT.js +514 -0
  257. package/src/ro-RO.d.ts +44 -0
  258. package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
  259. package/src/ru-RU.d.ts +50 -0
  260. package/src/ru-RU.js +535 -0
  261. package/src/sr-Cyrl-RS.d.ts +49 -0
  262. package/src/sr-Cyrl-RS.js +503 -0
  263. package/src/sr-Latn-RS.d.ts +49 -0
  264. package/src/sr-Latn-RS.js +503 -0
  265. package/src/sv-SE.d.ts +44 -0
  266. package/{lib/languages/sv.js → src/sv-SE.js} +149 -34
  267. package/src/sw-KE.d.ts +37 -0
  268. package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
  269. package/src/ta-IN.d.ts +35 -0
  270. package/{lib/languages/ta.js → src/ta-IN.js} +163 -47
  271. package/src/te-IN.d.ts +35 -0
  272. package/{lib/languages/te.js → src/te-IN.js} +147 -46
  273. package/src/th-TH.d.ts +38 -0
  274. package/{lib/languages/th.js → src/th-TH.js} +99 -6
  275. package/src/tr-TR.d.ts +48 -0
  276. package/src/tr-TR.js +397 -0
  277. package/src/uk-UA.d.ts +42 -0
  278. package/src/uk-UA.js +463 -0
  279. package/src/ur-PK.d.ts +36 -0
  280. package/src/ur-PK.js +268 -0
  281. package/src/utils/expand-scientific.d.ts +32 -0
  282. package/src/utils/expand-scientific.js +65 -0
  283. package/src/utils/parse-cardinal.d.ts +14 -0
  284. package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
  285. package/src/utils/parse-currency.d.ts +14 -0
  286. package/src/utils/parse-currency.js +91 -0
  287. package/src/utils/parse-ordinal.d.ts +10 -0
  288. package/src/utils/parse-ordinal.js +103 -0
  289. package/src/vi-VN.d.ts +48 -0
  290. package/{lib/languages/vi.js → src/vi-VN.js} +124 -53
  291. package/src/yo-NG.d.ts +37 -0
  292. package/src/yo-NG.js +403 -0
  293. package/src/zh-Hans-CN.d.ts +48 -0
  294. package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
  295. package/src/zh-Hant-TW.d.ts +50 -0
  296. package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
  297. package/dist/languages/am-Latn.js +0 -3
  298. package/dist/languages/am-Latn.js.map +0 -1
  299. package/dist/languages/am.js +0 -3
  300. package/dist/languages/am.js.map +0 -1
  301. package/dist/languages/ar.js +0 -3
  302. package/dist/languages/ar.js.map +0 -1
  303. package/dist/languages/az.js +0 -3
  304. package/dist/languages/az.js.map +0 -1
  305. package/dist/languages/bn.js +0 -3
  306. package/dist/languages/bn.js.map +0 -1
  307. package/dist/languages/cs.js +0 -3
  308. package/dist/languages/cs.js.map +0 -1
  309. package/dist/languages/da.js +0 -3
  310. package/dist/languages/da.js.map +0 -1
  311. package/dist/languages/de.js +0 -3
  312. package/dist/languages/de.js.map +0 -1
  313. package/dist/languages/el.js +0 -3
  314. package/dist/languages/el.js.map +0 -1
  315. package/dist/languages/en.js +0 -3
  316. package/dist/languages/en.js.map +0 -1
  317. package/dist/languages/es.js +0 -3
  318. package/dist/languages/es.js.map +0 -1
  319. package/dist/languages/fa.js +0 -3
  320. package/dist/languages/fa.js.map +0 -1
  321. package/dist/languages/fi.js +0 -3
  322. package/dist/languages/fi.js.map +0 -1
  323. package/dist/languages/fil.js +0 -3
  324. package/dist/languages/fil.js.map +0 -1
  325. package/dist/languages/fr-BE.js +0 -3
  326. package/dist/languages/fr-BE.js.map +0 -1
  327. package/dist/languages/fr.js +0 -3
  328. package/dist/languages/fr.js.map +0 -1
  329. package/dist/languages/gu.js +0 -3
  330. package/dist/languages/gu.js.map +0 -1
  331. package/dist/languages/ha.js +0 -3
  332. package/dist/languages/ha.js.map +0 -1
  333. package/dist/languages/hbo.js +0 -3
  334. package/dist/languages/hbo.js.map +0 -1
  335. package/dist/languages/he.js +0 -3
  336. package/dist/languages/he.js.map +0 -1
  337. package/dist/languages/hi.js +0 -3
  338. package/dist/languages/hi.js.map +0 -1
  339. package/dist/languages/hr.js +0 -3
  340. package/dist/languages/hr.js.map +0 -1
  341. package/dist/languages/hu.js +0 -3
  342. package/dist/languages/hu.js.map +0 -1
  343. package/dist/languages/id.js +0 -3
  344. package/dist/languages/id.js.map +0 -1
  345. package/dist/languages/it.js +0 -3
  346. package/dist/languages/it.js.map +0 -1
  347. package/dist/languages/ja.js +0 -3
  348. package/dist/languages/ja.js.map +0 -1
  349. package/dist/languages/kn.js +0 -3
  350. package/dist/languages/kn.js.map +0 -1
  351. package/dist/languages/ko.js +0 -3
  352. package/dist/languages/ko.js.map +0 -1
  353. package/dist/languages/lt.js +0 -3
  354. package/dist/languages/lt.js.map +0 -1
  355. package/dist/languages/lv.js +0 -3
  356. package/dist/languages/lv.js.map +0 -1
  357. package/dist/languages/mr.js +0 -3
  358. package/dist/languages/mr.js.map +0 -1
  359. package/dist/languages/ms.js +0 -3
  360. package/dist/languages/ms.js.map +0 -1
  361. package/dist/languages/nb.js +0 -3
  362. package/dist/languages/nb.js.map +0 -1
  363. package/dist/languages/nl.js +0 -3
  364. package/dist/languages/nl.js.map +0 -1
  365. package/dist/languages/pa.js +0 -3
  366. package/dist/languages/pa.js.map +0 -1
  367. package/dist/languages/pl.js +0 -3
  368. package/dist/languages/pl.js.map +0 -1
  369. package/dist/languages/pt.js +0 -3
  370. package/dist/languages/pt.js.map +0 -1
  371. package/dist/languages/ro.js +0 -3
  372. package/dist/languages/ro.js.map +0 -1
  373. package/dist/languages/ru.js +0 -3
  374. package/dist/languages/ru.js.map +0 -1
  375. package/dist/languages/sr-Cyrl.js +0 -3
  376. package/dist/languages/sr-Cyrl.js.map +0 -1
  377. package/dist/languages/sr-Latn.js +0 -3
  378. package/dist/languages/sr-Latn.js.map +0 -1
  379. package/dist/languages/sv.js +0 -3
  380. package/dist/languages/sv.js.map +0 -1
  381. package/dist/languages/sw.js +0 -3
  382. package/dist/languages/sw.js.map +0 -1
  383. package/dist/languages/ta.js +0 -3
  384. package/dist/languages/ta.js.map +0 -1
  385. package/dist/languages/te.js +0 -3
  386. package/dist/languages/te.js.map +0 -1
  387. package/dist/languages/th.js +0 -3
  388. package/dist/languages/th.js.map +0 -1
  389. package/dist/languages/tr.js +0 -3
  390. package/dist/languages/tr.js.map +0 -1
  391. package/dist/languages/uk.js +0 -3
  392. package/dist/languages/uk.js.map +0 -1
  393. package/dist/languages/ur.js +0 -3
  394. package/dist/languages/ur.js.map +0 -1
  395. package/dist/languages/vi.js +0 -3
  396. package/dist/languages/vi.js.map +0 -1
  397. package/dist/languages/zh-Hans.js +0 -3
  398. package/dist/languages/zh-Hans.js.map +0 -1
  399. package/dist/languages/zh-Hant.js +0 -3
  400. package/dist/languages/zh-Hant.js.map +0 -1
  401. package/dist/n2words.js +0 -3
  402. package/dist/n2words.js.map +0 -1
  403. package/lib/languages/am-Latn.d.ts +0 -7
  404. package/lib/languages/am-Latn.js +0 -164
  405. package/lib/languages/am.d.ts +0 -7
  406. package/lib/languages/am.js +0 -164
  407. package/lib/languages/ar.d.ts +0 -17
  408. package/lib/languages/az.d.ts +0 -7
  409. package/lib/languages/az.js +0 -176
  410. package/lib/languages/bn.d.ts +0 -7
  411. package/lib/languages/bn.js +0 -145
  412. package/lib/languages/cs.d.ts +0 -18
  413. package/lib/languages/da.d.ts +0 -14
  414. package/lib/languages/de.d.ts +0 -17
  415. package/lib/languages/de.js +0 -332
  416. package/lib/languages/el.d.ts +0 -14
  417. package/lib/languages/el.js +0 -243
  418. package/lib/languages/en.d.ts +0 -17
  419. package/lib/languages/en.js +0 -256
  420. package/lib/languages/es.d.ts +0 -21
  421. package/lib/languages/fa.d.ts +0 -7
  422. package/lib/languages/fa.js +0 -134
  423. package/lib/languages/fi.d.ts +0 -14
  424. package/lib/languages/fi.js +0 -245
  425. package/lib/languages/fil.d.ts +0 -7
  426. package/lib/languages/fr-BE.d.ts +0 -11
  427. package/lib/languages/fr-BE.js +0 -300
  428. package/lib/languages/fr.d.ts +0 -21
  429. package/lib/languages/gu.d.ts +0 -7
  430. package/lib/languages/gu.js +0 -137
  431. package/lib/languages/ha.d.ts +0 -7
  432. package/lib/languages/hbo.d.ts +0 -13
  433. package/lib/languages/he.d.ts +0 -13
  434. package/lib/languages/he.js +0 -276
  435. package/lib/languages/hi.d.ts +0 -7
  436. package/lib/languages/hi.js +0 -145
  437. package/lib/languages/hr.d.ts +0 -11
  438. package/lib/languages/hr.js +0 -218
  439. package/lib/languages/hu.d.ts +0 -7
  440. package/lib/languages/id.d.ts +0 -7
  441. package/lib/languages/it.d.ts +0 -19
  442. package/lib/languages/it.js +0 -377
  443. package/lib/languages/ja.d.ts +0 -17
  444. package/lib/languages/kn.d.ts +0 -7
  445. package/lib/languages/ko.d.ts +0 -14
  446. package/lib/languages/lt.d.ts +0 -18
  447. package/lib/languages/lt.js +0 -310
  448. package/lib/languages/lv.d.ts +0 -18
  449. package/lib/languages/lv.js +0 -321
  450. package/lib/languages/mr.d.ts +0 -7
  451. package/lib/languages/mr.js +0 -137
  452. package/lib/languages/ms.d.ts +0 -7
  453. package/lib/languages/nb.d.ts +0 -14
  454. package/lib/languages/nl.d.ts +0 -26
  455. package/lib/languages/pa.d.ts +0 -7
  456. package/lib/languages/pa.js +0 -163
  457. package/lib/languages/pl.d.ts +0 -22
  458. package/lib/languages/pl.js +0 -330
  459. package/lib/languages/pt.d.ts +0 -17
  460. package/lib/languages/pt.js +0 -306
  461. package/lib/languages/ro.d.ts +0 -18
  462. package/lib/languages/ru.d.ts +0 -11
  463. package/lib/languages/ru.js +0 -240
  464. package/lib/languages/sr-Cyrl.d.ts +0 -11
  465. package/lib/languages/sr-Cyrl.js +0 -215
  466. package/lib/languages/sr-Latn.d.ts +0 -11
  467. package/lib/languages/sr-Latn.js +0 -215
  468. package/lib/languages/sv.d.ts +0 -14
  469. package/lib/languages/sw.d.ts +0 -7
  470. package/lib/languages/ta.d.ts +0 -7
  471. package/lib/languages/te.d.ts +0 -7
  472. package/lib/languages/th.d.ts +0 -7
  473. package/lib/languages/tr.d.ts +0 -18
  474. package/lib/languages/tr.js +0 -263
  475. package/lib/languages/uk.d.ts +0 -11
  476. package/lib/languages/uk.js +0 -218
  477. package/lib/languages/ur.d.ts +0 -7
  478. package/lib/languages/ur.js +0 -163
  479. package/lib/languages/vi.d.ts +0 -17
  480. package/lib/languages/zh-Hans.d.ts +0 -11
  481. package/lib/languages/zh-Hant.d.ts +0 -11
  482. package/lib/n2words.d.ts +0 -53
  483. package/lib/n2words.js +0 -122
  484. package/lib/utils/parse-numeric.d.ts +0 -17
  485. /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
  486. /package/{lib → src}/utils/is-plain-object.js +0 -0
  487. /package/{lib → src}/utils/validate-options.d.ts +0 -0
  488. /package/{lib → src}/utils/validate-options.js +0 -0
@@ -1,7 +0,0 @@
1
- /**
2
- * Converts a numeric value to Amharic (Latin script) words.
3
- *
4
- * @param {number | string | bigint} value - The numeric value to convert
5
- * @returns {string} The number in Amharic Latin words
6
- */
7
- export function toWords(value: number | string | bigint): string;
@@ -1,164 +0,0 @@
1
- /**
2
- * Amharic Latin language converter - Functional Implementation
3
- *
4
- * Self-contained converter with precomputed lookup tables.
5
- * Latin/ASCII romanization of Amharic numerals.
6
- *
7
- * Key features:
8
- * - Romanized numerals (and, hulet, sost)
9
- * - Teens formed with "asra" prefix
10
- * - Keeps "one" before hundred: "and meto" (100)
11
- * - Short scale naming
12
- * - Per-digit decimal reading
13
- */
14
-
15
- import { parseNumericValue } from '../utils/parse-numeric.js'
16
-
17
- // ============================================================================
18
- // Vocabulary
19
- // ============================================================================
20
-
21
- const ONES = ['', 'and', 'hulet', 'sost', 'arat', 'amist', 'siddist', 'sebat', 'siment', 'zeteny']
22
- const TEENS = ['asir', 'asra and', 'asra hulet', 'asra sost', 'asra arat', 'asra amist', 'asra siddist', 'asra sebat', 'asra siment', 'asra zeteny']
23
- const TENS = ['', '', 'haya', 'selasa', 'arba', 'hamsa', 'silsa', 'seba', 'semanya', 'zetena']
24
-
25
- const HUNDRED = 'meto'
26
- const THOUSAND = 'shi'
27
-
28
- const ZERO = 'zero'
29
- const NEGATIVE = 'asitegna'
30
- const DECIMAL_SEP = 'netib'
31
-
32
- // Short scale
33
- const SCALE_WORDS = ['', THOUSAND, 'miliyon', 'billiyon']
34
-
35
- // ============================================================================
36
- // Precomputed Lookup Table
37
- // ============================================================================
38
-
39
- function buildSegment (n) {
40
- if (n === 0) return ''
41
-
42
- const ones = n % 10
43
- const tensDigit = Math.floor(n / 10) % 10
44
- const hundredsDigit = Math.floor(n / 100)
45
-
46
- const parts = []
47
-
48
- // Amharic keeps "one" before hundred: "and meto" (100)
49
- if (hundredsDigit > 0) {
50
- parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
51
- }
52
-
53
- if (tensDigit === 1) {
54
- parts.push(TEENS[ones])
55
- } else {
56
- if (tensDigit > 1) {
57
- parts.push(TENS[tensDigit])
58
- }
59
- if (ones > 0) {
60
- parts.push(ONES[ones])
61
- }
62
- }
63
-
64
- return parts.join(' ')
65
- }
66
-
67
- const SEGMENTS = new Array(1000)
68
- for (let i = 0; i < 1000; i++) {
69
- SEGMENTS[i] = buildSegment(i)
70
- }
71
-
72
- // ============================================================================
73
- // Conversion Functions
74
- // ============================================================================
75
-
76
- function integerToWords (n) {
77
- if (n === 0n) return ZERO
78
-
79
- if (n < 1000n) {
80
- return SEGMENTS[Number(n)]
81
- }
82
-
83
- return buildLargeNumberWords(n)
84
- }
85
-
86
- function buildLargeNumberWords (n) {
87
- const numStr = n.toString()
88
- const len = numStr.length
89
-
90
- const segments = []
91
- const segmentSize = 3
92
-
93
- const remainderLen = len % segmentSize
94
- let pos = 0
95
- if (remainderLen > 0) {
96
- segments.push(Number(numStr.slice(0, remainderLen)))
97
- pos = remainderLen
98
- }
99
- while (pos < len) {
100
- segments.push(Number(numStr.slice(pos, pos + segmentSize)))
101
- pos += segmentSize
102
- }
103
-
104
- const parts = []
105
- let scaleIndex = segments.length - 1
106
-
107
- for (let i = 0; i < segments.length; i++) {
108
- const segment = segments[i]
109
-
110
- if (segment !== 0) {
111
- const scaleWord = SCALE_WORDS[scaleIndex] || ''
112
-
113
- if (scaleIndex === 0) {
114
- parts.push(SEGMENTS[segment])
115
- } else {
116
- parts.push(SEGMENTS[segment] + ' ' + scaleWord)
117
- }
118
- }
119
-
120
- scaleIndex--
121
- }
122
-
123
- return parts.join(' ')
124
- }
125
-
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])
132
- }
133
- return digits.join(' ')
134
- }
135
-
136
- /**
137
- * Converts a numeric value to Amharic (Latin script) words.
138
- *
139
- * @param {number | string | bigint} value - The numeric value to convert
140
- * @returns {string} The number in Amharic Latin words
141
- */
142
- function toWords (value) {
143
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
144
-
145
- let result = ''
146
-
147
- if (isNegative) {
148
- result = NEGATIVE + ' '
149
- }
150
-
151
- result += integerToWords(integerPart)
152
-
153
- if (decimalPart) {
154
- result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
155
- }
156
-
157
- return result
158
- }
159
-
160
- // ============================================================================
161
- // Exports
162
- // ============================================================================
163
-
164
- export { toWords }
@@ -1,7 +0,0 @@
1
- /**
2
- * Converts a numeric value to Amharic words.
3
- *
4
- * @param {number | string | bigint} value - The numeric value to convert
5
- * @returns {string} The number in Amharic words
6
- */
7
- export function toWords(value: number | string | bigint): string;
@@ -1,164 +0,0 @@
1
- /**
2
- * Amharic language converter - Functional Implementation
3
- *
4
- * Self-contained converter with precomputed lookup tables.
5
- * Native Ge'ez script (ግዕዝ) output.
6
- *
7
- * Key features:
8
- * - Ge'ez/Ethiopic script numerals
9
- * - Teens formed with "አስራ" prefix
10
- * - Keeps "one" before hundred: "አንድ መቶ" (100)
11
- * - Short scale naming
12
- * - Per-digit decimal reading
13
- */
14
-
15
- import { parseNumericValue } from '../utils/parse-numeric.js'
16
-
17
- // ============================================================================
18
- // Vocabulary
19
- // ============================================================================
20
-
21
- const ONES = ['', 'አንድ', 'ሁለት', 'ሶስት', 'አራት', 'አምስት', 'ስድስት', 'ሰባት', 'ስምንት', 'ዘጠኝ']
22
- const TEENS = ['አስር', 'አስራ አንድ', 'አስራ ሁለት', 'አስራ ሶስት', 'አስራ አራት', 'አስራ አምስት', 'አስራ ስድስት', 'አስራ ሰባት', 'አስራ ስምንት', 'አስራ ዘጠኝ']
23
- const TENS = ['', '', 'ሃያ', 'ሰላሳ', 'አርባ', 'ሃምሳ', 'ስልሳ', 'ሰባ', 'ሰማንያ', 'ዘጠና']
24
-
25
- const HUNDRED = 'መቶ'
26
- const THOUSAND = 'ሺ'
27
-
28
- const ZERO = 'ዜሮ'
29
- const NEGATIVE = 'አሉታዊ'
30
- const DECIMAL_SEP = 'ነጥብ'
31
-
32
- // Short scale
33
- const SCALE_WORDS = ['', THOUSAND, 'ሚሊዮን', 'ቢሊዮን']
34
-
35
- // ============================================================================
36
- // Precomputed Lookup Table
37
- // ============================================================================
38
-
39
- function buildSegment (n) {
40
- if (n === 0) return ''
41
-
42
- const ones = n % 10
43
- const tensDigit = Math.floor(n / 10) % 10
44
- const hundredsDigit = Math.floor(n / 100)
45
-
46
- const parts = []
47
-
48
- // Amharic keeps "one" before hundred: "አንድ መቶ" (100)
49
- if (hundredsDigit > 0) {
50
- parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
51
- }
52
-
53
- if (tensDigit === 1) {
54
- parts.push(TEENS[ones])
55
- } else {
56
- if (tensDigit > 1) {
57
- parts.push(TENS[tensDigit])
58
- }
59
- if (ones > 0) {
60
- parts.push(ONES[ones])
61
- }
62
- }
63
-
64
- return parts.join(' ')
65
- }
66
-
67
- const SEGMENTS = new Array(1000)
68
- for (let i = 0; i < 1000; i++) {
69
- SEGMENTS[i] = buildSegment(i)
70
- }
71
-
72
- // ============================================================================
73
- // Conversion Functions
74
- // ============================================================================
75
-
76
- function integerToWords (n) {
77
- if (n === 0n) return ZERO
78
-
79
- if (n < 1000n) {
80
- return SEGMENTS[Number(n)]
81
- }
82
-
83
- return buildLargeNumberWords(n)
84
- }
85
-
86
- function buildLargeNumberWords (n) {
87
- const numStr = n.toString()
88
- const len = numStr.length
89
-
90
- const segments = []
91
- const segmentSize = 3
92
-
93
- const remainderLen = len % segmentSize
94
- let pos = 0
95
- if (remainderLen > 0) {
96
- segments.push(Number(numStr.slice(0, remainderLen)))
97
- pos = remainderLen
98
- }
99
- while (pos < len) {
100
- segments.push(Number(numStr.slice(pos, pos + segmentSize)))
101
- pos += segmentSize
102
- }
103
-
104
- const parts = []
105
- let scaleIndex = segments.length - 1
106
-
107
- for (let i = 0; i < segments.length; i++) {
108
- const segment = segments[i]
109
-
110
- if (segment !== 0) {
111
- const scaleWord = SCALE_WORDS[scaleIndex] || ''
112
-
113
- if (scaleIndex === 0) {
114
- parts.push(SEGMENTS[segment])
115
- } else {
116
- parts.push(SEGMENTS[segment] + ' ' + scaleWord)
117
- }
118
- }
119
-
120
- scaleIndex--
121
- }
122
-
123
- return parts.join(' ')
124
- }
125
-
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])
132
- }
133
- return digits.join(' ')
134
- }
135
-
136
- /**
137
- * Converts a numeric value to Amharic words.
138
- *
139
- * @param {number | string | bigint} value - The numeric value to convert
140
- * @returns {string} The number in Amharic words
141
- */
142
- function toWords (value) {
143
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
144
-
145
- let result = ''
146
-
147
- if (isNegative) {
148
- result = NEGATIVE + ' '
149
- }
150
-
151
- result += integerToWords(integerPart)
152
-
153
- if (decimalPart) {
154
- result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
155
- }
156
-
157
- return result
158
- }
159
-
160
- // ============================================================================
161
- // Exports
162
- // ============================================================================
163
-
164
- export { toWords }
@@ -1,17 +0,0 @@
1
- /**
2
- * Converts a numeric value to Arabic words.
3
- *
4
- * @param {number | string | bigint} value - The numeric value to convert
5
- * @param {Object} [options] - Optional configuration
6
- * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
7
- * @param {string} [options.negativeWord] - Custom word for negative numbers
8
- * @returns {string} The number in Arabic words
9
- *
10
- * @example
11
- * toWords(1) // 'واحد'
12
- * toWords(1, {gender: 'feminine'}) // 'واحدة'
13
- */
14
- export function toWords(value: number | string | bigint, options?: {
15
- gender?: "masculine" | "feminine" | undefined;
16
- negativeWord?: string | undefined;
17
- }): string;
@@ -1,7 +0,0 @@
1
- /**
2
- * Converts a numeric value to Azerbaijani words.
3
- *
4
- * @param {number | string | bigint} value - The numeric value to convert
5
- * @returns {string} The number in Azerbaijani words
6
- */
7
- export function toWords(value: number | string | bigint): string;
@@ -1,176 +0,0 @@
1
- /**
2
- * Azerbaijani language converter - Functional Implementation
3
- *
4
- * Self-contained converter with precomputed lookup tables.
5
- *
6
- * Key features:
7
- * - Turkic language patterns
8
- * - Implicit "bir" (one) omission before hundreds and thousands
9
- * - Short scale naming
10
- */
11
-
12
- import { parseNumericValue } from '../utils/parse-numeric.js'
13
-
14
- // ============================================================================
15
- // Vocabulary
16
- // ============================================================================
17
-
18
- const ONES = ['', 'bir', 'iki', 'üç', 'dörd', 'beş', 'altı', 'yeddi', 'səkkiz', 'doqquz']
19
- const TEENS = ['on', 'on bir', 'on iki', 'on üç', 'on dörd', 'on beş', 'on altı', 'on yeddi', 'on səkkiz', 'on doqquz']
20
- const TENS = ['', '', 'iyirmi', 'otuz', 'qırx', 'əlli', 'altmış', 'yetmiş', 'səksən', 'doxsan']
21
-
22
- const HUNDRED = 'yüz'
23
- const THOUSAND = 'min'
24
-
25
- const ZERO = 'sıfır'
26
- const NEGATIVE = 'mənfi'
27
- const DECIMAL_SEP = 'nöqtə'
28
-
29
- // Short scale
30
- const SCALE_WORDS = ['', THOUSAND, 'milyon', 'milyar', 'trilyon', 'katrilyon', 'kentilyon']
31
-
32
- // ============================================================================
33
- // Precomputed Lookup Table
34
- // ============================================================================
35
-
36
- function buildSegment (n) {
37
- if (n === 0) return ''
38
-
39
- const ones = n % 10
40
- const tensDigit = Math.floor(n / 10) % 10
41
- const hundredsDigit = Math.floor(n / 100)
42
-
43
- const parts = []
44
-
45
- if (hundredsDigit > 0) {
46
- if (hundredsDigit === 1) {
47
- parts.push(HUNDRED)
48
- } else {
49
- parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
50
- }
51
- }
52
-
53
- if (tensDigit === 1) {
54
- parts.push(TEENS[ones])
55
- } else {
56
- if (tensDigit > 1) {
57
- parts.push(TENS[tensDigit])
58
- }
59
- if (ones > 0) {
60
- parts.push(ONES[ones])
61
- }
62
- }
63
-
64
- return parts.join(' ')
65
- }
66
-
67
- const SEGMENTS = new Array(1000)
68
- for (let i = 0; i < 1000; i++) {
69
- SEGMENTS[i] = buildSegment(i)
70
- }
71
-
72
- // ============================================================================
73
- // Conversion Functions
74
- // ============================================================================
75
-
76
- function integerToWords (n) {
77
- if (n === 0n) return ZERO
78
-
79
- if (n < 1000n) {
80
- return SEGMENTS[Number(n)]
81
- }
82
-
83
- return buildLargeNumberWords(n)
84
- }
85
-
86
- function buildLargeNumberWords (n) {
87
- const numStr = n.toString()
88
- const len = numStr.length
89
-
90
- const segments = []
91
- const segmentSize = 3
92
-
93
- const remainderLen = len % segmentSize
94
- let pos = 0
95
- if (remainderLen > 0) {
96
- segments.push(Number(numStr.slice(0, remainderLen)))
97
- pos = remainderLen
98
- }
99
- while (pos < len) {
100
- segments.push(Number(numStr.slice(pos, pos + segmentSize)))
101
- pos += segmentSize
102
- }
103
-
104
- const parts = []
105
- let scaleIndex = segments.length - 1
106
-
107
- for (let i = 0; i < segments.length; i++) {
108
- const segment = segments[i]
109
-
110
- if (segment !== 0) {
111
- const scaleWord = SCALE_WORDS[scaleIndex] || ''
112
-
113
- if (scaleIndex === 0) {
114
- parts.push(SEGMENTS[segment])
115
- } else if (scaleIndex === 1 && segment === 1) {
116
- // Omit "bir" before thousand
117
- parts.push(scaleWord)
118
- } else {
119
- parts.push(SEGMENTS[segment] + ' ' + scaleWord)
120
- }
121
- }
122
-
123
- scaleIndex--
124
- }
125
-
126
- return parts.join(' ')
127
- }
128
-
129
- function decimalPartToWords (decimalPart) {
130
- let result = ''
131
- let i = 0
132
-
133
- while (i < decimalPart.length && decimalPart[i] === '0') {
134
- if (result) result += ' '
135
- result += ZERO
136
- i++
137
- }
138
-
139
- const remainder = decimalPart.slice(i)
140
- if (remainder) {
141
- if (result) result += ' '
142
- result += integerToWords(BigInt(remainder))
143
- }
144
-
145
- return result
146
- }
147
-
148
- /**
149
- * Converts a numeric value to Azerbaijani words.
150
- *
151
- * @param {number | string | bigint} value - The numeric value to convert
152
- * @returns {string} The number in Azerbaijani words
153
- */
154
- function toWords (value) {
155
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
156
-
157
- let result = ''
158
-
159
- if (isNegative) {
160
- result = NEGATIVE + ' '
161
- }
162
-
163
- result += integerToWords(integerPart)
164
-
165
- if (decimalPart) {
166
- result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
167
- }
168
-
169
- return result
170
- }
171
-
172
- // ============================================================================
173
- // Exports
174
- // ============================================================================
175
-
176
- export { toWords }
@@ -1,7 +0,0 @@
1
- /**
2
- * Converts a numeric value to Bengali words.
3
- *
4
- * @param {number | string | bigint} value - The numeric value to convert
5
- * @returns {string} The number in Bengali words
6
- */
7
- export function toWords(value: number | string | bigint): string;
@@ -1,145 +0,0 @@
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
58
- }
59
-
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]
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 }