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 +1,7 @@
1
1
  /**
2
- * Hausa language converter - Functional Implementation
2
+ * Hausa (Nigeria) language converter
3
3
  *
4
- * Self-contained converter with precomputed lookup tables.
4
+ * CLDR: ha-NG | Hausa as used in Nigeria
5
5
  *
6
6
  * Key features:
7
7
  * - Authentic Boko orthography with ɗ (hooked d) and ' (glottal stop)
@@ -13,7 +13,9 @@
13
13
  * - Per-digit decimal reading
14
14
  */
15
15
 
16
- import { parseNumericValue } from '../utils/parse-numeric.js'
16
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
17
+ import { parseCurrencyValue } from './utils/parse-currency.js'
18
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
17
19
 
18
20
  // ============================================================================
19
21
  // Vocabulary
@@ -34,6 +36,22 @@ const DECIMAL_SEP = 'digo'
34
36
  // Short scale
35
37
  const SCALE_WORDS = ['', THOUSAND, 'miliyan', 'biliyan']
36
38
 
39
+ // ============================================================================
40
+ // Ordinal Vocabulary
41
+ // ============================================================================
42
+
43
+ // Hausa ordinals: "na" + cardinal (na ɗaya = 1st, na biyu = 2nd)
44
+ // First has special form "na fari" or "farko"
45
+ const ORDINAL_PREFIX = 'na'
46
+ const ORDINAL_FIRST = 'na farko'
47
+
48
+ // ============================================================================
49
+ // Currency Vocabulary (Nigerian Naira)
50
+ // ============================================================================
51
+
52
+ const NAIRA = 'naira'
53
+ const KOBO = 'kobo'
54
+
37
55
  // ============================================================================
38
56
  // Precomputed Lookup Table
39
57
  // ============================================================================
