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,13 +1,9 @@
1
1
  /**
2
- * Czech language converter - Functional Implementation
2
+ * Czech (Czechia) language converter
3
3
  *
4
- * A performance-optimized number-to-words converter using precomputed lookup tables.
5
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: cs-CZ | Czech as used in Czechia
6
5
  *
7
- * Key optimization: Precompute all segment values (0-999) at module load.
8
- * This eliminates all per-call string manipulation for segment conversion.
9
- *
10
- * Czech-specific rules (handled in precomputation):
6
+ * Czech-specific rules:
11
7
  * - Three-form pluralization: 1 = singular, 2-4 = few, 5+ = many
12
8
  * - Irregular hundreds: sto, dvě stě, tři sta, čtyři sta, pět set...
13
9
  * - Gender: dva (masc) vs dvě (fem) for 2
@@ -15,7 +11,9 @@
15
11
  * - Dynamic decimal separator: celá/celé/celých based on integer
16
12
  */
17
13
 
18
- import { parseNumericValue } from '../utils/parse-numeric.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'
19
17
 
20
18
  // ============================================================================
21
19
  // Vocabulary (module-level constants)
@@ -50,19 +48,46 @@ const ZERO = 'nula'
50
48
  const NEGATIVE = 'mínus'
51
49
 
52
50
  // ============================================================================
53
- // Precomputed Lookup Tables (built once at module load)
51
+ // Ordinal Vocabulary
52
+ // ============================================================================
53
+
54
+ // Czech ordinals (masculine nominative singular)
55
+ const ORDINAL_ONES = ['', 'první', 'druhý', 'třetí', 'čtvrtý', 'pátý', 'šestý', 'sedmý', 'osmý', 'devátý']
56
+
57
+ // Ordinal teens
58
+ const ORDINAL_TEENS = ['desátý', 'jedenáctý', 'dvanáctý', 'třináctý', 'čtrnáctý', 'patnáctý', 'šestnáctý', 'sedmnáctý', 'osmnáctý', 'devatenáctý']
59
+
60
+ // Ordinal tens (for exact tens)
61
+ const ORDINAL_TENS = ['', '', 'dvacátý', 'třicátý', 'čtyřicátý', 'padesátý', 'šedesátý', 'sedmdesátý', 'osmdesátý', 'devadesátý']
62
+
63
+ // Ordinal hundreds (for exact hundreds)
64
+ const ORDINAL_HUNDREDS = ['', 'stý', 'dvoustý', 'třístý', 'čtyřstý', 'pětistý', 'šestistý', 'sedmistý', 'osmistý', 'devítistý']
65
+
66
+ // Scale ordinals
67
+ const ORDINAL_SCALES = ['tisící', 'miliontý', 'miliardtý', 'biliontý']
68
+
69
+ // ============================================================================
70
+ // Currency Vocabulary (Czech Koruna)
71
+ // ============================================================================
72
+
73
+ // Koruna forms: [singular, few (2-4), many (5+)]
74
+ const KORUNA_FORMS = ['koruna', 'koruny', 'korun']
75
+ // Haléř forms: [singular, few (2-4), many (5+)]
76
+ const HALER_FORMS = ['haléř', 'haléře', 'haléřů']
77
+
78
+ // ============================================================================
79
+ // Segment Building
54
80
  // ============================================================================
55
81
 
56
82
  /**
57
83
  * Builds segment word for 0-999 (masculine, default form).
58
- * Only used during table construction.
59
84
  */
