n2words 3.1.0 → 5.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 (486) hide show
  1. package/CHANGELOG.md +51 -40
  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-BR.js +2 -0
  113. package/dist/pt-BR.umd.js +2 -0
  114. package/dist/pt-PT.js +2 -0
  115. package/dist/pt-PT.umd.js +2 -0
  116. package/dist/ro-RO.js +2 -0
  117. package/dist/ro-RO.umd.js +2 -0
  118. package/dist/ru-RU.js +2 -0
  119. package/dist/ru-RU.umd.js +2 -0
  120. package/dist/sr-Cyrl-RS.js +2 -0
  121. package/dist/sr-Cyrl-RS.umd.js +2 -0
  122. package/dist/sr-Latn-RS.js +2 -0
  123. package/dist/sr-Latn-RS.umd.js +2 -0
  124. package/dist/sv-SE.js +2 -0
  125. package/dist/sv-SE.umd.js +2 -0
  126. package/dist/sw-KE.js +2 -0
  127. package/dist/sw-KE.umd.js +2 -0
  128. package/dist/ta-IN.js +2 -0
  129. package/dist/ta-IN.umd.js +2 -0
  130. package/dist/te-IN.js +2 -0
  131. package/dist/te-IN.umd.js +2 -0
  132. package/dist/th-TH.js +2 -0
  133. package/dist/th-TH.umd.js +2 -0
  134. package/dist/tr-TR.js +2 -0
  135. package/dist/tr-TR.umd.js +2 -0
  136. package/dist/uk-UA.js +2 -0
  137. package/dist/uk-UA.umd.js +2 -0
  138. package/dist/ur-PK.js +2 -0
  139. package/dist/ur-PK.umd.js +2 -0
  140. package/dist/vi-VN.js +2 -0
  141. package/dist/vi-VN.umd.js +2 -0
  142. package/dist/yo-NG.js +2 -0
  143. package/dist/yo-NG.umd.js +2 -0
  144. package/dist/zh-Hans-CN.js +2 -0
  145. package/dist/zh-Hans-CN.umd.js +2 -0
  146. package/dist/zh-Hant-TW.js +2 -0
  147. package/dist/zh-Hant-TW.umd.js +2 -0
  148. package/package.json +61 -88
  149. package/src/am-ET.d.ts +40 -0
  150. package/src/am-ET.js +269 -0
  151. package/src/am-Latn-ET.d.ts +35 -0
  152. package/src/am-Latn-ET.js +264 -0
  153. package/src/ar-SA.d.ts +49 -0
  154. package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
  155. package/src/az-AZ.d.ts +37 -0
  156. package/src/az-AZ.js +312 -0
  157. package/src/bn-BD.d.ts +36 -0
  158. package/{lib/languages/bn.js → src/bn-BD.js} +110 -6
  159. package/src/cs-CZ.d.ts +49 -0
  160. package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
  161. package/src/da-DK.d.ts +44 -0
  162. package/{lib/languages/da.js → src/da-DK.js} +131 -11
  163. package/src/de-DE.d.ts +57 -0
  164. package/src/de-DE.js +603 -0
  165. package/src/el-GR.d.ts +40 -0
  166. package/src/el-GR.js +418 -0
  167. package/src/en-AU.d.ts +47 -0
  168. package/src/en-AU.js +423 -0
  169. package/src/en-BD.d.ts +49 -0
  170. package/src/en-BD.js +415 -0
  171. package/src/en-CA.d.ts +63 -0
  172. package/src/en-CA.js +518 -0
  173. package/src/en-GB.d.ts +56 -0
  174. package/src/en-GB.js +469 -0
  175. package/src/en-GH.d.ts +11 -0
  176. package/src/en-GH.js +345 -0
  177. package/src/en-IE.d.ts +56 -0
  178. package/src/en-IE.js +479 -0
  179. package/src/en-IN.d.ts +49 -0
  180. package/src/en-IN.js +415 -0
  181. package/src/en-KE.d.ts +11 -0
  182. package/src/en-KE.js +345 -0
  183. package/src/en-MY.d.ts +11 -0
  184. package/src/en-MY.js +347 -0
  185. package/src/en-NG.d.ts +56 -0
  186. package/src/en-NG.js +479 -0
  187. package/src/en-NZ.d.ts +11 -0
  188. package/{lib/languages/en.js → src/en-NZ.js} +164 -31
  189. package/src/en-PH.d.ts +11 -0
  190. package/src/en-PH.js +345 -0
  191. package/src/en-PK.d.ts +49 -0
  192. package/src/en-PK.js +415 -0
  193. package/src/en-SG.d.ts +11 -0
  194. package/src/en-SG.js +345 -0
  195. package/src/en-US.d.ts +63 -0
  196. package/src/en-US.js +516 -0
  197. package/src/en-ZA.d.ts +56 -0
  198. package/src/en-ZA.js +478 -0
  199. package/src/es-ES.d.ts +65 -0
  200. package/src/es-ES.js +541 -0
  201. package/src/es-MX.d.ts +58 -0
  202. package/{lib/languages/es.js → src/es-MX.js} +228 -18
  203. package/src/es-US.d.ts +58 -0
  204. package/src/es-US.js +446 -0
  205. package/src/fa-IR.d.ts +38 -0
  206. package/src/fa-IR.js +246 -0
  207. package/src/fi-FI.d.ts +46 -0
  208. package/{lib/languages/fi.js → src/fi-FI.js} +152 -11
  209. package/src/fil-PH.d.ts +37 -0
  210. package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
  211. package/src/fr-BE.d.ts +49 -0
  212. package/{lib/languages → src}/fr-BE.js +175 -13
  213. package/src/fr-FR.d.ts +63 -0
  214. package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
  215. package/src/gu-IN.d.ts +35 -0
  216. package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
  217. package/src/ha-NG.d.ts +37 -0
  218. package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
  219. package/src/hbo-IL.d.ts +39 -0
  220. package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
  221. package/src/he-IL.d.ts +37 -0
  222. package/src/he-IL.js +537 -0
  223. package/src/hi-IN.d.ts +36 -0
  224. package/{lib/languages/hi.js → src/hi-IN.js} +116 -6
  225. package/src/hr-HR.d.ts +42 -0
  226. package/src/hr-HR.js +463 -0
  227. package/src/hu-HU.d.ts +38 -0
  228. package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
  229. package/src/id-ID.d.ts +38 -0
  230. package/{lib/languages/id.js → src/id-ID.js} +99 -8
  231. package/src/it-IT.d.ts +59 -0
  232. package/{lib/languages/it.js → src/it-IT.js} +179 -15
  233. package/src/ja-JP.d.ts +49 -0
  234. package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
  235. package/src/ka-GE.d.ts +44 -0
  236. package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
  237. package/src/kn-IN.d.ts +35 -0
  238. package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
  239. package/src/ko-KR.d.ts +45 -0
  240. package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
  241. package/src/lt-LT.d.ts +49 -0
  242. package/src/lt-LT.js +543 -0
  243. package/src/lv-LV.d.ts +49 -0
  244. package/src/lv-LV.js +595 -0
  245. package/src/mr-IN.d.ts +36 -0
  246. package/{lib/languages/mr.js → src/mr-IN.js} +116 -6
  247. package/src/ms-MY.d.ts +37 -0
  248. package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
  249. package/src/nb-NO.d.ts +44 -0
  250. package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
  251. package/src/nl-NL.d.ts +54 -0
  252. package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
  253. package/src/pa-IN.d.ts +36 -0
  254. package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
  255. package/src/pl-PL.d.ts +55 -0
  256. package/src/pl-PL.js +585 -0
  257. package/src/pt-BR.d.ts +31 -0
  258. package/src/pt-BR.js +534 -0
  259. package/src/pt-PT.d.ts +45 -0
  260. package/{lib/languages/pt.js → src/pt-PT.js} +234 -12
  261. package/src/ro-RO.d.ts +44 -0
  262. package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
  263. package/src/ru-RU.d.ts +50 -0
  264. package/src/ru-RU.js +535 -0
  265. package/src/sr-Cyrl-RS.d.ts +49 -0
  266. package/src/sr-Cyrl-RS.js +503 -0
  267. package/src/sr-Latn-RS.d.ts +49 -0
  268. package/src/sr-Latn-RS.js +503 -0
  269. package/src/sv-SE.d.ts +44 -0
  270. package/{lib/languages/sv.js → src/sv-SE.js} +136 -11
  271. package/src/sw-KE.d.ts +37 -0
  272. package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
  273. package/src/ta-IN.d.ts +35 -0
  274. package/{lib/languages/ta.js → src/ta-IN.js} +109 -6
  275. package/src/te-IN.d.ts +35 -0
  276. package/{lib/languages/te.js → src/te-IN.js} +115 -6
  277. package/src/th-TH.d.ts +38 -0
  278. package/{lib/languages/th.js → src/th-TH.js} +99 -6
  279. package/src/tr-TR.d.ts +48 -0
  280. package/{lib/languages/tr.js → src/tr-TR.js} +168 -23
  281. package/src/uk-UA.d.ts +42 -0
  282. package/src/uk-UA.js +463 -0
  283. package/src/ur-PK.d.ts +36 -0
  284. package/{lib/languages/ur.js → src/ur-PK.js} +116 -6
  285. package/src/utils/expand-scientific.d.ts +32 -0
  286. package/src/utils/expand-scientific.js +65 -0
  287. package/src/utils/parse-cardinal.d.ts +14 -0
  288. package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
  289. package/src/utils/parse-currency.d.ts +14 -0
  290. package/src/utils/parse-currency.js +91 -0
  291. package/src/utils/parse-ordinal.d.ts +10 -0
  292. package/src/utils/parse-ordinal.js +103 -0
  293. package/src/vi-VN.d.ts +48 -0
  294. package/{lib/languages/vi.js → src/vi-VN.js} +102 -11
  295. package/src/yo-NG.d.ts +37 -0
  296. package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
  297. package/src/zh-Hans-CN.d.ts +48 -0
  298. package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
  299. package/src/zh-Hant-TW.d.ts +50 -0
  300. package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
  301. package/dist/languages/am-Latn.js +0 -3
  302. package/dist/languages/am-Latn.js.map +0 -1
  303. package/dist/languages/am.js +0 -3
  304. package/dist/languages/am.js.map +0 -1
  305. package/dist/languages/ar.js +0 -3
  306. package/dist/languages/ar.js.map +0 -1
  307. package/dist/languages/az.js +0 -3
  308. package/dist/languages/az.js.map +0 -1
  309. package/dist/languages/bn.js +0 -3
  310. package/dist/languages/bn.js.map +0 -1
  311. package/dist/languages/cs.js +0 -3
  312. package/dist/languages/cs.js.map +0 -1
  313. package/dist/languages/da.js +0 -3
  314. package/dist/languages/da.js.map +0 -1
  315. package/dist/languages/de.js +0 -3
  316. package/dist/languages/de.js.map +0 -1
  317. package/dist/languages/el.js +0 -3
  318. package/dist/languages/el.js.map +0 -1
  319. package/dist/languages/en.js +0 -3
  320. package/dist/languages/en.js.map +0 -1
  321. package/dist/languages/es.js +0 -3
  322. package/dist/languages/es.js.map +0 -1
  323. package/dist/languages/fa.js +0 -3
  324. package/dist/languages/fa.js.map +0 -1
  325. package/dist/languages/fi.js +0 -3
  326. package/dist/languages/fi.js.map +0 -1
  327. package/dist/languages/fil.js +0 -3
  328. package/dist/languages/fil.js.map +0 -1
  329. package/dist/languages/fr-BE.js +0 -3
  330. package/dist/languages/fr-BE.js.map +0 -1
  331. package/dist/languages/fr.js +0 -3
  332. package/dist/languages/fr.js.map +0 -1
  333. package/dist/languages/gu.js +0 -3
  334. package/dist/languages/gu.js.map +0 -1
  335. package/dist/languages/ha.js +0 -3
  336. package/dist/languages/ha.js.map +0 -1
  337. package/dist/languages/hbo.js +0 -3
  338. package/dist/languages/hbo.js.map +0 -1
  339. package/dist/languages/he.js +0 -3
  340. package/dist/languages/he.js.map +0 -1
  341. package/dist/languages/hi.js +0 -3
  342. package/dist/languages/hi.js.map +0 -1
  343. package/dist/languages/hr.js +0 -3
  344. package/dist/languages/hr.js.map +0 -1
  345. package/dist/languages/hu.js +0 -3
  346. package/dist/languages/hu.js.map +0 -1
  347. package/dist/languages/id.js +0 -3
  348. package/dist/languages/id.js.map +0 -1
  349. package/dist/languages/it.js +0 -3
  350. package/dist/languages/it.js.map +0 -1
  351. package/dist/languages/ja.js +0 -3
  352. package/dist/languages/ja.js.map +0 -1
  353. package/dist/languages/ka.js +0 -3
  354. package/dist/languages/ka.js.map +0 -1
  355. package/dist/languages/kn.js +0 -3
  356. package/dist/languages/kn.js.map +0 -1
  357. package/dist/languages/ko.js +0 -3
  358. package/dist/languages/ko.js.map +0 -1
  359. package/dist/languages/lt.js +0 -3
  360. package/dist/languages/lt.js.map +0 -1
  361. package/dist/languages/lv.js +0 -3
  362. package/dist/languages/lv.js.map +0 -1
  363. package/dist/languages/mr.js +0 -3
  364. package/dist/languages/mr.js.map +0 -1
  365. package/dist/languages/ms.js +0 -3
  366. package/dist/languages/ms.js.map +0 -1
  367. package/dist/languages/nb.js +0 -3
  368. package/dist/languages/nb.js.map +0 -1
  369. package/dist/languages/nl.js +0 -3
  370. package/dist/languages/nl.js.map +0 -1
  371. package/dist/languages/pa.js +0 -3
  372. package/dist/languages/pa.js.map +0 -1
  373. package/dist/languages/pl.js +0 -3
  374. package/dist/languages/pl.js.map +0 -1
  375. package/dist/languages/pt.js +0 -3
  376. package/dist/languages/pt.js.map +0 -1
  377. package/dist/languages/ro.js +0 -3
  378. package/dist/languages/ro.js.map +0 -1
  379. package/dist/languages/ru.js +0 -3
  380. package/dist/languages/ru.js.map +0 -1
  381. package/dist/languages/sr-Cyrl.js +0 -3
  382. package/dist/languages/sr-Cyrl.js.map +0 -1
  383. package/dist/languages/sr-Latn.js +0 -3
  384. package/dist/languages/sr-Latn.js.map +0 -1
  385. package/dist/languages/sv.js +0 -3
  386. package/dist/languages/sv.js.map +0 -1
  387. package/dist/languages/sw.js +0 -3
  388. package/dist/languages/sw.js.map +0 -1
  389. package/dist/languages/ta.js +0 -3
  390. package/dist/languages/ta.js.map +0 -1
  391. package/dist/languages/te.js +0 -3
  392. package/dist/languages/te.js.map +0 -1
  393. package/dist/languages/th.js +0 -3
  394. package/dist/languages/th.js.map +0 -1
  395. package/dist/languages/tr.js +0 -3
  396. package/dist/languages/tr.js.map +0 -1
  397. package/dist/languages/uk.js +0 -3
  398. package/dist/languages/uk.js.map +0 -1
  399. package/dist/languages/ur.js +0 -3
  400. package/dist/languages/ur.js.map +0 -1
  401. package/dist/languages/vi.js +0 -3
  402. package/dist/languages/vi.js.map +0 -1
  403. package/dist/languages/yo.js +0 -3
  404. package/dist/languages/yo.js.map +0 -1
  405. package/dist/languages/zh-Hans.js +0 -3
  406. package/dist/languages/zh-Hans.js.map +0 -1
  407. package/dist/languages/zh-Hant.js +0 -3
  408. package/dist/languages/zh-Hant.js.map +0 -1
  409. package/dist/n2words.js +0 -3
  410. package/dist/n2words.js.map +0 -1
  411. package/lib/languages/am-Latn.d.ts +0 -7
  412. package/lib/languages/am-Latn.js +0 -159
  413. package/lib/languages/am.d.ts +0 -7
  414. package/lib/languages/am.js +0 -159
  415. package/lib/languages/ar.d.ts +0 -17
  416. package/lib/languages/az.d.ts +0 -7
  417. package/lib/languages/az.js +0 -171
  418. package/lib/languages/bn.d.ts +0 -7
  419. package/lib/languages/cs.d.ts +0 -18
  420. package/lib/languages/da.d.ts +0 -14
  421. package/lib/languages/de.d.ts +0 -17
  422. package/lib/languages/de.js +0 -320
  423. package/lib/languages/el.d.ts +0 -14
  424. package/lib/languages/el.js +0 -236
  425. package/lib/languages/en.d.ts +0 -17
  426. package/lib/languages/es.d.ts +0 -21
  427. package/lib/languages/fa.d.ts +0 -7
  428. package/lib/languages/fa.js +0 -134
  429. package/lib/languages/fi.d.ts +0 -14
  430. package/lib/languages/fil.d.ts +0 -7
  431. package/lib/languages/fr-BE.d.ts +0 -11
  432. package/lib/languages/fr.d.ts +0 -21
  433. package/lib/languages/gu.d.ts +0 -7
  434. package/lib/languages/ha.d.ts +0 -7
  435. package/lib/languages/hbo.d.ts +0 -13
  436. package/lib/languages/he.d.ts +0 -13
  437. package/lib/languages/he.js +0 -265
  438. package/lib/languages/hi.d.ts +0 -7
  439. package/lib/languages/hr.d.ts +0 -11
  440. package/lib/languages/hr.js +0 -224
  441. package/lib/languages/hu.d.ts +0 -7
  442. package/lib/languages/id.d.ts +0 -7
  443. package/lib/languages/it.d.ts +0 -19
  444. package/lib/languages/ja.d.ts +0 -17
  445. package/lib/languages/ka.d.ts +0 -17
  446. package/lib/languages/kn.d.ts +0 -7
  447. package/lib/languages/ko.d.ts +0 -14
  448. package/lib/languages/lt.d.ts +0 -18
  449. package/lib/languages/lt.js +0 -301
  450. package/lib/languages/lv.d.ts +0 -18
  451. package/lib/languages/lv.js +0 -312
  452. package/lib/languages/mr.d.ts +0 -7
  453. package/lib/languages/ms.d.ts +0 -7
  454. package/lib/languages/nb.d.ts +0 -14
  455. package/lib/languages/nl.d.ts +0 -26
  456. package/lib/languages/pa.d.ts +0 -7
  457. package/lib/languages/pl.d.ts +0 -22
  458. package/lib/languages/pl.js +0 -317
  459. package/lib/languages/pt.d.ts +0 -17
  460. package/lib/languages/ro.d.ts +0 -18
  461. package/lib/languages/ru.d.ts +0 -11
  462. package/lib/languages/ru.js +0 -245
  463. package/lib/languages/sr-Cyrl.d.ts +0 -11
  464. package/lib/languages/sr-Cyrl.js +0 -221
  465. package/lib/languages/sr-Latn.d.ts +0 -11
  466. package/lib/languages/sr-Latn.js +0 -221
  467. package/lib/languages/sv.d.ts +0 -14
  468. package/lib/languages/sw.d.ts +0 -7
  469. package/lib/languages/ta.d.ts +0 -7
  470. package/lib/languages/te.d.ts +0 -7
  471. package/lib/languages/th.d.ts +0 -7
  472. package/lib/languages/tr.d.ts +0 -18
  473. package/lib/languages/uk.d.ts +0 -11
  474. package/lib/languages/uk.js +0 -224
  475. package/lib/languages/ur.d.ts +0 -7
  476. package/lib/languages/vi.d.ts +0 -17
  477. package/lib/languages/yo.d.ts +0 -7
  478. package/lib/languages/zh-Hans.d.ts +0 -11
  479. package/lib/languages/zh-Hant.d.ts +0 -11
  480. package/lib/n2words.d.ts +0 -55
  481. package/lib/n2words.js +0 -126
  482. package/lib/utils/parse-numeric.d.ts +0 -17
  483. /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
  484. /package/{lib → src}/utils/is-plain-object.js +0 -0
  485. /package/{lib → src}/utils/validate-options.d.ts +0 -0
  486. /package/{lib → src}/utils/validate-options.js +0 -0