@@ -47,8 +65,8 @@ function buildSegment (n) {
47
65
  if (n === 0) return ''
48
66
 
49
67
  const ones = n % 10
50
- const tensDigit = Math.floor(n / 10) % 10
51
- const hundredsDigit = Math.floor(n / 100)
68
+ const tensDigit = Math.trunc(n / 10) % 10
69
+ const hundredsDigit = Math.trunc(n / 100)
52
70
 
53
71
  const parts = []
54
72
 
@@ -88,11 +106,6 @@ function buildSegment (n) {
88
106
  return parts.join(' ')
89
107
  }
90
108
 
91
- const SEGMENTS = new Array(1000)
92
- for (let i = 0; i < 1000; i++) {
93
- SEGMENTS[i] = buildSegment(i)
94
- }
95
-
96
109
  // ============================================================================
97
110
  // Conversion Functions
98
111
  // ============================================================================
@@ -101,7 +114,7 @@ function integerToWords (n) {
101
114
  if (n === 0n) return ZERO
102
115
 
103
116
  if (n < 1000n) {
104
- return SEGMENTS[Number(n)]
117
+ return buildSegment(Number(n))
105
118
  }
106
119
 
107
120
  return buildLargeNumberWords(n)
@@ -143,9 +156,9 @@ function buildLargeNumberWords (n) {
143
156
  const scaleWord = SCALE_WORDS[scaleIndex] || ''
144
157
 
145
158
  if (scaleIndex === 0) {
146
- rawParts.push(SEGMENTS[segment])
159
+ rawParts.push(buildSegment(segment))
147
160
  } else {
148
- rawParts.push(SEGMENTS[segment])
161
+ rawParts.push(buildSegment(segment))
149
162
  rawParts.push(scaleWord)
150
163
  }
151
164
  }
@@ -205,8 +218,8 @@ function decimalPartToWords (decimalPart) {
205
218
  * @param {number | string | bigint} value - The numeric value to convert
206
219
  * @returns {string} The number in Hausa words
207
220
  */
208
- function toWords (value) {
209
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
221
+ function toCardinal (value) {
222
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
210
223
 
211
224
  let result = ''
212
225
 
@@ -223,8 +236,89 @@ function toWords (value) {
223
236
  return result
224
237
  }
225
238
 
239
+ // ============================================================================
240
+ // ORDINAL: toOrdinal(value)
241
+ // ============================================================================
242
+
243
+ /**
244
+ * Converts a non-negative integer to Hausa ordinal words.
245
+ *
246
+ * Hausa ordinals: na farko (1st), na biyu (2nd), na uku (3rd), etc.
247
+ *
248
+ * @param {bigint} n - Positive integer to convert
249
+ * @returns {string} Hausa ordinal words
250
+ */
251
+ function integerToOrdinal (n) {
252
+ // Special form for first
253
+ if (n === 1n) return ORDINAL_FIRST
254
+
255
+ // For 2+, use "na" prefix + cardinal
256
+ return ORDINAL_PREFIX + ' ' + integerToWords(n)
257
+ }
258
+
259
+ /**
260
+ * Converts a numeric value to Hausa ordinal words.
261
+ *
262
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
263
+ * @returns {string} The number as ordinal words
264
+ * @throws {TypeError} If value is not a valid numeric type
265
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
266
+ *
267
+ * @example
268
+ * toOrdinal(1) // 'na farko'
269
+ * toOrdinal(2) // 'na biyu'
270
+ * toOrdinal(10) // 'na goma'
271
+ */
272
+ function toOrdinal (value) {
273
+ const integerPart = parseOrdinalValue(value)
274
+ return integerToOrdinal(integerPart)
275
+ }
276
+
277
+ // ============================================================================
278
+ // CURRENCY: toCurrency(value)
279
+ // ============================================================================
280
+
281
+ /**
282
+ * Converts a numeric value to Hausa currency words (Nigerian Naira).
283
+ *
284
+ * Uses naira and kobo (100 kobo = 1 naira).
285
+ *
286
+ * @param {number | string | bigint} value - The currency amount to convert
287
+ * @returns {string} The amount in Hausa currency words
288
+ * @throws {TypeError} If value is not a valid numeric type
289
+ * @throws {Error} If value is not a valid number format
290
+ *
291
+ * @example
292
+ * toCurrency(42) // 'arba'in da biyu naira'
293
+ * toCurrency(1.50) // 'ɗaya naira da hamsin kobo'
294
+ * toCurrency(-5) // 'babu biyar naira'
295
+ */
296
+ function toCurrency (value) {
297
+ const { isNegative, dollars: naira, cents: kobo } = parseCurrencyValue(value)
298
+
299
+ let result = ''
300
+ if (isNegative) {
301
+ result = NEGATIVE + ' '
302
+ }
303
+
304
+ // Naira part
305
+ if (naira > 0n || kobo === 0n) {
306
+ result += integerToWords(naira) + ' ' + NAIRA
307
+ }
308
+
309
+ // Kobo part
310
+ if (kobo > 0n) {
311
+ if (naira > 0n) {
312
+ result += ' da '
313
+ }
314
+ result += integerToWords(kobo) + ' ' + KOBO
315
+ }
316
+
317
+ return result
318
+ }
319
+
226
320
  // ============================================================================
227
321
  // Exports
228
322
  // ============================================================================
229
323
 
230
- export { toWords }
324
+ export { toCardinal, toOrdinal, toCurrency }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Converts a numeric value to Biblical Hebrew 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.andWord='ו'] - Custom conjunction word
8
+ * @returns {string} The number in Biblical Hebrew words
9
+ */
10
+ export function toCardinal(value: number | string | bigint, options?: {
11
+ gender?: "masculine" | "feminine" | undefined;
12
+ andWord?: string | undefined;
13
+ }): string;
14
+ /**
15
+ * Converts a numeric value to Biblical Hebrew ordinal words.
16
+ *
17
+ * @param {number | string | bigint} value - The numeric value to convert
18
+ * @returns {string} The ordinal in Biblical Hebrew words
19
+ * @throws {TypeError} If value is not a valid numeric type
20
+ * @throws {Error} If value is not a positive integer
21
+ *
22
+ * @example
23
+ * toOrdinal(1) // 'ראשון'
24
+ * toOrdinal(21) // 'עשרים וראשון'
25
+ */
26
+ export function toOrdinal(value: number | string | bigint): string;
27
+ /**
28
+ * Converts a numeric value to Biblical Hebrew Shekel currency words.
29
+ *
30
+ * @param {number | string | bigint} value - The numeric value to convert
31
+ * @returns {string} The currency in Biblical Hebrew words
32
+ * @throws {TypeError} If value is not a valid numeric type
33
+ * @throws {Error} If value is not a valid number format
34
+ *
35
+ * @example
36
+ * toCurrency(1) // 'שקל אחד'
37
+ * toCurrency(2.50) // 'שניים שקלים חמישים גרות'
38
+ */
39
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Biblical Hebrew language converter - Functional Implementation
2
+ * Biblical Hebrew (Israel) language converter
3
3
  *
4
- * Self-contained converter with segment-based decomposition.
4
+ * CLDR: hbo-IL | Biblical/Ancient Hebrew
5
5
  *
6
6
  * Key features:
7
7
  * - Gender agreement (masculine default, feminine via option)
@@ -9,12 +9,12 @@
9
9
  * - Special 1-9 thousands construct state
10
10
  * - "ו" (ve) conjunction rules vary by position
11
11
  * - Per-digit decimal reading
12
- *
13
- * Optimization: Precomputed segment lookup tables for both genders.
14
12
  */
15
13
 
16
- import { parseNumericValue } from '../utils/parse-numeric.js'
17
- import { validateOptions } from '../utils/validate-options.js'
14
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
15
+ import { parseCurrencyValue } from './utils/parse-currency.js'
16
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
17
+ import { validateOptions } from './utils/validate-options.js'
18
18
 
19
19
  // ============================================================================
20
20
  // Vocabulary (arrays for indexed access - faster than object property lookup)
@@ -43,8 +43,20 @@ const ZERO = 'אפס'
43
43
  const NEGATIVE = 'מינוס'
44
44
  const DECIMAL_SEP = 'נקודה'
45
45
 
46
+ // Ordinal forms (masculine) - used in Biblical Hebrew
47
+ const ORDINAL_ONES = ['', 'ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שביעי', 'שמיני', 'תשיעי']
48
+ const ORDINAL_TEENS = ['עשירי', 'אחד עשר', 'שנים עשר', 'שלשה עשר', 'ארבעה עשר', 'חמשה עשר', 'ששה עשר', 'שבעה עשר', 'שמונה עשר', 'תשעה עשר']
49
+ const ORDINAL_TENS = ['', '', 'עשרים', 'שלשים', 'ארבעים', 'חמישים', 'ששים', 'שבעים', 'שמונים', 'תשעים']
50
+ const ORDINAL_HUNDRED = 'מאה'
51
+
52
+ // Currency (Biblical Shekel - historical usage)
53
+ const SHEKEL = 'שקל'
54
+ const SHEKEL_PLURAL = 'שקלים'
55
+ const GERAH = 'גרה'
56
+ const GERAH_PLURAL = 'גרות'
57
+
46
58
  // ============================================================================
47
- // Precomputed Lookup Tables (built once at module load)
59
+ // Segment Building
48
60
  // ============================================================================
49
61
 
50
62
  /**
@@ -55,8 +67,8 @@ function buildScaleSegment (n, andWord, ONES, TEENS, HUNDREDS_ARR) {
55
67
  if (n === 0) return ''
56
68
 
57
69
  const ones = n % 10
58
- const tens = Math.floor(n / 10) % 10
59
- const hundreds = Math.floor(n / 100)
70
+ const tens = Math.trunc(n / 10) % 10
71
+ const hundreds = Math.trunc(n / 100)
60
72
 
61
73
  let result = ''
62
74
 
@@ -105,8 +117,8 @@ function buildUnitsSegment (n, andWord, ONES, TEENS, HUNDREDS_ARR) {
105
117
  if (n === 0) return ''
106
118
 
107
119
  const ones = n % 10
108
- const tens = Math.floor(n / 10) % 10
109
- const hundreds = Math.floor(n / 100)
120
+ const tens = Math.trunc(n / 10) % 10
121
+ const hundreds = Math.trunc(n / 100)
110
122
 
111
123
  let result = ''
112
124
 
@@ -145,19 +157,6 @@ function buildUnitsSegment (n, andWord, ONES, TEENS, HUNDREDS_ARR) {
145
157
  return result
146
158
  }
147
159
 
148
- // Precompute all 1000 segment words for masculine (default) with default conjunction
149
- const SCALE_SEGMENTS_MASC = new Array(1000)
150
- const UNITS_SEGMENTS_MASC = new Array(1000)
151
- const SCALE_SEGMENTS_FEM = new Array(1000)
152
- const UNITS_SEGMENTS_FEM = new Array(1000)
153
-
154
- for (let i = 0; i < 1000; i++) {
155
- SCALE_SEGMENTS_MASC[i] = buildScaleSegment(i, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS)
156
- UNITS_SEGMENTS_MASC[i] = buildUnitsSegment(i, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS)
157
- SCALE_SEGMENTS_FEM[i] = buildScaleSegment(i, 'ו', ONES_FEM, TEENS_FEM, HUNDREDS_FEM)
158
- UNITS_SEGMENTS_FEM[i] = buildUnitsSegment(i, 'ו', ONES_FEM, TEENS_FEM, HUNDREDS_FEM)
159
- }
160
-
161
160
  // ============================================================================
162
161
  // Conversion Functions
163
162
  // ============================================================================
@@ -169,25 +168,20 @@ for (let i = 0; i < 1000; i++) {
169
168
  * @param {Object} options - Conversion options
170
169
  * @returns {string} Biblical Hebrew words
171
170
  */
172
- function integerToWords (n, options) {
171
+ function integerToWords (n, gender, andWord) {
173
172
  if (n === 0n) return ZERO
174
173
 
175
- const andWord = options.andWord ?? 'ו'
176
- const gender = options.gender || 'masculine'
177
174
  const isFeminine = gender === 'feminine'
178
- const usePrecomputed = andWord === 'ו'
179
175
 
180
176
  // Select vocabulary based on gender
181
177
  const ONES = isFeminine ? ONES_FEM : ONES_MASC
182
178
  const TEENS = isFeminine ? TEENS_FEM : TEENS_MASC
183
179
  const THOUSANDS_SPECIAL = isFeminine ? THOUSANDS_FEM : THOUSANDS_MASC
184
180
  const HUNDREDS_ARR = isFeminine ? HUNDREDS_FEM : HUNDREDS
185
- const SCALE_SEGS = isFeminine ? SCALE_SEGMENTS_FEM : SCALE_SEGMENTS_MASC
186
- const UNITS_SEGS = isFeminine ? UNITS_SEGMENTS_FEM : UNITS_SEGMENTS_MASC
187
181
 
188
- // Fast path: numbers < 1000 (direct lookup)
182
+ // Fast path: numbers < 1000
189
183
  if (n < 1000n) {
190
- return usePrecomputed ? UNITS_SEGS[Number(n)] : buildUnitsSegment(Number(n), andWord, ONES, TEENS, HUNDREDS_ARR)
184
+ return buildUnitsSegment(Number(n), andWord, ONES, TEENS, HUNDREDS_ARR)
191
185
  }
192
186
 
193
187
  // Extract segments using BigInt modulo
@@ -207,7 +201,7 @@ function integerToWords (n, options) {
207
201
 
208
202
  if (i === 0) {
209
203
  // Units segment (no scale word)
210
- const segmentWord = usePrecomputed ? UNITS_SEGS[segment] : buildUnitsSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
204
+ const segmentWord = buildUnitsSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
211
205
  if (result) {
212
206
  // Add "ו" before single-digit units when following scale words
213
207
  if (segment <= 9) {
@@ -224,7 +218,7 @@ function integerToWords (n, options) {
224
218
  if (result) result += ' '
225
219
  result += THOUSANDS_SPECIAL[segment]
226
220
  } else {
227
- const segmentWord = usePrecomputed ? SCALE_SEGS[segment] : buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
221
+ const segmentWord = buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
228
222
  if (result) result += ' '
229
223
  result += segmentWord + ' ' + SCALE[1]
230
224
  }
@@ -234,7 +228,7 @@ function integerToWords (n, options) {
234
228
  if (result) result += ' '
235
229
  result += SCALE[i]
236
230
  } else {
237
- const segmentWord = usePrecomputed ? SCALE_SEGS[segment] : buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
231
+ const segmentWord = buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
238
232
  if (result) result += ' '
239
233
  result += segmentWord + ' ' + SCALE_PLURAL[i]
240
234
  }
@@ -251,8 +245,7 @@ function integerToWords (n, options) {
251
245
  * @param {Object} options - Conversion options
252
246
  * @returns {string} Biblical Hebrew words for decimal part
253
247
  */
254
- function decimalPartToWords (decimalPart, options) {
255
- const gender = options.gender || 'masculine'
248
+ function decimalPartToWords (decimalPart, gender, andWord) {
256
249
  const ONES = gender === 'feminine' ? ONES_FEM : ONES_MASC
257
250
 
258
251
  let result = ''
@@ -271,12 +264,18 @@ function decimalPartToWords (decimalPart, options) {
271
264
  * @param {number | string | bigint} value - The numeric value to convert
272
265
  * @param {Object} [options] - Optional configuration
273
266
  * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
274
- * @param {string} [options.andWord] - Custom conjunction word
267
+ * @param {string} [options.andWord='ו'] - Custom conjunction word
275
268
  * @returns {string} The number in Biblical Hebrew words
276
269
  */
277
- function toWords (value, options) {
270
+ function toCardinal (value, options) {
278
271
  options = validateOptions(options)
279
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
272
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
273
+
274
+ // Apply option defaults
275
+ const {
276
+ gender = 'masculine',
277
+ andWord = 'ו'
278
+ } = options
280
279
 
281
280
  let result = ''
282
281
 
@@ -284,17 +283,192 @@ function toWords (value, options) {
284
283
  result = NEGATIVE + ' '
285
284
  }
286
285
 
287
- result += integerToWords(integerPart, options)
286
+ result += integerToWords(integerPart, gender, andWord)
288
287
 
289
288
  if (decimalPart) {
290
- result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
289
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, gender, andWord)
291
290
  }
292
291
 
293
292
  return result
294
293
  }
295
294
 
295
+ // ============================================================================
296
+ // Ordinal Functions
297
+ // ============================================================================
298
+
299
+ /**
300
+ * Builds ordinal for tens and ones (0-99).
301
+ *
302
+ * @param {number} n - Number 0-99
303
+ * @returns {string} Ordinal word
304
+ */
305
+ function buildOrdinalTensOnes (n) {
306
+ if (n === 0) return ''
307
+ if (n < 10) return ORDINAL_ONES[n]
308
+ if (n < 20) return ORDINAL_TEENS[n - 10]
309
+
310
+ const ones = n % 10
311
+ const tens = Math.trunc(n / 10)
312
+
313
+ if (ones === 0) {
314
+ // Round tens: add "וראשון"
315
+ return ORDINAL_TENS[tens] + ' ו' + ORDINAL_ONES[1]
316
+ }
317
+ // Compound: cardinal tens + ordinal ones
318
+ return ORDINAL_TENS[tens] + ' ו' + ORDINAL_ONES[ones]
319
+ }
320
+
321
+ /**
322
+ * Converts a non-negative integer to Biblical Hebrew ordinal words.
323
+ *
324
+ * @param {bigint} n - Non-negative integer to convert
325
+ * @returns {string} Biblical Hebrew ordinal words
326
+ */
327
+ function integerToOrdinal (n) {
328
+ if (n === 0n) return ''
329
+ if (n === 1n) return ORDINAL_ONES[1]
330
+
331
+ // Numbers < 100
332
+ if (n < 100n) {
333
+ return buildOrdinalTensOnes(Number(n))
334
+ }
335
+
336
+ // Numbers < 1000
337
+ if (n < 1000n) {
338
+ const hundreds = Number(n / 100n)
339
+ const remainder = Number(n % 100n)
340
+
341
+ if (remainder === 0) {
342
+ return ORDINAL_HUNDRED
343
+ }
344
+ return HUNDREDS[hundreds] + ' ' + buildOrdinalTensOnes(remainder)
345
+ }
346
+
347
+ // Numbers < 1,000,000
348
+ if (n < 1_000_000n) {
349
+ const thousands = Number(n / 1000n)
350
+ const remainder = Number(n % 1000n)
351
+
352
+ if (remainder === 0) {
353
+ if (thousands <= 9) {
354
+ return THOUSANDS_MASC[thousands]
355
+ }
356
+ return buildScaleSegment(thousands, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS) + ' ' + SCALE[1]
357
+ }
358
+
359
+ // Cardinal thousands + ordinal remainder
360
+ let result
361
+ if (thousands <= 9) {
362
+ result = THOUSANDS_MASC[thousands]
363
+ } else {
364
+ result = buildScaleSegment(thousands, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS) + ' ' + SCALE[1]
365
+ }
366
+
367
+ if (remainder < 100) {
368
+ return result + ' ' + buildOrdinalTensOnes(remainder)
369
+ }
370
+
371
+ const remHundreds = Math.trunc(remainder / 100)
372
+ const remTensOnes = remainder % 100
373
+
374
+ if (remTensOnes === 0) {
375
+ return result + ' ' + HUNDREDS[remHundreds]
376
+ }
377
+ return result + ' ' + HUNDREDS[remHundreds] + ' ' + buildOrdinalTensOnes(remTensOnes)
378
+ }
379
+
380
+ // Numbers >= 1,000,000
381
+ const millions = Number(n / 1_000_000n)
382
+ const remainder = n % 1_000_000n
383
+
384
+ if (remainder === 0n) {
385
+ if (millions === 1) {
386
+ return SCALE[2]
387
+ }
388
+ return buildScaleSegment(millions, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS) + ' ' + SCALE_PLURAL[2]
389
+ }
390
+
391
+ // Cardinal millions + ordinal remainder
392
+ let result
393
+ if (millions === 1) {
394
+ result = SCALE[2]
395
+ } else {
396
+ result = buildScaleSegment(millions, 'ו', ONES_MASC, TEENS_MASC, HUNDREDS) + ' ' + SCALE_PLURAL[2]
397
+ }
398
+
399
+ return result + ' ' + integerToOrdinal(remainder)
400
+ }
401
+
402
+ /**
403
+ * Converts a numeric value to Biblical Hebrew ordinal words.
404
+ *
405
+ * @param {number | string | bigint} value - The numeric value to convert
406
+ * @returns {string} The ordinal in Biblical Hebrew words
407
+ * @throws {TypeError} If value is not a valid numeric type
408
+ * @throws {Error} If value is not a positive integer
409
+ *
410
+ * @example
411
+ * toOrdinal(1) // 'ראשון'
412
+ * toOrdinal(21) // 'עשרים וראשון'
413
+ */
414
+ function toOrdinal (value) {
415
+ const n = parseOrdinalValue(value)
416
+ return integerToOrdinal(n)
417
+ }
418
+
419
+ // ============================================================================
420
+ // Currency Functions
421
+ // ============================================================================
422
+
423
+ /**
424
+ * Converts a numeric value to Biblical Hebrew Shekel currency words.
425
+ *
426
+ * @param {number | string | bigint} value - The numeric value to convert
427
+ * @returns {string} The currency in Biblical Hebrew words
428
+ * @throws {TypeError} If value is not a valid numeric type
429
+ * @throws {Error} If value is not a valid number format
430
+ *
431
+ * @example
432
+ * toCurrency(1) // 'שקל אחד'
433
+ * toCurrency(2.50) // 'שניים שקלים חמישים גרות'
434
+ */
435
+ function toCurrency (value) {
436
+ const { isNegative, dollars, cents } = parseCurrencyValue(value)
437
+
438
+ const parts = []
439
+
440
+ if (isNegative) {
441
+ parts.push(NEGATIVE)
442
+ }
443
+
444
+ // Shekels (masculine)
445
+ if (dollars > 0n || cents === 0n) {
446
+ if (dollars === 1n) {
447
+ parts.push(SHEKEL + ' ' + ONES_MASC[1])
448
+ } else if (dollars === 2n) {
449
+ parts.push(ONES_MASC[2] + ' ' + SHEKEL_PLURAL)
450
+ } else {
451
+ const shekelWord = integerToWords(dollars, 'masculine', 'ו')
452
+ parts.push(shekelWord + ' ' + SHEKEL_PLURAL)
453
+ }
454
+ }
455
+
456
+ // Gerah (feminine subunit)
457
+ if (cents > 0n) {
458
+ const centNum = Number(cents)
459
+ if (centNum === 1) {
460
+ parts.push(GERAH + ' ' + ONES_FEM[1])
461
+ } else {
462
+ const gerahWord = integerToWords(cents, 'feminine', 'ו')
463
+ parts.push(gerahWord + ' ' + GERAH_PLURAL)
464
+ }
465
+ }
466
+
467
+ return parts.join(' ')
468
+ }
469
+
296
470
  // ============================================================================
297
471
  // Exports
298
472
  // ============================================================================
299
473
 
300
- export { toWords }
474
+ export { toCardinal, toOrdinal, toCurrency }
package/src/he-IL.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Converts a numeric value to Modern Hebrew words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Optional configuration
6
+ * @param {string} [options.andWord='ו'] - Custom conjunction word
7
+ * @returns {string} The number in Modern Hebrew words
8
+ */
9
+ export function toCardinal(value: number | string | bigint, options?: {
10
+ andWord?: string | undefined;
11
+ }): string;
12
+ /**
13
+ * Converts a numeric value to Hebrew ordinal words.
14
+ *
15
+ * @param {number | string | bigint} value - The numeric value to convert
16
+ * @returns {string} The ordinal in Hebrew words
17
+ * @throws {TypeError} If value is not a valid numeric type
18
+ * @throws {Error} If value is not a positive integer
19
+ *
20
+ * @example
21
+ * toOrdinal(1) // 'ראשון'
22
+ * toOrdinal(21) // 'עשרים וראשון'
23
+ */
24
+ export function toOrdinal(value: number | string | bigint): string;
25
+ /**
26
+ * Converts a numeric value to Hebrew New Israeli Shekel currency words.
27
+ *
28
+ * @param {number | string | bigint} value - The numeric value to convert
29
+ * @returns {string} The currency in Hebrew words
30
+ * @throws {TypeError} If value is not a valid numeric type
31
+ * @throws {Error} If value is not a valid number format
32
+ *
33
+ * @example
34
+ * toCurrency(1) // 'שקל אחד'
35
+ * toCurrency(2.50) // 'שניים שקלים חמישים אגורות'
36
+ */
37
+ export function toCurrency(value: number | string | bigint): string;