60
85
  function buildSegment (n) {
61
86
  if (n === 0) return ''
62
87
 
63
88
  const ones = n % 10
64
- const tens = Math.floor(n / 10) % 10
65
- const hundreds = Math.floor(n / 100)
89
+ const tens = Math.trunc(n / 10) % 10
90
+ const hundreds = Math.trunc(n / 100)
66
91
 
67
92
  const parts = []
68
93
 
@@ -95,8 +120,8 @@ function buildSegmentWithHundreds (n) {
95
120
  if (n === 0) return ''
96
121
 
97
122
  const ones = n % 10
98
- const tens = Math.floor(n / 10) % 10
99
- const hundreds = Math.floor(n / 100)
123
+ const tens = Math.trunc(n / 10) % 10
124
+ const hundreds = Math.trunc(n / 100)
100
125
 
101
126
  const parts = []
102
127
 
@@ -120,18 +145,6 @@ function buildSegmentWithHundreds (n) {
120
145
  return parts.join(' ')
121
146
  }
122
147
 
123
- // Precompute all 1000 segment words (0-999) - masculine form
124
- const SEGMENTS = new Array(1000)
125
- for (let i = 0; i < 1000; i++) {
126
- SEGMENTS[i] = buildSegment(i)
127
- }
128
-
129
- // Precompute all 1000 segment words with hundreds (irregular hundreds forms)
130
- const SEGMENTS_WITH_HUNDREDS = new Array(1000)
131
- for (let i = 0; i < 1000; i++) {
132
- SEGMENTS_WITH_HUNDREDS[i] = buildSegmentWithHundreds(i)
133
- }
134
-
135
148
  // ============================================================================
136
149
  // Helper Functions
137
150
  // ============================================================================
@@ -185,9 +198,9 @@ function getDecimalSeparator (integerPart) {
185
198
  function integerToWords (n) {
186
199
  if (n === 0n) return ZERO
187
200
 
188
- // Fast path: numbers < 1000 (direct lookup)
201
+ // Fast path: numbers < 1000
189
202
  if (n < 1000n) {
190
- return SEGMENTS[Number(n)]
203
+ return buildSegment(Number(n))
191
204
  }
192
205
 
193
206
  // Fast path: numbers < 1,000,000 (thousands)
@@ -202,12 +215,12 @@ function integerToWords (n) {
202
215
  // Omit "one" before tisíc
203
216
  result = scaleWord
204
217
  } else {
205
- result = SEGMENTS[Number(thousands)] + ' ' + scaleWord
218
+ result = buildSegment(Number(thousands)) + ' ' + scaleWord
206
219
  }
207
220
 
208
221
  if (remainder > 0) {
209
222
  // Use form with irregular hundreds (for "dvě stě" etc.)
210
- result += ' ' + SEGMENTS_WITH_HUNDREDS[remainder]
223
+ result += ' ' + buildSegmentWithHundreds(remainder)
211
224
  }
212
225
 
213
226
  return result
@@ -245,7 +258,7 @@ function buildLargeNumberWords (n) {
245
258
 
246
259
  if (i === 0) {
247
260
  // Units segment (no scale word) - use form with irregular hundreds
248
- result += SEGMENTS_WITH_HUNDREDS[Number(segment)]
261
+ result += buildSegmentWithHundreds(Number(segment))
249
262
  } else {
250
263
  // Scale word needed
251
264
  const forms = PLURAL_FORMS[i]
@@ -257,11 +270,11 @@ function buildLargeNumberWords (n) {
257
270
  result += scaleWord
258
271
  } else {
259
272
  // Use masculine form for multiplier before scale words
260
- result += SEGMENTS[Number(segment)] + ' ' + scaleWord
273
+ result += buildSegment(Number(segment)) + ' ' + scaleWord
261
274
  }
262
275
  } else {
263
276
  // Fallback for very large scales without defined forms
264
- result += SEGMENTS[Number(segment)]
277
+ result += buildSegment(Number(segment))
265
278
  }
266
279
  }
267
280
  }
@@ -308,13 +321,13 @@ function decimalPartToWords (decimalPart) {
308
321
  * @throws {Error} If value is not a valid number format
309
322
  *
310
323
  * @example
311
- * toWords(21) // 'dvacet jedna'
312
- * toWords(1000) // 'tisíc'
313
- * toWords(2000) // 'dva tisíce'
314
- * toWords(5000) // 'pět tisíc'
324
+ * toCardinal(21) // 'dvacet jedna'
325
+ * toCardinal(1000) // 'tisíc'
326
+ * toCardinal(2000) // 'dva tisíce'
327
+ * toCardinal(5000) // 'pět tisíc'
315
328
  */
316
- function toWords (value) {
317
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
329
+ function toCardinal (value) {
330
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
318
331
 
319
332
  let result = ''
320
333
 
@@ -332,8 +345,204 @@ function toWords (value) {
332
345
  return result
333
346
  }
334
347
 
348
+ // ============================================================================
349
+ // ORDINAL: toOrdinal(value)
350
+ // ============================================================================
351
+
352
+ /**
353
+ * Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
354
+ *
355
+ * @param {number} n - Number 0-99
356
+ * @returns {string} Ordinal words
357
+ */
358
+ function buildOrdinalTensOnes (n) {
359
+ if (n === 0) return ''
360
+
361
+ const onesDigit = n % 10
362
+ const tensDigit = Math.trunc(n / 10)
363
+
364
+ if (tensDigit === 0) {
365
+ return ORDINAL_ONES[onesDigit]
366
+ }
367
+
368
+ if (tensDigit === 1) {
369
+ return ORDINAL_TEENS[onesDigit]
370
+ }
371
+
372
+ if (onesDigit === 0) {
373
+ return ORDINAL_TENS[tensDigit]
374
+ }
375
+
376
+ return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
377
+ }
378
+
379
+ /**
380
+ * Converts a positive integer to Czech ordinal words (masculine nominative).
381
+ *
382
+ * @param {bigint} n - Positive integer to convert
383
+ * @returns {string} Ordinal Czech words
384
+ */
385
+ function integerToOrdinal (n) {
386
+ if (n < 100n) {
387
+ return buildOrdinalTensOnes(Number(n))
388
+ }
389
+
390
+ if (n < 1000n) {
391
+ const num = Number(n)
392
+ const hundredsDigit = Math.trunc(num / 100)
393
+ const remainder = num % 100
394
+
395
+ if (remainder === 0) {
396
+ return ORDINAL_HUNDREDS[hundredsDigit]
397
+ }
398
+
399
+ return HUNDREDS[hundredsDigit] + ' ' + buildOrdinalTensOnes(remainder)
400
+ }
401
+
402
+ if (n < 1_000_000n) {
403
+ const thousands = Number(n / 1000n)
404
+ const remainder = Number(n % 1000n)
405
+
406
+ if (remainder === 0) {
407
+ if (thousands === 1) {
408
+ return ORDINAL_SCALES[0]
409
+ }
410
+ return buildSegment(thousands) + ' ' + ORDINAL_SCALES[0]
411
+ }
412
+
413
+ const scaleWord = pluralize(BigInt(thousands), PLURAL_FORMS[1])
414
+ const thousandsWord = thousands === 1 ? '' : buildSegment(thousands) + ' '
415
+ return (thousands === 1 ? 'tisíc' : thousandsWord + scaleWord) + ' ' + integerToOrdinal(BigInt(remainder))
416
+ }
417
+
418
+ return buildLargeOrdinal(n)
419
+ }
420
+
421
+ /**
422
+ * Builds ordinal words for numbers >= 1,000,000.
423
+ *
424
+ * @param {bigint} n - Number >= 1,000,000
425
+ * @returns {string} Ordinal Czech words
426
+ */
427
+ function buildLargeOrdinal (n) {
428
+ const segmentValues = []
429
+ let temp = n
430
+ while (temp > 0n) {
431
+ segmentValues.push(temp % 1000n)
432
+ temp = temp / 1000n
433
+ }
434
+
435
+ let lastNonZeroIdx = 0
436
+ for (let i = 0; i < segmentValues.length; i++) {
437
+ if (segmentValues[i] !== 0n) {
438
+ lastNonZeroIdx = i
439
+ }
440
+ }
441
+
442
+ const parts = []
443
+
444
+ for (let i = segmentValues.length - 1; i >= 0; i--) {
445
+ const segment = segmentValues[i]
446
+ if (segment === 0n) continue
447
+
448
+ const isLastNonZero = (i === lastNonZeroIdx)
449
+
450
+ if (i === 0) {
451
+ if (isLastNonZero) {
452
+ parts.push(integerToOrdinal(segment))
453
+ } else {
454
+ parts.push(buildSegmentWithHundreds(Number(segment)))
455
+ }
456
+ } else {
457
+ if (isLastNonZero) {
458
+ if (segment === 1n) {
459
+ parts.push(ORDINAL_SCALES[i - 1] || PLURAL_FORMS[i][0])
460
+ } else {
461
+ parts.push(buildSegment(Number(segment)) + ' ' + (ORDINAL_SCALES[i - 1] || PLURAL_FORMS[i][0]))
462
+ }
463
+ } else {
464
+ const forms = PLURAL_FORMS[i]
465
+ if (forms) {
466
+ const scaleWord = pluralize(segment, forms)
467
+ if (segment === 1n) {
468
+ parts.push(scaleWord)
469
+ } else {
470
+ parts.push(buildSegment(Number(segment)) + ' ' + scaleWord)
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
476
+
477
+ return parts.join(' ')
478
+ }
479
+
480
+ /**
481
+ * Converts a numeric value to Czech ordinal words (masculine nominative).
482
+ *
483
+ * @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
484
+ * @returns {string} The number as ordinal words
485
+ * @throws {TypeError} If value is not a valid numeric type
486
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
487
+ *
488
+ * @example
489
+ * toOrdinal(1) // 'první'
490
+ * toOrdinal(2) // 'druhý'
491
+ * toOrdinal(21) // 'dvacet první'
492
+ * toOrdinal(100) // 'stý'
493
+ * toOrdinal(1000) // 'tisící'
494
+ */
495
+ function toOrdinal (value) {
496
+ const integerPart = parseOrdinalValue(value)
497
+ return integerToOrdinal(integerPart)
498
+ }
499
+
500
+ // ============================================================================
501
+ // CURRENCY: toCurrency(value)
502
+ // ============================================================================
503
+
504
+ /**
505
+ * Converts a numeric value to Czech currency words (Koruna).
506
+ *
507
+ * @param {number | string | bigint} value - The currency amount to convert
508
+ * @returns {string} The amount in Czech currency words
509
+ * @throws {TypeError} If value is not a valid numeric type
510
+ * @throws {Error} If value is not a valid number format
511
+ *
512
+ * @example
513
+ * toCurrency(42) // 'čtyřicet dva koruny'
514
+ * toCurrency(1) // 'jedna koruna'
515
+ * toCurrency(1.50) // 'jedna koruna padesát haléřů'
516
+ * toCurrency(-5) // 'mínus pět korun'
517
+ */
518
+ function toCurrency (value) {
519
+ const { isNegative, dollars: koruny, cents: halere } = parseCurrencyValue(value)
520
+
521
+ let result = ''
522
+ if (isNegative) {
523
+ result = NEGATIVE + ' '
524
+ }
525
+
526
+ // Koruna part
527
+ if (koruny > 0n || halere === 0n) {
528
+ result += integerToWords(koruny)
529
+ result += ' ' + pluralize(koruny, KORUNA_FORMS)
530
+ }
531
+
532
+ // Haléř part
533
+ if (halere > 0n) {
534
+ if (koruny > 0n) {
535
+ result += ' '
536
+ }
537
+ result += integerToWords(halere)
538
+ result += ' ' + pluralize(halere, HALER_FORMS)
539
+ }
540
+
541
+ return result
542
+ }
543
+
335
544
  // ============================================================================
336
545
  // Public API
337
546
  // ============================================================================
338
547
 
339
- export { toWords }
548
+ export { toCardinal, toOrdinal, toCurrency }
package/src/da-DK.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Converts a numeric value to Danish words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Danish words
6
+ * @throws {TypeError} If value is not a valid numeric type
7
+ * @throws {Error} If value is not a valid number format
8
+ *
9
+ * @example
10
+ * toCardinal(21) // 'enogtyve'
11
+ * toCardinal(1000) // 'ettusind'
12
+ * toCardinal(1000000) // 'en millioner'
13
+ */
14
+ export function toCardinal(value: number | string | bigint): string;
15
+ /**
16
+ * Converts a numeric value to Danish ordinal words.
17
+ *
18
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
19
+ * @returns {string} The number as ordinal words
20
+ * @throws {TypeError} If value is not a valid numeric type
21
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
22
+ *
23
+ * @example
24
+ * toOrdinal(1) // 'første'
25
+ * toOrdinal(2) // 'anden'
26
+ * toOrdinal(21) // 'enogtyvede'
27
+ */
28
+ export function toOrdinal(value: number | string | bigint): string;
29
+ /**
30
+ * Converts a numeric value to Danish currency words (Danish Krone).
31
+ *
32
+ * Uses krone/kroner and øre (100 øre = 1 krone).
33
+ *
34
+ * @param {number | string | bigint} value - The currency amount to convert
35
+ * @returns {string} The amount in Danish currency words
36
+ * @throws {TypeError} If value is not a valid numeric type
37
+ * @throws {Error} If value is not a valid number format
38
+ *
39
+ * @example
40
+ * toCurrency(1) // 'en krone'
41
+ * toCurrency(42) // 'toogfyrre kroner'
42
+ * toCurrency(1.50) // 'en krone og halvtreds øre'
43
+ */
44
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Danish language converter - Functional Implementation
2
+ * Danish (Denmark) language converter
3
3
  *
4
- * A performance-optimized number-to-words converter using precomputed lookup tables.
4
+ * CLDR: da-DK | Danish as used in Denmark
5
5
  *
6
6
  * Key features:
7
7
  * - Vigesimal (base-20) tens naming: halvtreds (50), treds (60), etc.
@@ -11,7 +11,9 @@
11
11
  * - Long scale for millions+
12
12
  */
13
13
 
14
- import { parseNumericValue } from '../utils/parse-numeric.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'
15
17
 
16
18
  // ============================================================================
17
19
  // Vocabulary (module-level constants)
@@ -37,7 +39,36 @@ const DECIMAL_SEP = 'komma'
37
39
  const SCALES = ['millioner', 'millarder', 'billioner', 'billarder', 'trillioner', 'trillarder', 'quadrillioner', 'quadrillarder']
38
40
 
39
41
  // ============================================================================
40
- // Precomputed Lookup Tables (built once at module load)
42
+ // Ordinal Vocabulary
43
+ // ============================================================================
44
+
45
+ // Danish ordinals: 1st-2nd special, others use -te/-nde suffix
46
+ // "anden/andet" for 2nd (common/neuter), we use common form
47
+ const ORDINAL_SPECIAL = {
48
+ 1: 'første',
49
+ 2: 'anden',
50
+ 3: 'tredje',
51
+ 4: 'fjerde',
52
+ 5: 'femte',
53
+ 6: 'sjette',
54
+ 7: 'syvende',
55
+ 8: 'ottende',
56
+ 9: 'niende',
57
+ 10: 'tiende',
58
+ 11: 'ellevte',
59
+ 12: 'tolvte'
60
+ }
61
+
62
+ // ============================================================================
63
+ // Currency Vocabulary (Danish Krone)
64
+ // ============================================================================
65
+
66
+ const KRONE = 'krone'
67
+ const KRONER = 'kroner' // plural
68
+ const ORE = 'øre' // same singular and plural
69
+
70
+ // ============================================================================
71
+ // Segment Building
41
72
  // ============================================================================
42
73
 
43
74
  /**
@@ -47,8 +78,8 @@ function buildSegment (n) {
47
78
  if (n === 0) return ''
48
79
 
49
80
  const ones = n % 10
50
- const tens = Math.floor(n / 10) % 10
51
- const hundreds = Math.floor(n / 100)
81
+ const tens = Math.trunc(n / 10) % 10
82
+ const hundreds = Math.trunc(n / 100)
52
83
 
53
84
  const parts = []
54
85
 
@@ -83,13 +114,6 @@ function buildSegment (n) {
83
114
  return parts[0] || ''
84
115
  }
85
116
 
86
- // Precompute all 1000 segment words (0-999)
87
- const SEGMENTS = new Array(1000)
88
-
89
- for (let i = 0; i < 1000; i++) {
90
- SEGMENTS[i] = buildSegment(i)
91
- }
92
-
93
117
  // ============================================================================
94
118
  // Conversion Functions
95
119
  // ============================================================================
@@ -105,7 +129,7 @@ function integerToWords (n) {
105
129
 
106
130
  // Fast path: numbers < 1000 (direct lookup)
107
131
  if (n < 1000n) {
108
- return SEGMENTS[Number(n)]
132
+ return buildSegment(Number(n))
109
133
  }
110
134
 
111
135
  // Fast path: numbers < 1,000,000 (thousands)
@@ -114,11 +138,11 @@ function integerToWords (n) {
114
138
  const remainder = Number(n % 1000n)
115
139
 
116
140
  // Compound thousands: "ettusind", "firetusind"
117
- let result = SEGMENTS[thousands] + THOUSAND
141
+ let result = buildSegment(thousands) + THOUSAND
118
142
 
119
143
  if (remainder > 0) {
120
144
  // Add 'e' suffix and " og " for remainder: "firetusinde og ..."
121
- result += 'e og ' + SEGMENTS[remainder]
145
+ result += 'e og ' + buildSegment(remainder)
122
146
  }
123
147
 
124
148
  return result
@@ -162,7 +186,7 @@ function buildLargeNumberWords (n) {
162
186
  const segment = segments[i]
163
187
 
164
188
  if (segment !== 0) {
165
- const segmentWord = SEGMENTS[segment]
189
+ const segmentWord = buildSegment(segment)
166
190
 
167
191
  if (scaleIndex === 0) {
168
192
  // Units segment
@@ -266,12 +290,12 @@ function decimalPartToWords (decimalPart) {
266
290
  * @throws {Error} If value is not a valid number format
267
291
  *
268
292
  * @example
269
- * toWords(21) // 'enogtyve'
270
- * toWords(1000) // 'ettusind'
271
- * toWords(1000000) // 'en millioner'
293
+ * toCardinal(21) // 'enogtyve'
294
+ * toCardinal(1000) // 'ettusind'
295
+ * toCardinal(1000000) // 'en millioner'
272
296
  */
273
- function toWords (value) {
274
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
297
+ function toCardinal (value) {
298
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
275
299
 
276
300
  let result = ''
277
301
 
@@ -288,8 +312,97 @@ function toWords (value) {
288
312
  return result
289
313
  }
290
314
 
315
+ // ============================================================================
316
+ // ORDINAL: toOrdinal(value)
317
+ // ============================================================================
318
+
319
+ /**
320
+ * Converts a non-negative integer to Danish ordinal words.
321
+ *
322
+ * Danish ordinals: første (1st), anden (2nd), tredje (3rd), etc.
323
+ * 1-12 have special forms, others use cardinal + -de/-nde suffix.
324
+ *
325
+ * @param {bigint} n - Positive integer to convert
326
+ * @returns {string} Danish ordinal words
327
+ */
328
+ function integerToOrdinal (n) {
329
+ // Special forms for 1-12
330
+ if (n >= 1n && n <= 12n) {
331
+ return ORDINAL_SPECIAL[Number(n)]
332
+ }
333
+
334
+ // For numbers > 12, add -de suffix to cardinal
335
+ const cardinal = integerToWords(n)
336
+ return cardinal + 'de'
337
+ }
338
+
339
+ /**
340
+ * Converts a numeric value to Danish ordinal words.
341
+ *
342
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
343
+ * @returns {string} The number as ordinal words
344
+ * @throws {TypeError} If value is not a valid numeric type
345
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
346
+ *
347
+ * @example
348
+ * toOrdinal(1) // 'første'
349
+ * toOrdinal(2) // 'anden'
350
+ * toOrdinal(21) // 'enogtyvede'
351
+ */
352
+ function toOrdinal (value) {
353
+ const integerPart = parseOrdinalValue(value)
354
+ return integerToOrdinal(integerPart)
355
+ }
356
+
357
+ // ============================================================================
358
+ // CURRENCY: toCurrency(value)
359
+ // ============================================================================
360
+
361
+ /**
362
+ * Converts a numeric value to Danish currency words (Danish Krone).
363
+ *
364
+ * Uses krone/kroner and øre (100 øre = 1 krone).
365
+ *
366
+ * @param {number | string | bigint} value - The currency amount to convert
367
+ * @returns {string} The amount in Danish currency words
368
+ * @throws {TypeError} If value is not a valid numeric type
369
+ * @throws {Error} If value is not a valid number format
370
+ *
371
+ * @example
372
+ * toCurrency(1) // 'en krone'
373
+ * toCurrency(42) // 'toogfyrre kroner'
374
+ * toCurrency(1.50) // 'en krone og halvtreds øre'
375
+ */
376
+ function toCurrency (value) {
377
+ const { isNegative, dollars: kroner, cents: ore } = parseCurrencyValue(value)
378
+
379
+ let result = ''
380
+ if (isNegative) {
381
+ result = NEGATIVE + ' '
382
+ }
383
+
384
+ // Kroner part - use "en" for 1 krone
385
+ if (kroner > 0n || ore === 0n) {
386
+ if (kroner === 1n) {
387
+ result += 'en ' + KRONE
388
+ } else {
389
+ result += integerToWords(kroner) + ' ' + KRONER
390
+ }
391
+ }
392
+
393
+ // Øre part
394
+ if (ore > 0n) {
395
+ if (kroner > 0n) {
396
+ result += ' og '
397
+ }
398
+ result += integerToWords(ore) + ' ' + ORE
399
+ }
400
+
401
+ return result
402
+ }
403
+
291
404
  // ============================================================================
292
405
  // Public API
293
406
  // ============================================================================
294
407
 
295
- export { toWords }
408
+ export { toCardinal, toOrdinal, toCurrency }