@@ -1,8 +1,7 @@
1
1
  /**
2
- * Yoruba language converter - Functional Implementation
2
+ * Yoruba (Nigeria) language converter
3
3
  *
4
- * A number-to-words converter for Yoruba (yo), a Niger-Congo language
5
- * spoken by ~45 million people in Nigeria, Benin, and Togo.
4
+ * CLDR: yo-NG | Yoruba as used in Nigeria
6
5
  *
7
6
  * Yoruba uses a complex vigesimal (base-20) system with:
8
7
  * - Additive patterns: 1-4 added to decade (lé = "plus")
@@ -17,7 +16,9 @@
17
16
  * - 45 = àrùndínláàádọ́ta (50 - 5)
18
17
  */
19
18
 
20
- import { parseNumericValue } from '../utils/parse-numeric.js'
19
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
20
+ import { parseCurrencyValue } from './utils/parse-currency.js'
21
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
21
22
 
22
23
  // ============================================================================
23
24
  // Vocabulary (module-level constants)
@@ -111,6 +112,23 @@ const NEGATIVE = 'àìní'
111
112
  const DECIMAL_SEP = 'àmì'
112
113
  const AND = 'ó lé' // "and" / "plus" connector
113
114
 
115
+ // ============================================================================
116
+ // Ordinal Vocabulary
117
+ // ============================================================================
118
+
119
+ // Yoruba ordinals use "ìkẹ-" prefix: ìkẹta (3rd), ìkẹrin (4th)
120
+ // First and second have special forms
121
+ const ORDINAL_FIRST = 'àkọ́kọ́' // first
122
+ const ORDINAL_SECOND = 'ìkejì' // second
123
+ const ORDINAL_PREFIX = 'ìkẹ'
124
+
125
+ // ============================================================================
126
+ // Currency Vocabulary (Nigerian Naira)
127
+ // ============================================================================
128
+
129
+ const NAIRA = 'náírà'
130
+ const KOBO = 'kọ́bọ̀'
131
+
114
132
  // ============================================================================
