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
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Italian language converter - Functional Implementation
2
+ * Italian (Italy) language converter
3
3
  *
4
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: it-IT | Italian as used in Italy
5
5
  *
6
6
  * Italian-specific rules:
7
7
  * - Concatenation without spaces within segments ("ventotto" not "venti otto")
@@ -12,7 +12,10 @@
12
12
  * - "e" connector before simple final remainder
13
13
  */
14
14
 
15
- import { parseNumericValue } from '../utils/parse-numeric.js'
15
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
16
+ import { parseCurrencyValue } from './utils/parse-currency.js'
17
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
18
+ import { validateOptions } from './utils/validate-options.js'
16
19
 
17
20
  // ============================================================================
18
21
  // Vocabulary (module-level constants)
@@ -39,6 +42,24 @@ const THOUSAND_PLURAL_SUFFIX = 'mila'
39
42
  // Scale word generation
40
43
  const SCALE_PREFIXES = ['m', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec']
41
44
 
45
+ // ============================================================================
46
+ // Ordinal Vocabulary
47
+ // ============================================================================
48
+
49
+ // Irregular ordinals 1-10 (masculine form)
50
+ const ORDINAL_ONES = ['', 'primo', 'secondo', 'terzo', 'quarto', 'quinto', 'sesto', 'settimo', 'ottavo', 'nono', 'decimo']
51
+
52
+ // Ordinal suffix for 11+
53
+ const ORDINAL_SUFFIX = 'esimo'
54
+
55
+ // ============================================================================
56
+ // Currency Vocabulary (Euro)
57
+ // ============================================================================
58
+
59
+ const EURO = 'euro'
60
+ const CENTESIMO = 'centesimo'
61
+ const CENTESIMI = 'centesimi'
62
+
42
63
  // ============================================================================
43
64
  // Segment Building
44
65
  // ============================================================================
@@ -56,8 +77,8 @@ function buildSegment (n) {
56
77
  if (n === 0) return ''
57
78
 
58
79
  const ones = n % 10
59
- const tens = Math.floor(n / 10) % 10
60
- const hundreds = Math.floor(n / 100)
80
+ const tens = Math.trunc(n / 10) % 10
81
+ const hundreds = Math.trunc(n / 100)
61
82
 
62
83
  let result = ''
63
84
 
@@ -139,7 +160,7 @@ function buildThousands (n) {
139
160
  */
140
161
  function getScaleWordSingular (scaleIndex) {
141
162
  if (scaleIndex < 2) return ''
142
- const prefixIndex = Math.floor((scaleIndex - 2) / 2)
163
+ const prefixIndex = Math.trunc((scaleIndex - 2) / 2)
143
164
  const isIardo = (scaleIndex - 2) % 2 === 1
144
165
  const prefix = SCALE_PREFIXES[prefixIndex]
145
166
  if (!prefix) return ''
@@ -152,7 +173,7 @@ function getScaleWordSingular (scaleIndex) {
152
173
  */
153
174
  function getScaleWordPlural (scaleIndex) {
154
175
  if (scaleIndex < 2) return ''
155
- const prefixIndex = Math.floor((scaleIndex - 2) / 2)
176
+ const prefixIndex = Math.trunc((scaleIndex - 2) / 2)
156
177
  const isIardo = (scaleIndex - 2) % 2 === 1
157
178
  const prefix = SCALE_PREFIXES[prefixIndex]
158
179
  if (!prefix) return ''
@@ -311,14 +332,14 @@ function decimalPartToWords (decimalPart) {
311
332
  * @throws {Error} If value is not a valid number format
312
333
  *
313
334
  * @example
314
- * toWords(28) // 'ventotto'
315
- * toWords(23) // 'ventitré'
316
- * toWords(1000) // 'mille'
317
- * toWords(2000) // 'duemila'
318
- * toWords(1000000) // 'un milione'
335
+ * toCardinal(28) // 'ventotto'
336
+ * toCardinal(23) // 'ventitré'
337
+ * toCardinal(1000) // 'mille'
338
+ * toCardinal(2000) // 'duemila'
339
+ * toCardinal(1000000) // 'un milione'
319
340
  */
320
- function toWords (value) {
321
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
341
+ function toCardinal (value) {
342
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
322
343
 
323
344
  let result = ''
324
345
 
@@ -335,8 +356,151 @@ function toWords (value) {
335
356
  return result
336
357
  }
337
358
 
359
+ // ============================================================================
360
+ // ORDINAL: toOrdinal(value)
361
+ // ============================================================================
362
+
363
+ /**
364
+ * Converts a cardinal word to ordinal form by dropping final vowel and adding -esimo.
365
+ *
366
+ * @param {string} cardinalWord - Cardinal word to convert
367
+ * @returns {string} Ordinal form
368
+ */
369
+ function cardinalToOrdinal (cardinalWord) {
370
+ // Handle accented 'é' at end (tré → tre + esimo = treesimo)
371
+ if (cardinalWord.endsWith('é')) {
372
+ return cardinalWord.slice(0, -1) + 'e' + ORDINAL_SUFFIX
373
+ }
374
+
375
+ // Handle "mila" ending (duemila → duemillesimo, not duemilesimo)
376
+ // The ordinal of thousand is "millesimo" (from mille), not "milesimo"
377
+ if (cardinalWord.endsWith('mila')) {
378
+ return cardinalWord.slice(0, -4) + 'mill' + ORDINAL_SUFFIX
379
+ }
380
+
381
+ // Handle "mille" ending (mille → millesimo)
382
+ if (cardinalWord.endsWith('mille')) {
383
+ return cardinalWord.slice(0, -1) + ORDINAL_SUFFIX
384
+ }
385
+
386
+ // Handle -ardo/-ardi endings (miliardo → miliardiesimo)
387
+ // These scale words get -iesimo not -esimo
388
+ if (cardinalWord.endsWith('ardo') || cardinalWord.endsWith('ardi')) {
389
+ return cardinalWord.slice(0, -1) + 'i' + ORDINAL_SUFFIX
390
+ }
391
+
392
+ // Drop final regular vowel before adding -esimo
393
+ const lastChar = cardinalWord.slice(-1)
394
+ if ('aeiouàèìòù'.includes(lastChar)) {
395
+ return cardinalWord.slice(0, -1) + ORDINAL_SUFFIX
396
+ }
397
+
398
+ // If doesn't end in vowel, just add suffix
399
+ return cardinalWord + ORDINAL_SUFFIX
400
+ }
401
+
402
+ /**
403
+ * Converts a positive integer to Italian ordinal words.
404
+ *
405
+ * @param {bigint} n - Positive integer
406
+ * @returns {string} Italian ordinal words (masculine form)
407
+ */
408
+ function integerToOrdinal (n) {
409
+ // Special cases: 1-10 have irregular forms
410
+ if (n <= 10n) {
411
+ return ORDINAL_ONES[Number(n)]
412
+ }
413
+
414
+ // For 11+, convert cardinal and apply -esimo
415
+ const cardinalWord = integerToWords(n)
416
+ return cardinalToOrdinal(cardinalWord)
417
+ }
418
+
419
+ /**
420
+ * Converts a numeric value to Italian ordinal words.
421
+ *
422
+ * Italian ordinals: primo, secondo, terzo... (1-10 irregular)
423
+ * For 11+: cardinal word (drop final vowel) + -esimo
424
+ *
425
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
426
+ * @returns {string} The number as ordinal words (masculine form)
427
+ * @throws {TypeError} If value is not a valid numeric type
428
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
429
+ *
430
+ * @example
431
+ * toOrdinal(1) // 'primo'
432
+ * toOrdinal(2) // 'secondo'
433
+ * toOrdinal(11) // 'undicesimo'
434
+ * toOrdinal(21) // 'ventunesimo'
435
+ * toOrdinal(100) // 'centesimo'
436
+ * toOrdinal(1000) // 'millesimo'
437
+ */
438
+ function toOrdinal (value) {
439
+ const integerPart = parseOrdinalValue(value)
440
+ return integerToOrdinal(integerPart)
441
+ }
442
+
443
+ // ============================================================================
444
+ // CURRENCY: toCurrency(value, options?)
445
+ // ============================================================================
446
+
447
+ /**
448
+ * Converts a numeric value to Italian currency words (Euro).
449
+ *
450
+ * @param {number | string | bigint} value - The currency amount to convert
451
+ * @param {Object} [options] - Optional configuration
452
+ * @param {boolean} [options.and=true] - Use "e" between euros and centesimi
453
+ * @returns {string} The amount in Italian currency words
454
+ * @throws {TypeError} If value is not a valid numeric type
455
+ * @throws {Error} If value is not a valid number format
456
+ *
457
+ * @example
458
+ * toCurrency(42.50) // 'quarantadue euro e cinquanta centesimi'
459
+ * toCurrency(1) // 'un euro'
460
+ * toCurrency(0.99) // 'novantanove centesimi'
461
+ * toCurrency(0.01) // 'un centesimo'
462
+ * toCurrency(42.50, { and: false }) // 'quarantadue euro cinquanta centesimi'
463
+ */
464
+ function toCurrency (value, options) {
465
+ options = validateOptions(options)
466
+ const { isNegative, dollars: euros, cents: centesimi } = parseCurrencyValue(value)
467
+ const { and: useAnd = true } = options
468
+
469
+ // Build result
470
+ let result = ''
471
+ if (isNegative) result = NEGATIVE + ' '
472
+
473
+ // Euros part
474
+ if (euros > 0n || centesimi === 0n) {
475
+ // Use "un" for 1 euro instead of "uno"
476
+ if (euros === 1n) {
477
+ result += 'un'
478
+ } else {
479
+ result += integerToWords(euros)
480
+ }
481
+ // Euro is invariable (doesn't change for plural in Italian)
482
+ result += ' ' + EURO
483
+ }
484
+
485
+ // Centesimi part
486
+ if (centesimi > 0n) {
487
+ if (euros > 0n) {
488
+ result += useAnd ? ' e ' : ' '
489
+ }
490
+ // Use "un" for 1 centesimo instead of "uno"
491
+ if (centesimi === 1n) {
492
+ result += 'un'
493
+ } else {
494
+ result += integerToWords(centesimi)
495
+ }
496
+ result += ' ' + (centesimi === 1n ? CENTESIMO : CENTESIMI)
497
+ }
498
+
499
+ return result
500
+ }
501
+
338
502
  // ============================================================================
339
503
  // Public API
340
504
  // ============================================================================
341
505
 
342
- export { toWords }
506
+ export { toCardinal, toOrdinal, toCurrency }
package/src/ja-JP.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Converts a numeric value to Japanese words.
3
+ *
4
+ * This is the main public API. It accepts any valid numeric input
5
+ * (number, string, or bigint) and handles parsing internally.
6
+ *
7
+ * @param {number | string | bigint} value - The numeric value to convert
8
+ * @returns {string} The number in Japanese kanji words
9
+ * @throws {TypeError} If value is not a valid numeric type
10
+ * @throws {Error} If value is not a valid number format
11
+ *
12
+ * @example
13
+ * toCardinal(42) // '四十二'
14
+ * toCardinal(10000) // '一万'
15
+ * toCardinal(100000000) // '一億'
16
+ */
17
+ export function toCardinal(value: number | string | bigint): string;
18
+ /**
19
+ * Converts a numeric value to Japanese ordinal words.
20
+ *
21
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
22
+ * @returns {string} The number as ordinal words
23
+ * @throws {TypeError} If value is not a valid numeric type
24
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
25
+ *
26
+ * @example
27
+ * toOrdinal(1) // '第一'
28
+ * toOrdinal(10) // '第十'
29
+ * toOrdinal(100) // '第百'
30
+ */
31
+ export function toOrdinal(value: number | string | bigint): string;
32
+ /**
33
+ * Converts a numeric value to Japanese currency words (Yen).
34
+ *
35
+ * Note: Sen (銭, 1/100 yen) is included for completeness but is rarely used
36
+ * in modern Japan. Most transactions are in whole yen.
37
+ *
38
+ * @param {number | string | bigint} value - The currency amount to convert
39
+ * @returns {string} The amount in Japanese currency words
40
+ * @throws {TypeError} If value is not a valid numeric type
41
+ * @throws {Error} If value is not a valid number format
42
+ *
43
+ * @example
44
+ * toCurrency(42) // '四十二円'
45
+ * toCurrency(1) // '一円'
46
+ * toCurrency(0.50) // '五十銭'
47
+ * toCurrency(42.50) // '四十二円五十銭'
48
+ */
49
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Japanese language converter - Functional Implementation
2
+ * Japanese (Japan) language converter
3
3
  *
4
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: ja-JP | Japanese as used in Japan
5
5
  *
6
6
  * Japanese-specific rules:
7
7
  * - Myriad (万-based) grouping: 4 digits per segment instead of 3
@@ -10,7 +10,9 @@
10
10
  * - No spaces between characters
11
11
  */
12
12
 
13
- import { parseNumericValue } from '../utils/parse-numeric.js'
13
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
14
+ import { parseCurrencyValue } from './utils/parse-currency.js'
15
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
14
16
 
15
17
  // ============================================================================
16
18
  // Vocabulary (module-level constants)
@@ -45,6 +47,23 @@ const ZERO = '零'
45
47
  const NEGATIVE = 'マイナス'
46
48
  const DECIMAL_SEP = '点'
47
49
 
50
+ // ============================================================================
51
+ // Ordinal Vocabulary
52
+ // ============================================================================
53
+
54
+ // Ordinal prefix
55
+ const ORDINAL_PREFIX = '第'
56
+
57
+ // ============================================================================
58
+ // Currency Vocabulary (Japanese Yen)
59
+ // ============================================================================
60
+
61
+ // Yen (main unit)
62
+ const YEN = '円'
63
+
64
+ // Sen (1/100 yen) - historically used, now rare
65
+ const SEN = '銭'
66
+
48
67
  // Internal scale words (within 4-digit segments)
49
68
  const TEN = '十'
50
69
  const HUNDRED = '百'
@@ -62,9 +81,9 @@ function buildSegment (n) {
62
81
  if (n === 0) return ''
63
82
 
64
83
  const ones = n % 10
65
- const tens = Math.floor(n / 10) % 10
66
- const hundreds = Math.floor(n / 100) % 10
67
- const thousands = Math.floor(n / 1000)
84
+ const tens = Math.trunc(n / 10) % 10
85
+ const hundreds = Math.trunc(n / 100) % 10
86
+ const thousands = Math.trunc(n / 1000)
68
87
 
69
88
  let result = ''
70
89
 
@@ -218,12 +237,12 @@ function decimalPartToWords (decimalPart) {
218
237
  * @throws {Error} If value is not a valid number format
219
238
  *
220
239
  * @example
221
- * toWords(42) // '四十二'
222
- * toWords(10000) // '一万'
223
- * toWords(100000000) // '一億'
240
+ * toCardinal(42) // '四十二'
241
+ * toCardinal(10000) // '一万'
242
+ * toCardinal(100000000) // '一億'
224
243
  */
225
- function toWords (value) {
226
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
244
+ function toCardinal (value) {
245
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
227
246
 
228
247
  let result = ''
229
248
 
@@ -240,8 +259,88 @@ function toWords (value) {
240
259
  return result
241
260
  }
242
261
 
262
+ // ============================================================================
263
+ // ORDINAL: toOrdinal(value)
264
+ // ============================================================================
265
+
266
+ /**
267
+ * Converts a positive integer to Japanese ordinal words.
268
+ *
269
+ * Japanese ordinals: 第 prefix + cardinal number.
270
+ *
271
+ * @param {bigint} n - Positive integer to convert
272
+ * @returns {string} Japanese ordinal words
273
+ */
274
+ function integerToOrdinal (n) {
275
+ return ORDINAL_PREFIX + integerToWords(n)
276
+ }
277
+
278
+ /**
279
+ * Converts a numeric value to Japanese ordinal words.
280
+ *
281
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
282
+ * @returns {string} The number as ordinal words
283
+ * @throws {TypeError} If value is not a valid numeric type
284
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
285
+ *
286
+ * @example
287
+ * toOrdinal(1) // '第一'
288
+ * toOrdinal(10) // '第十'
289
+ * toOrdinal(100) // '第百'
290
+ */
291
+ function toOrdinal (value) {
292
+ const integerPart = parseOrdinalValue(value)
293
+ return integerToOrdinal(integerPart)
294
+ }
295
+
296
+ // ============================================================================
297
+ // CURRENCY: toCurrency(value, options?)
298
+ // ============================================================================
299
+
300
+ /**
301
+ * Converts a numeric value to Japanese currency words (Yen).
302
+ *
303
+ * Note: Sen (銭, 1/100 yen) is included for completeness but is rarely used
304
+ * in modern Japan. Most transactions are in whole yen.
305
+ *
306
+ * @param {number | string | bigint} value - The currency amount to convert
307
+ * @returns {string} The amount in Japanese currency words
308
+ * @throws {TypeError} If value is not a valid numeric type
309
+ * @throws {Error} If value is not a valid number format
310
+ *
311
+ * @example
312
+ * toCurrency(42) // '四十二円'
313
+ * toCurrency(1) // '一円'
314
+ * toCurrency(0.50) // '五十銭'
315
+ * toCurrency(42.50) // '四十二円五十銭'
316
+ */
317
+ function toCurrency (value) {
318
+ const { isNegative, dollars: yen, cents: sen } = parseCurrencyValue(value)
319
+
320
+ // Build result
321
+ let result = ''
322
+ if (isNegative) result = NEGATIVE
323
+
324
+ // Yen part
325
+ if (yen > 0n) {
326
+ result += integerToWords(yen) + YEN
327
+ }
328
+
329
+ // Sen part (1/100 yen)
330
+ if (sen > 0n) {
331
+ result += integerToWords(sen) + SEN
332
+ }
333
+
334
+ // Handle zero case
335
+ if (yen === 0n && sen === 0n) {
336
+ result += ZERO + YEN
337
+ }
338
+
339
+ return result
340
+ }
341
+
243
342
  // ============================================================================
244
343
  // Public API
245
344
  // ============================================================================
246
345
 
247
- export { toWords }
346
+ export { toCardinal, toOrdinal, toCurrency }
package/src/ka-GE.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Converts a numeric value to Georgian words.
3
+ *
4
+ * This is the main public API. It accepts any valid numeric input
5
+ * (number, string, or bigint) and handles parsing internally.
6
+ *
7
+ * @param {number | string | bigint} value - The numeric value to convert
8
+ * @returns {string} The number in Georgian words
9
+ * @throws {TypeError} If value is not a valid numeric type
10
+ * @throws {Error} If value is not a valid number format
11
+ *
12
+ * @example
13
+ * toCardinal(21) // 'ოცდაერთი'
14
+ * toCardinal(100) // 'ასი'
15
+ * toCardinal(1000) // 'ათასი'
16
+ */
17
+ export function toCardinal(value: number | string | bigint): string;
18
+ /**
19
+ * Converts a numeric value to Georgian ordinal words.
20
+ *
21
+ * @param {number | string | bigint} value - The numeric value to convert
22
+ * @returns {string} The ordinal in Georgian words
23
+ * @throws {TypeError} If value is not a valid numeric type
24
+ * @throws {Error} If value is not a positive integer
25
+ *
26
+ * @example
27
+ * toOrdinal(1) // 'პირველი'
28
+ * toOrdinal(10) // 'მეათე'
29
+ * toOrdinal(21) // 'მეოცდაერთე'
30
+ */
31
+ export function toOrdinal(value: number | string | bigint): string;
32
+ /**
33
+ * Converts a numeric value to Georgian Lari currency words.
34
+ *
35
+ * @param {number | string | bigint} value - The numeric value to convert
36
+ * @returns {string} The currency in Georgian words
37
+ * @throws {TypeError} If value is not a valid numeric type
38
+ * @throws {Error} If value is not a valid number format
39
+ *
40
+ * @example
41
+ * toCurrency(1) // 'ერთი ლარი'
42
+ * toCurrency(2.50) // 'ორი ლარი ორმოცდაათი თეთრი'
43
+ */
44
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Georgian language converter - Functional Implementation
2
+ * Georgian (Georgia) language converter
3
3
  *
4
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: ka-GE | Georgian as used in Georgia
5
5
  *
6
6
  * Georgian-specific rules:
7
7
  * - Vigesimal (base-20) system for 20-99
@@ -12,7 +12,9 @@
12
12
  * - Short scale for large numbers (მილიონი, მილიარდი, ტრილიონი)
13
13
  */
14
14
 
15
- import { parseNumericValue } from '../utils/parse-numeric.js'
15
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
16
+ import { parseCurrencyValue } from './utils/parse-currency.js'
17
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
16
18
 
17
19
  // ============================================================================
18
20
  // Vocabulary (module-level constants)
@@ -43,6 +45,16 @@ const ZERO = 'ნული'
43
45
  const NEGATIVE = 'მინუს'
44
46
  const DECIMAL_SEP = 'მთელი'
45
47
 
48
+ // Ordinal suffix (Georgian adds -ე to form ordinals)
49
+ const ORDINAL_SUFFIX = 'ე'
50
+
51
+ // Ordinal forms for 1-9 (these are special)
52
+ const ORDINAL_ONES = ['', 'პირველი', 'მეორე', 'მესამე', 'მეოთხე', 'მეხუთე', 'მეექვსე', 'მეშვიდე', 'მერვე', 'მეცხრე']
53
+
54
+ // Currency (Georgian Lari)
55
+ const LARI = 'ლარი'
56
+ const TETRI = 'თეთრი'
57
+
46
58
  // ============================================================================
47
59
  // Segment Building
48
60
  // ============================================================================
@@ -56,7 +68,7 @@ function buildTens (n) {
56
68
  if (n < 10) return ONES[n]
57
69
  if (n < 20) return TEENS[n - 10]
58
70
 
59
- const vigesimalGroup = Math.floor(n / 20)
71
+ const vigesimalGroup = Math.trunc(n / 20)
60
72
  const remainder = n % 20
61
73
 
62
74
  if (remainder === 0) {
@@ -87,7 +99,7 @@ function buildSegment (n) {
87
99
  return { full: word, stem }
88
100
  }
89
101
 
90
- const hundreds = Math.floor(n / 100)
102
+ const hundreds = Math.trunc(n / 100)
91
103
  const remainder = n % 100
92
104
 
93
105
  // Build hundreds: ასი (100), ორასი (200), etc.
@@ -262,12 +274,12 @@ function decimalPartToWords (decimalPart) {
262
274
  * @throws {Error} If value is not a valid number format
263
275
  *
264
276
  * @example
265
- * toWords(21) // 'ოცდაერთი'
266
- * toWords(100) // 'ასი'
267
- * toWords(1000) // 'ათასი'
277
+ * toCardinal(21) // 'ოცდაერთი'
278
+ * toCardinal(100) // 'ასი'
279
+ * toCardinal(1000) // 'ათასი'
268
280
  */
269
- function toWords (value) {
270
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
281
+ function toCardinal (value) {
282
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
271
283
 
272
284
  let result = ''
273
285
 
@@ -284,8 +296,98 @@ function toWords (value) {
284
296
  return result
285
297
  }
286
298
 
299
+ // ============================================================================
300
+ // Ordinal Functions
301
+ // ============================================================================
302
+
303
+ /**
304
+ * Converts a non-negative integer to Georgian ordinal words.
305
+ * Georgian ordinals are formed by:
306
+ * - 1-9: special forms (პირველი, მეორე, მესამე, etc.)
307
+ * - 10+: მე- prefix + cardinal + -ე suffix
308
+ *
309
+ * @param {bigint} n - Non-negative integer to convert
310
+ * @returns {string} Georgian ordinal words
311
+ */
312
+ function integerToOrdinal (n) {
313
+ if (n === 0n) return ''
314
+ if (n <= 9n) return ORDINAL_ONES[Number(n)]
315
+
316
+ // For 10+, use მე- + cardinal stem + -ე
317
+ const cardinal = integerToWords(n)
318
+
319
+ // Remove final vowel and add -ე suffix
320
+ const lastChar = cardinal.slice(-1)
321
+ let stem
322
+ if (lastChar === 'ი' || lastChar === 'ა') {
323
+ stem = cardinal.slice(0, -1)
324
+ } else {
325
+ stem = cardinal
326
+ }
327
+
328
+ return 'მე' + stem + ORDINAL_SUFFIX
329
+ }
330
+
331
+ /**
332
+ * Converts a numeric value to Georgian ordinal words.
333
+ *
334
+ * @param {number | string | bigint} value - The numeric value to convert
335
+ * @returns {string} The ordinal in Georgian words
336
+ * @throws {TypeError} If value is not a valid numeric type
337
+ * @throws {Error} If value is not a positive integer
338
+ *
339
+ * @example
340
+ * toOrdinal(1) // 'პირველი'
341
+ * toOrdinal(10) // 'მეათე'
342
+ * toOrdinal(21) // 'მეოცდაერთე'
343
+ */
344
+ function toOrdinal (value) {
345
+ const n = parseOrdinalValue(value)
346
+ return integerToOrdinal(n)
347
+ }
348
+
349
+ // ============================================================================
350
+ // Currency Functions
351
+ // ============================================================================
352
+
353
+ /**
354
+ * Converts a numeric value to Georgian Lari currency words.
355
+ *
356
+ * @param {number | string | bigint} value - The numeric value to convert
357
+ * @returns {string} The currency in Georgian words
358
+ * @throws {TypeError} If value is not a valid numeric type
359
+ * @throws {Error} If value is not a valid number format
360
+ *
361
+ * @example
362
+ * toCurrency(1) // 'ერთი ლარი'
363
+ * toCurrency(2.50) // 'ორი ლარი ორმოცდაათი თეთრი'
364
+ */
365
+ function toCurrency (value) {
366
+ const { isNegative, dollars, cents } = parseCurrencyValue(value)
367
+
368
+ const parts = []
369
+
370
+ if (isNegative) {
371
+ parts.push(NEGATIVE)
372
+ }
373
+
374
+ // Lari
375
+ if (dollars > 0n || cents === 0n) {
376
+ const lariWord = integerToWords(dollars)
377
+ parts.push(lariWord + ' ' + LARI)
378
+ }
379
+
380
+ // Tetri
381
+ if (cents > 0n) {
382
+ const tetriWord = integerToWords(cents)
383
+ parts.push(tetriWord + ' ' + TETRI)
384
+ }
385
+
386
+ return parts.join(' ')
387
+ }
388
+
287
389
  // ============================================================================
288
390
  // Public API
289
391
  // ============================================================================
290
392
 
291
- export { toWords }
393
+ export { toCardinal, toOrdinal, toCurrency }