n2words 3.1.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 (482) hide show
  1. package/CHANGELOG.md +44 -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/{lib/languages/bn.js → src/bn-BD.js} +110 -6
  157. package/src/cs-CZ.d.ts +49 -0
  158. package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
  159. package/src/da-DK.d.ts +44 -0
  160. package/{lib/languages/da.js → src/da-DK.js} +131 -11
  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/{lib/languages/en.js → src/en-NZ.js} +164 -31
  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} +228 -18
  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/{lib/languages/fi.js → src/fi-FI.js} +152 -11
  207. package/src/fil-PH.d.ts +37 -0
  208. package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
  209. package/src/fr-BE.d.ts +49 -0
  210. package/{lib/languages → src}/fr-BE.js +175 -13
  211. package/src/fr-FR.d.ts +63 -0
  212. package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
  213. package/src/gu-IN.d.ts +35 -0
  214. package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
  215. package/src/ha-NG.d.ts +37 -0
  216. package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
  217. package/src/hbo-IL.d.ts +39 -0
  218. package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
  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/{lib/languages/hi.js → src/hi-IN.js} +116 -6
  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} +99 -8
  229. package/src/it-IT.d.ts +59 -0
  230. package/{lib/languages/it.js → src/it-IT.js} +179 -15
  231. package/src/ja-JP.d.ts +49 -0
  232. package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
  233. package/src/ka-GE.d.ts +44 -0
  234. package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
  235. package/src/kn-IN.d.ts +35 -0
  236. package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
  237. package/src/ko-KR.d.ts +45 -0
  238. package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
  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/{lib/languages/mr.js → src/mr-IN.js} +116 -6
  245. package/src/ms-MY.d.ts +37 -0
  246. package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
  247. package/src/nb-NO.d.ts +44 -0
  248. package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
  249. package/src/nl-NL.d.ts +54 -0
  250. package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
  251. package/src/pa-IN.d.ts +36 -0
  252. package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
  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/{lib/languages/pt.js → src/pt-PT.js} +234 -12
  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} +136 -11
  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} +109 -6
  271. package/src/te-IN.d.ts +35 -0
  272. package/{lib/languages/te.js → src/te-IN.js} +115 -6
  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/{lib/languages/tr.js → src/tr-TR.js} +168 -23
  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/{lib/languages/ur.js → src/ur-PK.js} +116 -6
  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} +102 -11
  291. package/src/yo-NG.d.ts +37 -0
  292. package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
  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/ka.js +0 -3
  350. package/dist/languages/ka.js.map +0 -1
  351. package/dist/languages/kn.js +0 -3
  352. package/dist/languages/kn.js.map +0 -1
  353. package/dist/languages/ko.js +0 -3
  354. package/dist/languages/ko.js.map +0 -1
  355. package/dist/languages/lt.js +0 -3
  356. package/dist/languages/lt.js.map +0 -1
  357. package/dist/languages/lv.js +0 -3
  358. package/dist/languages/lv.js.map +0 -1
  359. package/dist/languages/mr.js +0 -3
  360. package/dist/languages/mr.js.map +0 -1
  361. package/dist/languages/ms.js +0 -3
  362. package/dist/languages/ms.js.map +0 -1
  363. package/dist/languages/nb.js +0 -3
  364. package/dist/languages/nb.js.map +0 -1
  365. package/dist/languages/nl.js +0 -3
  366. package/dist/languages/nl.js.map +0 -1
  367. package/dist/languages/pa.js +0 -3
  368. package/dist/languages/pa.js.map +0 -1
  369. package/dist/languages/pl.js +0 -3
  370. package/dist/languages/pl.js.map +0 -1
  371. package/dist/languages/pt.js +0 -3
  372. package/dist/languages/pt.js.map +0 -1
  373. package/dist/languages/ro.js +0 -3
  374. package/dist/languages/ro.js.map +0 -1
  375. package/dist/languages/ru.js +0 -3
  376. package/dist/languages/ru.js.map +0 -1
  377. package/dist/languages/sr-Cyrl.js +0 -3
  378. package/dist/languages/sr-Cyrl.js.map +0 -1
  379. package/dist/languages/sr-Latn.js +0 -3
  380. package/dist/languages/sr-Latn.js.map +0 -1
  381. package/dist/languages/sv.js +0 -3
  382. package/dist/languages/sv.js.map +0 -1
  383. package/dist/languages/sw.js +0 -3
  384. package/dist/languages/sw.js.map +0 -1
  385. package/dist/languages/ta.js +0 -3
  386. package/dist/languages/ta.js.map +0 -1
  387. package/dist/languages/te.js +0 -3
  388. package/dist/languages/te.js.map +0 -1
  389. package/dist/languages/th.js +0 -3
  390. package/dist/languages/th.js.map +0 -1
  391. package/dist/languages/tr.js +0 -3
  392. package/dist/languages/tr.js.map +0 -1
  393. package/dist/languages/uk.js +0 -3
  394. package/dist/languages/uk.js.map +0 -1
  395. package/dist/languages/ur.js +0 -3
  396. package/dist/languages/ur.js.map +0 -1
  397. package/dist/languages/vi.js +0 -3
  398. package/dist/languages/vi.js.map +0 -1
  399. package/dist/languages/yo.js +0 -3
  400. package/dist/languages/yo.js.map +0 -1
  401. package/dist/languages/zh-Hans.js +0 -3
  402. package/dist/languages/zh-Hans.js.map +0 -1
  403. package/dist/languages/zh-Hant.js +0 -3
  404. package/dist/languages/zh-Hant.js.map +0 -1
  405. package/dist/n2words.js +0 -3
  406. package/dist/n2words.js.map +0 -1
  407. package/lib/languages/am-Latn.d.ts +0 -7
  408. package/lib/languages/am-Latn.js +0 -159
  409. package/lib/languages/am.d.ts +0 -7
  410. package/lib/languages/am.js +0 -159
  411. package/lib/languages/ar.d.ts +0 -17
  412. package/lib/languages/az.d.ts +0 -7
  413. package/lib/languages/az.js +0 -171
  414. package/lib/languages/bn.d.ts +0 -7
  415. package/lib/languages/cs.d.ts +0 -18
  416. package/lib/languages/da.d.ts +0 -14
  417. package/lib/languages/de.d.ts +0 -17
  418. package/lib/languages/de.js +0 -320
  419. package/lib/languages/el.d.ts +0 -14
  420. package/lib/languages/el.js +0 -236
  421. package/lib/languages/en.d.ts +0 -17
  422. package/lib/languages/es.d.ts +0 -21
  423. package/lib/languages/fa.d.ts +0 -7
  424. package/lib/languages/fa.js +0 -134
  425. package/lib/languages/fi.d.ts +0 -14
  426. package/lib/languages/fil.d.ts +0 -7
  427. package/lib/languages/fr-BE.d.ts +0 -11
  428. package/lib/languages/fr.d.ts +0 -21
  429. package/lib/languages/gu.d.ts +0 -7
  430. package/lib/languages/ha.d.ts +0 -7
  431. package/lib/languages/hbo.d.ts +0 -13
  432. package/lib/languages/he.d.ts +0 -13
  433. package/lib/languages/he.js +0 -265
  434. package/lib/languages/hi.d.ts +0 -7
  435. package/lib/languages/hr.d.ts +0 -11
  436. package/lib/languages/hr.js +0 -224
  437. package/lib/languages/hu.d.ts +0 -7
  438. package/lib/languages/id.d.ts +0 -7
  439. package/lib/languages/it.d.ts +0 -19
  440. package/lib/languages/ja.d.ts +0 -17
  441. package/lib/languages/ka.d.ts +0 -17
  442. package/lib/languages/kn.d.ts +0 -7
  443. package/lib/languages/ko.d.ts +0 -14
  444. package/lib/languages/lt.d.ts +0 -18
  445. package/lib/languages/lt.js +0 -301
  446. package/lib/languages/lv.d.ts +0 -18
  447. package/lib/languages/lv.js +0 -312
  448. package/lib/languages/mr.d.ts +0 -7
  449. package/lib/languages/ms.d.ts +0 -7
  450. package/lib/languages/nb.d.ts +0 -14
  451. package/lib/languages/nl.d.ts +0 -26
  452. package/lib/languages/pa.d.ts +0 -7
  453. package/lib/languages/pl.d.ts +0 -22
  454. package/lib/languages/pl.js +0 -317
  455. package/lib/languages/pt.d.ts +0 -17
  456. package/lib/languages/ro.d.ts +0 -18
  457. package/lib/languages/ru.d.ts +0 -11
  458. package/lib/languages/ru.js +0 -245
  459. package/lib/languages/sr-Cyrl.d.ts +0 -11
  460. package/lib/languages/sr-Cyrl.js +0 -221
  461. package/lib/languages/sr-Latn.d.ts +0 -11
  462. package/lib/languages/sr-Latn.js +0 -221
  463. package/lib/languages/sv.d.ts +0 -14
  464. package/lib/languages/sw.d.ts +0 -7
  465. package/lib/languages/ta.d.ts +0 -7
  466. package/lib/languages/te.d.ts +0 -7
  467. package/lib/languages/th.d.ts +0 -7
  468. package/lib/languages/tr.d.ts +0 -18
  469. package/lib/languages/uk.d.ts +0 -11
  470. package/lib/languages/uk.js +0 -224
  471. package/lib/languages/ur.d.ts +0 -7
  472. package/lib/languages/vi.d.ts +0 -17
  473. package/lib/languages/yo.d.ts +0 -7
  474. package/lib/languages/zh-Hans.d.ts +0 -11
  475. package/lib/languages/zh-Hant.d.ts +0 -11
  476. package/lib/n2words.d.ts +0 -55
  477. package/lib/n2words.js +0 -126
  478. package/lib/utils/parse-numeric.d.ts +0 -17
  479. /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
  480. /package/{lib → src}/utils/is-plain-object.js +0 -0
  481. /package/{lib → src}/utils/validate-options.d.ts +0 -0
  482. /package/{lib → src}/utils/validate-options.js +0 -0