115
133
  // Segment Building
116
134
  // ============================================================================
@@ -131,7 +149,7 @@ function buildUnder100 (n) {
131
149
  // Exact decades
132
150
  if (n % 10 === 0) return DECADES[n]
133
151
 
134
- const decade = Math.floor(n / 10) * 10
152
+ const decade = Math.trunc(n / 10) * 10
135
153
  const unit = n % 10
136
154
 
137
155
  // 1-4 are added to current decade (21 = 1 + 20, not 1 + 30)
@@ -155,7 +173,7 @@ function buildUnder100 (n) {
155
173
  function convertHundreds (n) {
156
174
  if (n < 100) return buildUnder100(n)
157
175
 
158
- const hundreds = Math.floor(n / 100)
176
+ const hundreds = Math.trunc(n / 100)
159
177
  const remainder = n % 100
160
178
 
161
179
  let result
@@ -282,8 +300,8 @@ function decimalPartToWords (decimalPart) {
282
300
  * @param {number | string | bigint} value - The numeric value to convert
283
301
  * @returns {string} The number in Yoruba words
284
302
  */
285
- function toWords (value) {
286
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
303
+ function toCardinal (value) {
304
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
287
305
 
288
306
  let result = ''
289
307
 
@@ -300,4 +318,86 @@ function toWords (value) {
300
318
  return result
301
319
  }
302
320
 
303
- export { toWords }
321
+ // ============================================================================
322
+ // ORDINAL: toOrdinal(value)
323
+ // ============================================================================
324
+
325
+ /**
326
+ * Converts a non-negative integer to Yoruba ordinal words.
327
+ *
328
+ * Yoruba ordinals: àkọ́kọ́ (1st), ìkejì (2nd), ìkẹta (3rd), ìkẹrin (4th), etc.
329
+ *
330
+ * @param {bigint} n - Positive integer to convert
331
+ * @returns {string} Yoruba ordinal words
332
+ */
333
+ function integerToOrdinal (n) {
334
+ // Special forms
335
+ if (n === 1n) return ORDINAL_FIRST
336
+ if (n === 2n) return ORDINAL_SECOND
337
+
338
+ // For 3+, use ìkẹ- prefix + cardinal
339
+ return ORDINAL_PREFIX + integerToWords(n)
340
+ }
341
+
342
+ /**
343
+ * Converts a numeric value to Yoruba ordinal words.
344
+ *
345
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
346
+ * @returns {string} The number as ordinal words
347
+ * @throws {TypeError} If value is not a valid numeric type
348
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
349
+ *
350
+ * @example
351
+ * toOrdinal(1) // 'àkọ́kọ́'
352
+ * toOrdinal(2) // 'ìkejì'
353
+ * toOrdinal(3) // 'ìkẹẹ̀ta'
354
+ */
355
+ function toOrdinal (value) {
356
+ const integerPart = parseOrdinalValue(value)
357
+ return integerToOrdinal(integerPart)
358
+ }
359
+
360
+ // ============================================================================
361
+ // CURRENCY: toCurrency(value)
362
+ // ============================================================================
363
+
364
+ /**
365
+ * Converts a numeric value to Yoruba currency words (Nigerian Naira).
366
+ *
367
+ * Uses náírà (naira) and kọ́bọ̀ (kobo).
368
+ *
369
+ * @param {number | string | bigint} value - The currency amount to convert
370
+ * @returns {string} The amount in Yoruba currency words
371
+ * @throws {TypeError} If value is not a valid numeric type
372
+ * @throws {Error} If value is not a valid number format
373
+ *
374
+ * @example
375
+ * toCurrency(42) // 'èjì lé lógójì náírà'
376
+ * toCurrency(1.50) // 'ọ̀kan náírà àti àádọ́ta kọ́bọ̀'
377
+ * toCurrency(-5) // 'àìní àrùn náírà'
378
+ */
379
+ function toCurrency (value) {
380
+ const { isNegative, dollars: naira, cents: kobo } = parseCurrencyValue(value)
381
+
382
+ let result = ''
383
+ if (isNegative) {
384
+ result = NEGATIVE + ' '
385
+ }
386
+
387
+ // Naira part
388
+ if (naira > 0n || kobo === 0n) {
389
+ result += integerToWords(naira) + ' ' + NAIRA
390
+ }
391
+
392
+ // Kobo part
393
+ if (kobo > 0n) {
394
+ if (naira > 0n) {
395
+ result += ' àti '
396
+ }
397
+ result += integerToWords(kobo) + ' ' + KOBO
398
+ }
399
+
400
+ return result
401
+ }
402
+
403
+ export { toCardinal, toOrdinal, toCurrency }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Converts a numeric value to Simplified Chinese words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Optional configuration
6
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
7
+ * @returns {string} The number in Simplified Chinese words
8
+ */
9
+ export function toCardinal(value: number | string | bigint, options?: {
10
+ formal?: boolean | undefined;
11
+ }): string;
12
+ /**
13
+ * Converts a numeric value to Simplified Chinese ordinal words.
14
+ *
15
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
16
+ * @param {Object} [options] - Optional configuration
17
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
18
+ * @returns {string} The number as ordinal words
19
+ * @throws {TypeError} If value is not a valid numeric type
20
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
21
+ *
22
+ * @example
23
+ * toOrdinal(1) // '第壹'
24
+ * toOrdinal(1, { formal: false }) // '第一'
25
+ * toOrdinal(10) // '第壹拾'
26
+ */
27
+ export function toOrdinal(value: number | string | bigint, options?: {
28
+ formal?: boolean | undefined;
29
+ }): string;
30
+ /**
31
+ * Converts a numeric value to Simplified Chinese currency words (Yuan/Renminbi).
32
+ *
33
+ * @param {number | string | bigint} value - The currency amount to convert
34
+ * @param {Object} [options] - Optional configuration
35
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
36
+ * @returns {string} The amount in Simplified Chinese currency 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(42.50) // '肆拾贰圆伍角整'
42
+ * toCurrency(1) // '壹圆整'
43
+ * toCurrency(0.05) // '伍分'
44
+ * toCurrency(42.50, { formal: false }) // '四十二元五角整'
45
+ */
46
+ export function toCurrency(value: number | string | bigint, options?: {
47
+ formal?: boolean | undefined;
48
+ }): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Simplified Chinese language converter - Functional Implementation
2
+ * Simplified Chinese (China) language converter
3
3
  *
4
- * Self-contained converter for Simplified Chinese.
4
+ * CLDR: zh-Hans-CN | Simplified Chinese as used in China
5
5
  *
6
6
  * Key features:
7
7
  * - Myriad-based (万, 亿) grouping - 4 digits
@@ -10,8 +10,10 @@
10
10
  * - No word separators (concatenated format)
11
11
  */
12
12
 
13
- import { parseNumericValue } from '../utils/parse-numeric.js'
14
- import { validateOptions } from '../utils/validate-options.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'
16
+ import { validateOptions } from './utils/validate-options.js'
15
17
 
16
18
  // ============================================================================
17
19
  // Vocabulary
@@ -37,6 +39,30 @@ const ZERO = '零'
37
39
  const NEGATIVE = '负'
38
40
  const DECIMAL_SEP = '点'
39
41
 
42
+ // ============================================================================
43
+ // Ordinal Vocabulary
44
+ // ============================================================================
45
+
46
+ // Ordinal prefix
47
+ const ORDINAL_PREFIX = '第'
48
+
49
+ // ============================================================================
50
+ // Currency Vocabulary (Chinese Yuan / Renminbi)
51
+ // ============================================================================
52
+
53
+ // Yuan (main unit) - formal uses 圆, common uses 元
54
+ const YUAN_FORMAL = '圆'
55
+ const YUAN_COMMON = '元'
56
+
57
+ // Jiao (1/10 yuan) - both use 角
58
+ const JIAO = '角'
59
+
60
+ // Fen (1/100 yuan) - both use 分
61
+ const FEN = '分'
62
+
63
+ // "Whole" when no jiao/fen
64
+ const ZHENG = '整'
65
+
40
66
  // ============================================================================
41
67
  // Conversion Functions
42
68
  // ============================================================================
@@ -158,10 +184,12 @@ function decimalDigitsToWords (decimalString, ones) {
158
184
  * @param {boolean} [options.formal=true] - Use formal/financial numerals
159
185
  * @returns {string} The number in Simplified Chinese words
160
186
  */
161
- function toWords (value, options) {
187
+ function toCardinal (value, options) {
162
188
  options = validateOptions(options)
163
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
164
- const formal = options.formal !== false // Default to true
189
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
190
+
191
+ // Apply option defaults
192
+ const { formal = true } = options
165
193
 
166
194
  let result = isNegative ? NEGATIVE : ''
167
195
 
@@ -175,8 +203,112 @@ function toWords (value, options) {
175
203
  return result
176
204
  }
177
205
 
206
+ // ============================================================================
207
+ // ORDINAL: toOrdinal(value)
208
+ // ============================================================================
209
+
210
+ /**
211
+ * Converts a positive integer to Simplified Chinese ordinal words.
212
+ *
213
+ * Chinese ordinals: 第 prefix + cardinal number.
214
+ *
215
+ * @param {bigint} n - Positive integer to convert
216
+ * @param {boolean} formal - Use formal numerals
217
+ * @returns {string} Simplified Chinese ordinal words
218
+ */
219
+ function integerToOrdinal (n, formal) {
220
+ return ORDINAL_PREFIX + integerToWords(n, formal)
221
+ }
222
+
223
+ /**
224
+ * Converts a numeric value to Simplified Chinese ordinal words.
225
+ *
226
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
227
+ * @param {Object} [options] - Optional configuration
228
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
229
+ * @returns {string} The number as ordinal words
230
+ * @throws {TypeError} If value is not a valid numeric type
231
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
232
+ *
233
+ * @example
234
+ * toOrdinal(1) // '第壹'
235
+ * toOrdinal(1, { formal: false }) // '第一'
236
+ * toOrdinal(10) // '第壹拾'
237
+ */
238
+ function toOrdinal (value, options) {
239
+ options = validateOptions(options)
240
+ const integerPart = parseOrdinalValue(value)
241
+ const { formal = true } = options
242
+ return integerToOrdinal(integerPart, formal)
243
+ }
244
+
245
+ // ============================================================================
246
+ // CURRENCY: toCurrency(value, options?)
247
+ // ============================================================================
248
+
249
+ /**
250
+ * Converts a numeric value to Simplified Chinese currency words (Yuan/Renminbi).
251
+ *
252
+ * @param {number | string | bigint} value - The currency amount to convert
253
+ * @param {Object} [options] - Optional configuration
254
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
255
+ * @returns {string} The amount in Simplified Chinese currency words
256
+ * @throws {TypeError} If value is not a valid numeric type
257
+ * @throws {Error} If value is not a valid number format
258
+ *
259
+ * @example
260
+ * toCurrency(42.50) // '肆拾贰圆伍角整'
261
+ * toCurrency(1) // '壹圆整'
262
+ * toCurrency(0.05) // '伍分'
263
+ * toCurrency(42.50, { formal: false }) // '四十二元五角整'
264
+ */
265
+ function toCurrency (value, options) {
266
+ options = validateOptions(options)
267
+ const { isNegative, dollars: yuan, cents } = parseCurrencyValue(value)
268
+ const { formal = true } = options
269
+
270
+ const ones = formal ? ONES_FORMAL : ONES_COMMON
271
+ const yuanWord = formal ? YUAN_FORMAL : YUAN_COMMON
272
+
273
+ // Split cents into jiao (tens) and fen (ones)
274
+ const jiao = cents / 10n
275
+ const fen = cents % 10n
276
+
277
+ // Build result
278
+ let result = ''
279
+ if (isNegative) result = NEGATIVE
280
+
281
+ // Yuan part
282
+ if (yuan > 0n) {
283
+ result += integerToWords(yuan, formal) + yuanWord
284
+ }
285
+
286
+ // Jiao part (1/10)
287
+ if (jiao > 0n) {
288
+ result += ones[Number(jiao)] + JIAO
289
+ } else if (yuan > 0n && fen > 0n) {
290
+ // Need zero placeholder between yuan and fen
291
+ result += ZERO
292
+ }
293
+
294
+ // Fen part (1/100)
295
+ if (fen > 0n) {
296
+ result += ones[Number(fen)] + FEN
297
+ } else if (yuan > 0n || jiao > 0n) {
298
+ // Add 整 (zheng) to indicate whole amount
299
+ result += ZHENG
300
+ }
301
+
302
+ // Handle zero case
303
+ if (yuan === 0n && jiao === 0n && fen === 0n) {
304
+ result += ZERO + yuanWord + ZHENG
305
+ }
306
+
307
+ return result
308
+ }
309
+
178
310
  // ============================================================================
179
311
  // Exports
180
312
  // ============================================================================
181
313
 
182
- export { toWords }
314
+ export { toCardinal, toOrdinal, toCurrency }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Converts a numeric value to Traditional Chinese words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Optional configuration
6
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
7
+ * @returns {string} The number in Traditional Chinese words
8
+ */
9
+ export function toCardinal(value: number | string | bigint, options?: {
10
+ formal?: boolean | undefined;
11
+ }): string;
12
+ /**
13
+ * Converts a numeric value to Traditional Chinese ordinal words.
14
+ *
15
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
16
+ * @param {Object} [options] - Optional configuration
17
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
18
+ * @returns {string} The number as ordinal words
19
+ * @throws {TypeError} If value is not a valid numeric type
20
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
21
+ *
22
+ * @example
23
+ * toOrdinal(1) // '第壹'
24
+ * toOrdinal(2) // '第貳'
25
+ * toOrdinal(1, { formal: false }) // '第一'
26
+ */
27
+ export function toOrdinal(value: number | string | bigint, options?: {
28
+ formal?: boolean | undefined;
29
+ }): string;
30
+ /**
31
+ * Converts a numeric value to Traditional Chinese currency words (New Taiwan Dollar).
32
+ *
33
+ * Uses 圓 (yuan), 角 (jiao, 1/10), 分 (fen, 1/100).
34
+ * Formal writing adds 整 (zheng) for whole amounts.
35
+ *
36
+ * @param {number | string | bigint} value - The currency amount to convert
37
+ * @param {Object} [options] - Optional configuration
38
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
39
+ * @returns {string} The amount in Traditional Chinese 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.50) // '壹圓伍角整'
46
+ * toCurrency(42, { formal: false }) // '四十二元整'
47
+ */
48
+ export function toCurrency(value: number | string | bigint, options?: {
49
+ formal?: boolean | undefined;
50
+ }): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Traditional Chinese language converter - Functional Implementation
2
+ * Traditional Chinese (Taiwan) language converter
3
3
  *
4
- * Self-contained converter for Traditional Chinese.
4
+ * CLDR: zh-Hant-TW | Traditional Chinese as used in Taiwan
5
5
  *
6
6
  * Key features:
7
7
  * - Myriad-based (萬, 億) grouping - 4 digits
@@ -14,8 +14,10 @@
14
14
  * - Some formal numerals differ (參/叁, 貳/贰, 陸/陆)
15
15
  */
16
16
 
17
- import { parseNumericValue } from '../utils/parse-numeric.js'
18
- import { validateOptions } from '../utils/validate-options.js'
17
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
18
+ import { parseCurrencyValue } from './utils/parse-currency.js'
19
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
20
+ import { validateOptions } from './utils/validate-options.js'
19
21
 
20
22
  // ============================================================================
21
23
  // Vocabulary
@@ -41,6 +43,25 @@ const ZERO = '零'
41
43
  const NEGATIVE = '負'
42
44
  const DECIMAL_SEP = '點'
43
45
 
46
+ // ============================================================================
47
+ // Ordinal Vocabulary
48
+ // ============================================================================
49
+
50
+ const ORDINAL_PREFIX = '第'
51
+
52
+ // ============================================================================
53
+ // Currency Vocabulary (New Taiwan Dollar)
54
+ // ============================================================================
55
+
56
+ // Formal currency (default)
57
+ const YUAN_FORMAL = '圓'
58
+ const JIAO_FORMAL = '角'
59
+ const FEN_FORMAL = '分'
60
+ const ZHENG_FORMAL = '整' // "exactly" suffix when whole amount
61
+
62
+ // Common currency
63
+ const YUAN_COMMON = '元'
64
+
44
65
  // ============================================================================
45
66
  // Conversion Functions
46
67
  // ============================================================================
@@ -175,10 +196,12 @@ function decimalDigitsToWords (decimalString, formal = true) {
175
196
  * @param {boolean} [options.formal=true] - Use formal/financial numerals
176
197
  * @returns {string} The number in Traditional Chinese words
177
198
  */
178
- function toWords (value, options) {
199
+ function toCardinal (value, options) {
179
200
  options = validateOptions(options)
180
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
181
- const formal = options.formal !== false // Default to true
201
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
202
+
203
+ // Apply option defaults
204
+ const { formal = true } = options
182
205
 
183
206
  let result = ''
184
207
 
@@ -195,8 +218,116 @@ function toWords (value, options) {
195
218
  return result
196
219
  }
197
220
 
221
+ // ============================================================================
222
+ // ORDINAL: toOrdinal(value, options?)
223
+ // ============================================================================
224
+
225
+ /**
226
+ * Converts a non-negative integer to Traditional Chinese ordinal words.
227
+ *
228
+ * Traditional Chinese ordinals use "第" prefix + cardinal number.
229
+ *
230
+ * @param {bigint} n - Positive integer to convert
231
+ * @param {boolean} formal - Use formal/financial numerals
232
+ * @returns {string} Traditional Chinese ordinal words
233
+ */
234
+ function integerToOrdinal (n, formal = true) {
235
+ return ORDINAL_PREFIX + integerToWords(n, formal)
236
+ }
237
+
238
+ /**
239
+ * Converts a numeric value to Traditional Chinese ordinal words.
240
+ *
241
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
242
+ * @param {Object} [options] - Optional configuration
243
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
244
+ * @returns {string} The number as ordinal words
245
+ * @throws {TypeError} If value is not a valid numeric type
246
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
247
+ *
248
+ * @example
249
+ * toOrdinal(1) // '第壹'
250
+ * toOrdinal(2) // '第貳'
251
+ * toOrdinal(1, { formal: false }) // '第一'
252
+ */
253
+ function toOrdinal (value, options) {
254
+ options = validateOptions(options)
255
+ const integerPart = parseOrdinalValue(value)
256
+ const { formal = true } = options
257
+ return integerToOrdinal(integerPart, formal)
258
+ }
259
+
260
+ // ============================================================================
261
+ // CURRENCY: toCurrency(value, options?)
262
+ // ============================================================================
263
+
264
+ /**
265
+ * Converts a numeric value to Traditional Chinese currency words (New Taiwan Dollar).
266
+ *
267
+ * Uses 圓 (yuan), 角 (jiao, 1/10), 分 (fen, 1/100).
268
+ * Formal writing adds 整 (zheng) for whole amounts.
269
+ *
270
+ * @param {number | string | bigint} value - The currency amount to convert
271
+ * @param {Object} [options] - Optional configuration
272
+ * @param {boolean} [options.formal=true] - Use formal/financial numerals
273
+ * @returns {string} The amount in Traditional Chinese currency words
274
+ * @throws {TypeError} If value is not a valid numeric type
275
+ * @throws {Error} If value is not a valid number format
276
+ *
277
+ * @example
278
+ * toCurrency(42) // '肆拾貳圓整'
279
+ * toCurrency(1.50) // '壹圓伍角整'
280
+ * toCurrency(42, { formal: false }) // '四十二元整'
281
+ */
282
+ function toCurrency (value, options) {
283
+ options = validateOptions(options)
284
+ const { isNegative, dollars: yuan, cents } = parseCurrencyValue(value)
285
+ const { formal = true } = options
286
+
287
+ const yuanWord = formal ? YUAN_FORMAL : YUAN_COMMON
288
+
289
+ // Split cents into jiao (tens) and fen (ones)
290
+ const jiao = cents / 10n
291
+ const fen = cents % 10n
292
+
293
+ let result = ''
294
+ if (isNegative) {
295
+ result = NEGATIVE
296
+ }
297
+
298
+ // Yuan part (always show for zero with no cents)
299
+ if (yuan > 0n || cents === 0n) {
300
+ result += integerToWords(yuan, formal)
301
+ result += yuanWord
302
+ }
303
+
304
+ // Jiao part (tens of cents)
305
+ if (jiao > 0n) {
306
+ const ones = formal ? ONES_FORMAL : ONES_COMMON
307
+ result += ones[Number(jiao)] + JIAO_FORMAL
308
+ }
309
+
310
+ // Fen part (ones of cents)
311
+ if (fen > 0n) {
312
+ const ones = formal ? ONES_FORMAL : ONES_COMMON
313
+ // Need zero if we have yuan but no jiao
314
+ if (yuan > 0n && jiao === 0n) {
315
+ result += ZERO
316
+ }
317
+ result += ones[Number(fen)] + FEN_FORMAL
318
+ } else if (jiao > 0n) {
319
+ // Has jiao but no fen - add 整
320
+ result += ZHENG_FORMAL
321
+ } else {
322
+ // Whole yuan only - add 整
323
+ result += ZHENG_FORMAL
324
+ }
325
+
326
+ return result
327
+ }
328
+
198
329
  // ============================================================================
199
330
  // Exports
200
331
  // ============================================================================
201
332
 
202
- export { toWords }
333
+ export { toCardinal, toOrdinal, toCurrency }
@@ -1,3 +0,0 @@
1
- /*! n2words/am-Latn v3.1.0 | MIT License | github.com/forzagreen/n2words */
2
- var e,t;e=this,t=function(e){"use strict";function t(e){const t="-"===e[0];t&&(e=e.slice(1));const n=e.indexOf(".");if(-1===n)return{isNegative:t,integerPart:BigInt(e)};const i=e.slice(0,n)||"0",r=e.slice(n+1);return{isNegative:t,integerPart:BigInt(i),decimalPart:r}}function n(e){const[t,n]=e.toLowerCase().split("e"),i=parseInt(n,10),r=t.indexOf("."),s=-1===r?t:t.slice(0,r)+t.slice(r+1),a=(-1===r?t.length:r)+i;return a>=s.length?s+"0".repeat(a-s.length):a<=0?"0."+"0".repeat(-a)+s:s.slice(0,a)+"."+s.slice(a)}const i=["","and","hulet","sost","arat","amist","siddist","sebat","siment","zeteny"],r=["asir","asra and","asra hulet","asra sost","asra arat","asra amist","asra siddist","asra sebat","asra siment","asra zeteny"],s=["","","haya","selasa","arba","hamsa","silsa","seba","semanya","zetena"],a="zero",o=["","shi","miliyon","billiyon"];function u(e){if(0===e)return"";const t=e%10,n=Math.floor(e/10)%10,a=Math.floor(e/100),o=[];return a>0&&o.push(i[a]+" meto"),1===n?o.push(r[t]):(n>1&&o.push(s[n]),t>0&&o.push(i[t])),o.join(" ")}e.amLatn=function(e){const{isNegative:r,integerPart:s,decimalPart:c}=function(e){const i=typeof e;if("bigint"===i)return e<0n?{isNegative:!0,integerPart:-e}:{isNegative:!1,integerPart:e};if("number"===i){if(!Number.isFinite(e))throw new Error("Number must be finite (NaN and Infinity are not supported)");return Number.isSafeInteger(e)?e<0?{isNegative:!0,integerPart:BigInt(-e)}:{isNegative:!1,integerPart:BigInt(e)}:t(function(e){const t=e.toString();return t.includes("e")||t.includes("E")?n(t):t}(e))}if("string"===i)return t(function(e){const t=e.trim();if(0===t.length||Number.isNaN(Number(t)))throw new Error(`Invalid number format: "${e}"`);return t.includes("e")||t.includes("E")?n(t):t}(e));throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${i}`)}(e);let l="";return r&&(l="asitegna "),l+=0n===(f=s)?a:f<1000n?u(Number(f)):function(e){const t=e.toString(),n=t.length,i=[],r=n%3;let s=0;for(r>0&&(i.push(Number(t.slice(0,r))),s=r);s<n;)i.push(Number(t.slice(s,s+3))),s+=3;const a=[];let c=i.length-1;for(let e=0;e<i.length;e++){const t=i[e];if(0!==t){const e=o[c]||"";a.push(0===c?u(t):u(t)+" "+e)}c--}return a.join(" ")}(f),c&&(l+=" netib "+function(e){const t=[];for(const n of e){const e=parseInt(n,10);t.push(0===e?a:i[e])}return t.join(" ")}(c)),l;var f}},"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).n2words=e.n2words||{});
3
- //# sourceMappingURL=am-Latn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"am-Latn.js","sources":["../../lib/utils/parse-numeric.js","../../lib/languages/am-Latn.js"],"sourcesContent":["/**\n * Numeric value parsing utility.\n * Transforms user input (number, string, or bigint) into normalized components.\n * @module parse-numeric\n */\n\n/**\n * Parses a numeric value into its components.\n * @param {number|string|bigint} value\n * @returns {{isNegative: boolean, integerPart: bigint, decimalPart?: string}}\n * @throws {TypeError} If value is not number, string, or bigint\n * @throws {Error} If value is not a valid number format\n */\nexport function parseNumericValue (value) {\n const type = typeof value\n\n // BigInt: simplest case\n if (type === 'bigint') {\n return value < 0n\n ? { isNegative: true, integerPart: -value }\n : { isNegative: false, integerPart: value }\n }\n\n // Number: fast path for safe integers\n if (type === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Number must be finite (NaN and Infinity are not supported)')\n }\n if (Number.isSafeInteger(value)) {\n return value < 0\n ? { isNegative: true, integerPart: BigInt(-value) }\n : { isNegative: false, integerPart: BigInt(value) }\n }\n return parseNumericString(numberToString(value))\n }\n\n // String input\n if (type === 'string') {\n return parseNumericString(normalizeString(value))\n }\n\n throw new TypeError(\n `Invalid value type: expected number, string, or bigint, received ${type}`\n )\n}\n\n/**\n * Converts a number to decimal string, expanding scientific notation if needed.\n */\nfunction numberToString (value) {\n const str = value.toString()\n return (str.includes('e') || str.includes('E'))\n ? expandScientificNotation(str)\n : str\n}\n\n/**\n * Validates and normalizes a string numeric input.\n */\nfunction normalizeString (value) {\n const trimmed = value.trim()\n if (trimmed.length === 0 || Number.isNaN(Number(trimmed))) {\n throw new Error(`Invalid number format: \"${value}\"`)\n }\n return (trimmed.includes('e') || trimmed.includes('E'))\n ? expandScientificNotation(trimmed)\n : trimmed\n}\n\n/**\n * Parses a normalized numeric string into components.\n */\nfunction parseNumericString (str) {\n const isNegative = str[0] === '-'\n if (isNegative) str = str.slice(1)\n\n const dotIndex = str.indexOf('.')\n if (dotIndex === -1) {\n return { isNegative, integerPart: BigInt(str) }\n }\n\n const integerStr = str.slice(0, dotIndex) || '0'\n const decimalPart = str.slice(dotIndex + 1)\n return { isNegative, integerPart: BigInt(integerStr), decimalPart }\n}\n\n/**\n * Expands scientific notation to decimal form (e.g., \"1e21\" → \"1000...\").\n */\nfunction expandScientificNotation (str) {\n const [mantissa, expStr] = str.toLowerCase().split('e')\n const exp = parseInt(expStr, 10)\n\n const dotIndex = mantissa.indexOf('.')\n const digits = dotIndex === -1\n ? mantissa\n : mantissa.slice(0, dotIndex) + mantissa.slice(dotIndex + 1)\n const integerLength = dotIndex === -1 ? mantissa.length : dotIndex\n const newDotPosition = integerLength + exp\n\n if (newDotPosition >= digits.length) {\n return digits + '0'.repeat(newDotPosition - digits.length)\n }\n if (newDotPosition <= 0) {\n return '0.' + '0'.repeat(-newDotPosition) + digits\n }\n return digits.slice(0, newDotPosition) + '.' + digits.slice(newDotPosition)\n}\n","/**\n * Amharic Latin language converter - Functional Implementation\n *\n * Self-contained module with its own input validation, ready for subpath exports.\n * Latin/ASCII romanization of Amharic numerals.\n *\n * Key features:\n * - Romanized numerals (and, hulet, sost)\n * - Teens formed with \"asra\" prefix\n * - Keeps \"one\" before hundred: \"and meto\" (100)\n * - Short scale naming\n * - Per-digit decimal reading\n */\n\nimport { parseNumericValue } from '../utils/parse-numeric.js'\n\n// ============================================================================\n// Vocabulary\n// ============================================================================\n\nconst ONES = ['', 'and', 'hulet', 'sost', 'arat', 'amist', 'siddist', 'sebat', 'siment', 'zeteny']\nconst TEENS = ['asir', 'asra and', 'asra hulet', 'asra sost', 'asra arat', 'asra amist', 'asra siddist', 'asra sebat', 'asra siment', 'asra zeteny']\nconst TENS = ['', '', 'haya', 'selasa', 'arba', 'hamsa', 'silsa', 'seba', 'semanya', 'zetena']\n\nconst HUNDRED = 'meto'\nconst THOUSAND = 'shi'\n\nconst ZERO = 'zero'\nconst NEGATIVE = 'asitegna'\nconst DECIMAL_SEP = 'netib'\n\n// Short scale\nconst SCALE_WORDS = ['', THOUSAND, 'miliyon', 'billiyon']\n\n// ============================================================================\n// Precomputed Lookup Table\n// ============================================================================\n\nfunction buildSegment (n) {\n if (n === 0) return ''\n\n const ones = n % 10\n const tensDigit = Math.floor(n / 10) % 10\n const hundredsDigit = Math.floor(n / 100)\n\n const parts = []\n\n // Amharic keeps \"one\" before hundred: \"and meto\" (100)\n if (hundredsDigit > 0) {\n parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)\n }\n\n if (tensDigit === 1) {\n parts.push(TEENS[ones])\n } else {\n if (tensDigit > 1) {\n parts.push(TENS[tensDigit])\n }\n if (ones > 0) {\n parts.push(ONES[ones])\n }\n }\n\n return parts.join(' ')\n}\n\n// ============================================================================\n// Conversion Functions\n// ============================================================================\n\nfunction integerToWords (n) {\n if (n === 0n) return ZERO\n\n if (n < 1000n) {\n return buildSegment(Number(n))\n }\n\n return buildLargeNumberWords(n)\n}\n\nfunction buildLargeNumberWords (n) {\n const numStr = n.toString()\n const len = numStr.length\n\n const segments = []\n const segmentSize = 3\n\n const remainderLen = len % segmentSize\n let pos = 0\n if (remainderLen > 0) {\n segments.push(Number(numStr.slice(0, remainderLen)))\n pos = remainderLen\n }\n while (pos < len) {\n segments.push(Number(numStr.slice(pos, pos + segmentSize)))\n pos += segmentSize\n }\n\n const parts = []\n let scaleIndex = segments.length - 1\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n\n if (segment !== 0) {\n const scaleWord = SCALE_WORDS[scaleIndex] || ''\n\n if (scaleIndex === 0) {\n parts.push(buildSegment(segment))\n } else {\n parts.push(buildSegment(segment) + ' ' + scaleWord)\n }\n }\n\n scaleIndex--\n }\n\n return parts.join(' ')\n}\n\nfunction decimalPartToWords (decimalPart) {\n // Per-digit decimal reading\n const digits = []\n for (const char of decimalPart) {\n const d = parseInt(char, 10)\n digits.push(d === 0 ? ZERO : ONES[d])\n }\n return digits.join(' ')\n}\n\n/**\n * Converts a numeric value to Amharic (Latin script) words.\n *\n * @param {number | string | bigint} value - The numeric value to convert\n * @returns {string} The number in Amharic Latin words\n */\nfunction toWords (value) {\n const { isNegative, integerPart, decimalPart } = parseNumericValue(value)\n\n let result = ''\n\n if (isNegative) {\n result = NEGATIVE + ' '\n }\n\n result += integerToWords(integerPart)\n\n if (decimalPart) {\n result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)\n }\n\n return result\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { toWords }\n"],"names":["parseNumericString","str","isNegative","slice","dotIndex","indexOf","integerPart","BigInt","integerStr","decimalPart","expandScientificNotation","mantissa","expStr","toLowerCase","split","exp","parseInt","digits","newDotPosition","length","repeat","ONES","TEENS","TENS","ZERO","SCALE_WORDS","buildSegment","n","ones","tensDigit","Math","floor","hundredsDigit","parts","push","join","value","type","Number","isFinite","Error","isSafeInteger","toString","includes","numberToString","trimmed","trim","isNaN","normalizeString","TypeError","parseNumericValue","result","NEGATIVE","numStr","len","segments","remainderLen","pos","scaleIndex","i","segment","scaleWord","buildLargeNumberWords","char","d","decimalPartToWords"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- /*! n2words/am v3.1.0 | MIT License | github.com/forzagreen/n2words */
2
- var e,t;e=this,t=function(e){"use strict";function t(e){const t="-"===e[0];t&&(e=e.slice(1));const n=e.indexOf(".");if(-1===n)return{isNegative:t,integerPart:BigInt(e)};const i=e.slice(0,n)||"0",r=e.slice(n+1);return{isNegative:t,integerPart:BigInt(i),decimalPart:r}}function n(e){const[t,n]=e.toLowerCase().split("e"),i=parseInt(n,10),r=t.indexOf("."),o=-1===r?t:t.slice(0,r)+t.slice(r+1),s=(-1===r?t.length:r)+i;return s>=o.length?o+"0".repeat(s-o.length):s<=0?"0."+"0".repeat(-s)+o:o.slice(0,s)+"."+o.slice(s)}const i=["","አንድ","ሁለት","ሶስት","አራት","አምስት","ስድስት","ሰባት","ስምንት","ዘጠኝ"],r=["አስር","አስራ አንድ","አስራ ሁለት","አስራ ሶስት","አስራ አራት","አስራ አምስት","አስራ ስድስት","አስራ ሰባት","አስራ ስምንት","አስራ ዘጠኝ"],o=["","","ሃያ","ሰላሳ","አርባ","ሃምሳ","ስልሳ","ሰባ","ሰማንያ","ዘጠና"],s=["","ሺ","ሚሊዮን","ቢሊዮን"];function u(e){if(0===e)return"";const t=e%10,n=Math.floor(e/10)%10,s=Math.floor(e/100),u=[];return s>0&&u.push(i[s]+" መቶ"),1===n?u.push(r[t]):(n>1&&u.push(o[n]),t>0&&u.push(i[t])),u.join(" ")}e.am=function(e){const{isNegative:r,integerPart:o,decimalPart:c}=function(e){const i=typeof e;if("bigint"===i)return e<0n?{isNegative:!0,integerPart:-e}:{isNegative:!1,integerPart:e};if("number"===i){if(!Number.isFinite(e))throw new Error("Number must be finite (NaN and Infinity are not supported)");return Number.isSafeInteger(e)?e<0?{isNegative:!0,integerPart:BigInt(-e)}:{isNegative:!1,integerPart:BigInt(e)}:t(function(e){const t=e.toString();return t.includes("e")||t.includes("E")?n(t):t}(e))}if("string"===i)return t(function(e){const t=e.trim();if(0===t.length||Number.isNaN(Number(t)))throw new Error(`Invalid number format: "${e}"`);return t.includes("e")||t.includes("E")?n(t):t}(e));throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${i}`)}(e);let f="";return r&&(f="አሉታዊ "),f+=0n===(a=o)?"ዜሮ":a<1000n?u(Number(a)):function(e){const t=e.toString(),n=t.length,i=[],r=n%3;let o=0;for(r>0&&(i.push(Number(t.slice(0,r))),o=r);o<n;)i.push(Number(t.slice(o,o+3))),o+=3;const c=[];let f=i.length-1;for(let e=0;e<i.length;e++){const t=i[e];if(0!==t){const e=s[f]||"";c.push(0===f?u(t):u(t)+" "+e)}f--}return c.join(" ")}(a),c&&(f+=" ነጥብ "+function(e){const t=[];for(const n of e){const e=parseInt(n,10);t.push(0===e?"ዜሮ":i[e])}return t.join(" ")}(c)),f;var a}},"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).n2words=e.n2words||{});
3
- //# sourceMappingURL=am.js.map