package/src/lv-LV.js ADDED
@@ -0,0 +1,595 @@
1
+ /**
2
+ * Latvian (Latvia) language converter
3
+ *
4
+ * CLDR: lv-LV | Latvian as used in Latvia
5
+ *
6
+ * Key features:
7
+ * - Two-form pluralization (singular for 1 except 11, plural otherwise)
8
+ * - Gender agreement (masculine/feminine for numbers < 1000)
9
+ * - Special hundreds forms (simts/simti/simtu)
10
+ * - Omit "one" before scale words
11
+ * - Long scale naming
12
+ */
13
+
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
+
19
+ // ============================================================================
20
+ // Vocabulary (module-level constants)
21
+ // ============================================================================
22
+
23
+ const ONES_MASC = ['', 'viens', 'divi', 'trīs', 'četri', 'pieci', 'seši', 'septiņi', 'astoņi', 'deviņi']
24
+ const ONES_FEM = ['', 'viena', 'divas', 'trīs', 'četras', 'piecas', 'sešas', 'septiņas', 'astoņas', 'deviņas']
25
+
26
+ const TEENS = ['desmit', 'vienpadsmit', 'divpadsmit', 'trīspadsmit', 'četrpadsmit', 'piecpadsmit', 'sešpadsmit', 'septiņpadsmit', 'astoņpadsmit', 'deviņpadsmit']
27
+ const TENS = ['', '', 'divdesmit', 'trīsdesmit', 'četrdesmit', 'piecdesmit', 'sešdesmit', 'septiņdesmit', 'astoņdesmit', 'deviņdesmit']
28
+
29
+ // Hundreds: simts (100, 110-199), simti (200-999), simtu (101-109)
30
+ const HUNDRED_SINGULAR = 'simts'
31
+ const HUNDRED_PLURAL = 'simti'
32
+ const HUNDRED_GENITIVE = 'simtu'
33
+
34
+ const ZERO = 'nulle'
35
+ const NEGATIVE = 'mīnus'
36
+ const DECIMAL_SEP = 'komats'
37
+
38
+ // ============================================================================
39
+ // Ordinal Vocabulary
40
+ // ============================================================================
41
+
42
+ // Latvian ordinals (masculine nominative singular)
43
+ const ORDINAL_ONES = ['', 'pirmais', 'otrais', 'trešais', 'ceturtais', 'piektais', 'sestais', 'septītais', 'astotais', 'devītais']
44
+
45
+ // Ordinal teens
46
+ const ORDINAL_TEENS = ['desmitais', 'vienpadsmitais', 'divpadsmitais', 'trīspadsmitais', 'četrpadsmitais', 'piecpadsmitais', 'sešpadsmitais', 'septiņpadsmitais', 'astoņpadsmitais', 'deviņpadsmitais']
47
+
48
+ // Ordinal tens
49
+ const ORDINAL_TENS = ['', '', 'divdesmitais', 'trīsdesmitais', 'četrdesmitais', 'piecdesmitais', 'sešdesmitais', 'septiņdesmitais', 'astoņdesmitais', 'deviņdesmitais']
50
+
51
+ // Ordinal hundreds (complete forms with suffix)
52
+ const ORDINAL_HUNDREDS = ['', 'simtais', 'divsimtais', 'trīssimtais', 'četrsimtais', 'piecsimtais', 'sešsimtais', 'septiņsimtais', 'astoņsimtais', 'deviņsimtais']
53
+
54
+ // Scale ordinals
55
+ const ORDINAL_SCALES = ['tūkstošais', 'miljonais', 'miljardais', 'triljonais']
56
+
57
+ // ============================================================================
58
+ // Currency Vocabulary (Euro - Latvia uses Euro since 2014)
59
+ // ============================================================================
60
+
61
+ // Cent forms: [singular, plural, genitive]
62
+ // Note: Eiro is indeclinable in Latvian, so we just use 'eiro' directly
63
+ const CENT_FORMS = ['cents', 'centi', 'centu']
64
+
65
+ // Scale words: [singular, plural, genitive]
66
+ const SCALE_FORMS = [
67
+ ['tūkstotis', 'tūkstoši', 'tūkstošu'],
68
+ ['miljons', 'miljoni', 'miljonu'],
69
+ ['miljards', 'miljardi', 'miljardu'],
70
+ ['triljons', 'triljoni', 'triljonu'],
71
+ ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],
72
+ ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],
73
+ ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],
74
+ ['septiljons', 'septiljoni', 'septiljonu'],
75
+ ['oktiljons', 'oktiljoni', 'oktiljonu']
76
+ ]
77
+
78
+ // ============================================================================
79
+ // Segment Building
80
+ // ============================================================================
81
+
82
+ /**
83
+ * Builds segment word for 0-999 (masculine form).
84
+ * Does NOT include special handling for segment=1 (omitOneBeforeScale).
85
+ * That's handled at join time.
86
+ */
87
+ function buildSegment (n) {
88
+ if (n === 0) return ''
89
+
90
+ const ones = n % 10
91
+ const tens = Math.trunc(n / 10) % 10
92
+ const hundreds = Math.trunc(n / 100)
93
+
94
+ const parts = []
95
+
96
+ // Hundreds - Latvian has special forms
97
+ if (hundreds > 0) {
98
+ if (hundreds === 1 && tens === 0 && ones > 0) {
99
+ // 101-109: use genitive form "simtu"
100
+ parts.push(HUNDRED_GENITIVE)
101
+ } else if (hundreds > 1) {
102
+ // 200-999: use plural "simti"
103
+ parts.push(ONES_MASC[hundreds])
104
+ parts.push(HUNDRED_PLURAL)
105
+ } else {
106
+ // 100, 110-199: use singular "simts"
107
+ parts.push(HUNDRED_SINGULAR)
108
+ }
109
+ }
110
+
111
+ // Tens
112
+ if (tens > 1) {
113
+ parts.push(TENS[tens])
114
+ }
115
+
116
+ // Teens or ones
117
+ if (tens === 1) {
118
+ parts.push(TEENS[ones])
119
+ } else if (ones > 0) {
120
+ parts.push(ONES_MASC[ones])
121
+ }
122
+
123
+ return parts.join(' ')
124
+ }
125
+
126
+ /**
127
+ * Builds segment word for 0-999 (feminine form - only differs in ones).
128
+ */
129
+ function buildSegmentFeminine (n) {
130
+ if (n === 0) return ''
131
+
132
+ const ones = n % 10
133
+ const tens = Math.trunc(n / 10) % 10
134
+ const hundreds = Math.trunc(n / 100)
135
+
136
+ const parts = []
137
+
138
+ // Hundreds - always masculine
139
+ if (hundreds > 0) {
140
+ if (hundreds === 1 && tens === 0 && ones > 0) {
141
+ parts.push(HUNDRED_GENITIVE)
142
+ } else if (hundreds > 1) {
143
+ parts.push(ONES_MASC[hundreds])
144
+ parts.push(HUNDRED_PLURAL)
145
+ } else {
146
+ parts.push(HUNDRED_SINGULAR)
147
+ }
148
+ }
149
+
150
+ // Tens
151
+ if (tens > 1) {
152
+ parts.push(TENS[tens])
153
+ }
154
+
155
+ // Teens or ones - feminine for ones only
156
+ if (tens === 1) {
157
+ parts.push(TEENS[ones])
158
+ } else if (ones > 0) {
159
+ parts.push(ONES_FEM[ones])
160
+ }
161
+
162
+ return parts.join(' ')
163
+ }
164
+
165
+ // ============================================================================
166
+ // Pluralization
167
+ // ============================================================================
168
+
169
+ /**
170
+ * Latvian pluralization - simpler than Slavic.
171
+ * Singular: ends in 1 (except 11)
172
+ * Plural: everything else
173
+ *
174
+ * @param {number} n - The segment value
175
+ * @param {string[]} forms - [singular, plural, genitive]
176
+ * @returns {string} The appropriate form
177
+ */
178
+ function pluralize (n, forms) {
179
+ if (n === 0) return forms[2]
180
+
181
+ const lastDigit = n % 10
182
+ const lastTwoDigits = n % 100
183
+
184
+ if (lastDigit === 1 && lastTwoDigits !== 11) {
185
+ return forms[0]
186
+ }
187
+
188
+ return forms[1]
189
+ }
190
+
191
+ /**
192
+ * Latvian currency pluralization.
193
+ * Uses genitive for 0, 10-19, and multiples of 10.
194
+ *
195
+ * @param {number} n - The segment value
196
+ * @param {string[]} forms - [singular, plural, genitive]
197
+ * @returns {string} The appropriate form
198
+ */
199
+ function pluralizeCurrency (n, forms) {
200
+ if (n === 0) return forms[2]
201
+
202
+ const lastDigit = n % 10
203
+ const lastTwoDigits = n % 100
204
+
205
+ // 10-19 use genitive
206
+ if (lastTwoDigits >= 10 && lastTwoDigits <= 19) {
207
+ return forms[2]
208
+ }
209
+
210
+ // Ends in 0 uses genitive
211
+ if (lastDigit === 0) {
212
+ return forms[2]
213
+ }
214
+
215
+ // Ends in 1 uses singular
216
+ if (lastDigit === 1) {
217
+ return forms[0]
218
+ }
219
+
220
+ // 2-9 uses plural
221
+ return forms[1]
222
+ }
223
+
224
+ // ============================================================================
225
+ // Conversion Functions
226
+ // ============================================================================
227
+
228
+ /**
229
+ * Converts a non-negative integer to Latvian words.
230
+ *
231
+ * @param {bigint} n - Non-negative integer to convert
232
+ * @param {Object} options - Conversion options
233
+ * @returns {string} Latvian words
234
+ */
235
+ function integerToWords (n, gender) {
236
+ if (n === 0n) return ZERO
237
+
238
+ // Fast path: numbers < 1000
239
+ if (n < 1000n) {
240
+ const num = Number(n)
241
+ return gender === 'feminine' ? buildSegmentFeminine(num) : buildSegment(num)
242
+ }
243
+
244
+ // For numbers >= 1000, feminine only applies to final segment if < 1000
245
+ // But we use masculine for all segments when n >= 1000
246
+ return buildLargeNumberWords(n, gender)
247
+ }
248
+
249
+ /**
250
+ * Builds words for numbers >= 1000.
251
+ *
252
+ * @param {bigint} n - Number >= 1000
253
+ * @param {Object} options - Conversion options
254
+ * @returns {string} Latvian words
255
+ */
256
+ function buildLargeNumberWords (n, gender) {
257
+ const numStr = n.toString()
258
+ const len = numStr.length
259
+
260
+ // Build segments of 3 digits from right to left
261
+ const segments = []
262
+ const segmentSize = 3
263
+
264
+ const remainderLen = len % segmentSize
265
+ let pos = 0
266
+ if (remainderLen > 0) {
267
+ segments.push(Number(numStr.slice(0, remainderLen)))
268
+ pos = remainderLen
269
+ }
270
+ while (pos < len) {
271
+ segments.push(Number(numStr.slice(pos, pos + segmentSize)))
272
+ pos += segmentSize
273
+ }
274
+
275
+ // Convert segments to words
276
+ const parts = []
277
+ let scaleIndex = segments.length - 1
278
+
279
+ for (let i = 0; i < segments.length; i++) {
280
+ const segment = segments[i]
281
+
282
+ if (segment !== 0) {
283
+ const segmentWord = buildSegment(segment)
284
+
285
+ if (scaleIndex === 0) {
286
+ // Units segment - use masculine (feminine doesn't apply when n >= 1000)
287
+ parts.push(segmentWord)
288
+ } else {
289
+ // Segment with scale word
290
+ const scaleForms = SCALE_FORMS[scaleIndex - 1]
291
+ const scaleWord = pluralize(segment, scaleForms)
292
+
293
+ // Latvian omits "one" before scale words
294
+ if (segment === 1) {
295
+ parts.push(scaleWord)
296
+ } else {
297
+ parts.push(segmentWord + ' ' + scaleWord)
298
+ }
299
+ }
300
+ }
301
+
302
+ scaleIndex--
303
+ }
304
+
305
+ return parts.join(' ')
306
+ }
307
+
308
+ /**
309
+ * Converts decimal digits to Latvian words.
310
+ *
311
+ * @param {string} decimalPart - Decimal digits (without the point)
312
+ * @param {Object} options - Conversion options
313
+ * @returns {string} Latvian words for decimal part
314
+ */
315
+ function decimalPartToWords (decimalPart, gender) {
316
+ let result = ''
317
+
318
+ // Handle leading zeros
319
+ let i = 0
320
+ while (i < decimalPart.length && decimalPart[i] === '0') {
321
+ if (result) result += ' '
322
+ result += ZERO
323
+ i++
324
+ }
325
+
326
+ // Convert remainder as a single number
327
+ const remainder = decimalPart.slice(i)
328
+ if (remainder) {
329
+ if (result) result += ' '
330
+ result += integerToWords(BigInt(remainder), gender)
331
+ }
332
+
333
+ return result
334
+ }
335
+
336
+ /**
337
+ * Converts a numeric value to Latvian words.
338
+ *
339
+ * @param {number | string | bigint} value - The numeric value to convert
340
+ * @param {Object} [options] - Conversion options
341
+ * @param {string} [options.gender='masculine'] - Gender for numbers < 1000
342
+ * @returns {string} The number in Latvian words
343
+ * @throws {TypeError} If value is not a valid numeric type
344
+ * @throws {Error} If value is not a valid number format
345
+ *
346
+ * @example
347
+ * toCardinal(42) // 'četrdesmit divi'
348
+ * toCardinal(1, { gender: 'feminine' }) // 'viena'
349
+ * toCardinal(1000) // 'tūkstotis'
350
+ */
351
+ function toCardinal (value, options) {
352
+ options = validateOptions(options)
353
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
354
+
355
+ // Apply option defaults
356
+ const { gender = 'masculine' } = options
357
+
358
+ let result = ''
359
+
360
+ if (isNegative) {
361
+ result = NEGATIVE + ' '
362
+ }
363
+
364
+ result += integerToWords(integerPart, gender)
365
+
366
+ if (decimalPart) {
367
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, gender)
368
+ }
369
+
370
+ return result
371
+ }
372
+
373
+ // ============================================================================
374
+ // ORDINAL: toOrdinal(value)
375
+ // ============================================================================
376
+
377
+ /**
378
+ * Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
379
+ *
380
+ * @param {number} n - Number 0-99
381
+ * @returns {string} Ordinal words
382
+ */
383
+ function buildOrdinalTensOnes (n) {
384
+ if (n === 0) return ''
385
+
386
+ const onesDigit = n % 10
387
+ const tensDigit = Math.trunc(n / 10)
388
+
389
+ if (tensDigit === 0) {
390
+ return ORDINAL_ONES[onesDigit]
391
+ }
392
+
393
+ if (tensDigit === 1) {
394
+ return ORDINAL_TEENS[onesDigit]
395
+ }
396
+
397
+ if (onesDigit === 0) {
398
+ return ORDINAL_TENS[tensDigit]
399
+ }
400
+
401
+ return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
402
+ }
403
+
404
+ /**
405
+ * Converts a positive integer to Latvian ordinal words (masculine nominative).
406
+ *
407
+ * @param {bigint} n - Positive integer to convert
408
+ * @returns {string} Ordinal Latvian words
409
+ */
410
+ function integerToOrdinal (n) {
411
+ if (n < 100n) {
412
+ return buildOrdinalTensOnes(Number(n))
413
+ }
414
+
415
+ if (n < 1000n) {
416
+ const num = Number(n)
417
+ const hundredsDigit = Math.trunc(num / 100)
418
+ const remainder = num % 100
419
+
420
+ if (remainder === 0) {
421
+ return ORDINAL_HUNDREDS[hundredsDigit]
422
+ }
423
+
424
+ // Cardinal hundreds + ordinal remainder
425
+ let hundredWord
426
+ if (hundredsDigit === 1) {
427
+ hundredWord = HUNDRED_SINGULAR
428
+ } else {
429
+ hundredWord = ONES_MASC[hundredsDigit] + ' ' + HUNDRED_PLURAL
430
+ }
431
+ return hundredWord + ' ' + buildOrdinalTensOnes(remainder)
432
+ }
433
+
434
+ if (n < 1_000_000n) {
435
+ const thousands = Number(n / 1000n)
436
+ const remainder = Number(n % 1000n)
437
+
438
+ if (remainder === 0) {
439
+ if (thousands === 1) {
440
+ return ORDINAL_SCALES[0]
441
+ }
442
+ // For 2000+, include cardinal scale word before ordinal
443
+ const scaleWord = pluralize(thousands, SCALE_FORMS[0])
444
+ return buildSegment(thousands) + ' ' + scaleWord + ' ' + ORDINAL_SCALES[0]
445
+ }
446
+
447
+ const scaleWord = pluralize(thousands, SCALE_FORMS[0])
448
+ const thousandsWord = thousands === 1 ? '' : buildSegment(thousands) + ' '
449
+ return (thousands === 1 ? scaleWord : thousandsWord + scaleWord) + ' ' + integerToOrdinal(BigInt(remainder))
450
+ }
451
+
452
+ return buildLargeOrdinal(n)
453
+ }
454
+
455
+ /**
456
+ * Builds ordinal words for numbers >= 1,000,000.
457
+ *
458
+ * @param {bigint} n - Number >= 1,000,000
459
+ * @returns {string} Ordinal Latvian words
460
+ */
461
+ function buildLargeOrdinal (n) {
462
+ const numStr = n.toString()
463
+ const len = numStr.length
464
+
465
+ const segments = []
466
+ const segmentSize = 3
467
+
468
+ const remainderLen = len % segmentSize
469
+ let pos = 0
470
+ if (remainderLen > 0) {
471
+ segments.push(Number(numStr.slice(0, remainderLen)))
472
+ pos = remainderLen
473
+ }
474
+ while (pos < len) {
475
+ segments.push(Number(numStr.slice(pos, pos + segmentSize)))
476
+ pos += segmentSize
477
+ }
478
+
479
+ let lastNonZeroIdx = segments.length - 1
480
+ while (lastNonZeroIdx >= 0 && segments[lastNonZeroIdx] === 0) {
481
+ lastNonZeroIdx--
482
+ }
483
+
484
+ const parts = []
485
+ let scaleIndex = segments.length - 1
486
+
487
+ for (let i = 0; i < segments.length; i++) {
488
+ const segment = segments[i]
489
+
490
+ if (segment !== 0) {
491
+ const isLastNonZero = (i === lastNonZeroIdx)
492
+
493
+ if (scaleIndex === 0) {
494
+ if (isLastNonZero) {
495
+ parts.push(integerToOrdinal(BigInt(segment)))
496
+ } else {
497
+ parts.push(buildSegment(segment))
498
+ }
499
+ } else {
500
+ if (isLastNonZero) {
501
+ if (segment === 1) {
502
+ parts.push(ORDINAL_SCALES[scaleIndex - 1])
503
+ } else {
504
+ // For 2+, include cardinal scale word before ordinal
505
+ const scaleForms = SCALE_FORMS[scaleIndex - 1]
506
+ const cardinalScaleWord = pluralize(segment, scaleForms)
507
+ parts.push(buildSegment(segment) + ' ' + cardinalScaleWord + ' ' + ORDINAL_SCALES[scaleIndex - 1])
508
+ }
509
+ } else {
510
+ const scaleForms = SCALE_FORMS[scaleIndex - 1]
511
+ const scaleWord = pluralize(segment, scaleForms)
512
+ if (segment === 1) {
513
+ parts.push(scaleWord)
514
+ } else {
515
+ parts.push(buildSegment(segment) + ' ' + scaleWord)
516
+ }
517
+ }
518
+ }
519
+ }
520
+
521
+ scaleIndex--
522
+ }
523
+
524
+ return parts.join(' ')
525
+ }
526
+
527
+ /**
528
+ * Converts a numeric value to Latvian ordinal words (masculine nominative).
529
+ *
530
+ * @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
531
+ * @returns {string} The number as ordinal words
532
+ * @throws {TypeError} If value is not a valid numeric type
533
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
534
+ *
535
+ * @example
536
+ * toOrdinal(1) // 'pirmais'
537
+ * toOrdinal(2) // 'otrais'
538
+ * toOrdinal(21) // 'divdesmit pirmais'
539
+ * toOrdinal(100) // 'simtais'
540
+ * toOrdinal(1000) // 'tūkstošais'
541
+ */
542
+ function toOrdinal (value) {
543
+ const integerPart = parseOrdinalValue(value)
544
+ return integerToOrdinal(integerPart)
545
+ }
546
+
547
+ // ============================================================================
548
+ // CURRENCY: toCurrency(value)
549
+ // ============================================================================
550
+
551
+ /**
552
+ * Converts a numeric value to Latvian currency words (Euro).
553
+ *
554
+ * @param {number | string | bigint} value - The currency amount to convert
555
+ * @returns {string} The amount in Latvian currency words
556
+ * @throws {TypeError} If value is not a valid numeric type
557
+ * @throws {Error} If value is not a valid number format
558
+ *
559
+ * @example
560
+ * toCurrency(42) // 'četrdesmit divi eiro'
561
+ * toCurrency(1) // 'viens eiro'
562
+ * toCurrency(1.50) // 'viens eiro piecdesmit centu'
563
+ * toCurrency(-5) // 'mīnus pieci eiro'
564
+ */
565
+ function toCurrency (value) {
566
+ const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
567
+
568
+ let result = ''
569
+ if (isNegative) {
570
+ result = NEGATIVE + ' '
571
+ }
572
+
573
+ // Euro part (eiro is indeclinable)
574
+ if (euros > 0n || cents === 0n) {
575
+ result += integerToWords(euros, 'masculine')
576
+ result += ' eiro'
577
+ }
578
+
579
+ // Cent part (masculine)
580
+ if (cents > 0n) {
581
+ if (euros > 0n) {
582
+ result += ' '
583
+ }
584
+ result += integerToWords(cents, 'masculine')
585
+ result += ' ' + pluralizeCurrency(Number(cents), CENT_FORMS)
586
+ }
587
+
588
+ return result
589
+ }
590
+
591
+ // ============================================================================
592
+ // Public API
593
+ // ============================================================================
594
+
595
+ export { toCardinal, toOrdinal, toCurrency }
package/src/mr-IN.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Converts a numeric value to Marathi words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Marathi words
6
+ */
7
+ export function toCardinal(value: number | string | bigint): string;
8
+ /**
9
+ * Converts a numeric value to Marathi ordinal words.
10
+ *
11
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
12
+ * @returns {string} The number as ordinal words
13
+ * @throws {TypeError} If value is not a valid numeric type
14
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
15
+ *
16
+ * @example
17
+ * toOrdinal(1) // 'पहिला'
18
+ * toOrdinal(2) // 'दुसरा'
19
+ * toOrdinal(3) // 'तिसरा'
20
+ * toOrdinal(10) // 'दहावा'
21
+ */
22
+ export function toOrdinal(value: number | string | bigint): string;
23
+ /**
24
+ * Converts a numeric value to Marathi currency words (Indian Rupee).
25
+ *
26
+ * @param {number | string | bigint} value - The currency amount to convert
27
+ * @returns {string} The amount in Marathi currency words
28
+ * @throws {TypeError} If value is not a valid numeric type
29
+ * @throws {Error} If value is not a valid number format
30
+ *
31
+ * @example
32
+ * toCurrency(42.50) // 'बेचाळीस रुपये पन्नास पैसे'
33
+ * toCurrency(1) // 'एक रुपया'
34
+ * toCurrency(0.01) // 'एक पैसा'
35
+ */
36
+ export function toCurrency(value: number | string | bigint): string;