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
package/src/yo-NG.js ADDED
@@ -0,0 +1,403 @@
1
+ /**
2
+ * Yoruba (Nigeria) language converter
3
+ *
4
+ * CLDR: yo-NG | Yoruba as used in Nigeria
5
+ *
6
+ * Yoruba uses a complex vigesimal (base-20) system with:
7
+ * - Additive patterns: 1-4 added to decade (lé = "plus")
8
+ * - Subtractive patterns: 5-9 subtracted from next decade (dín = "minus")
9
+ * - Odd decades (30,50,70,90) formed by subtracting 10 from next even decade
10
+ * - Even decades (20,40,60,80,100) are multiples of 20
11
+ *
12
+ * Examples:
13
+ * - 21 = ọ̀kan lé lógún (1 + 20)
14
+ * - 15 = àrùndínlógún (20 - 5)
15
+ * - 50 = àádọ́ta (60 - 10)
16
+ * - 45 = àrùndínláàádọ́ta (50 - 5)
17
+ */
18
+
19
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
20
+ import { parseCurrencyValue } from './utils/parse-currency.js'
21
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
22
+
23
+ // ============================================================================
24
+ // Vocabulary (module-level constants)
25
+ // ============================================================================
26
+
27
+ // Basic numbers 1-10
28
+ const ONES = [
29
+ '',
30
+ 'ọ̀kan', // 1
31
+ 'èjì', // 2
32
+ 'ẹ̀ta', // 3
33
+ 'ẹ̀rin', // 4
34
+ 'àrùn', // 5
35
+ 'ẹ̀fà', // 6
36
+ 'èje', // 7
37
+ 'ẹ̀jọ', // 8
38
+ 'ẹ̀sán', // 9
39
+ 'ẹ̀wá' // 10
40
+ ]
41
+
42
+ // Numbers 11-14 (additive: X + 10, using "lá")
43
+ const TEENS_ADD = [
44
+ '',
45
+ 'ọ̀kànlá', // 11 = 1 + 10
46
+ 'èjìlá', // 12 = 2 + 10
47
+ 'ẹ̀talá', // 13 = 3 + 10
48
+ 'ẹ̀rinlá' // 14 = 4 + 10
49
+ ]
50
+
51
+ // Numbers 15-19 (subtractive: 20 - X, using "dín")
52
+ const TEENS_SUB = [
53
+ 'àrùndínlógún', // 15 = 20 - 5
54
+ 'ẹ̀rìndínlógún', // 16 = 20 - 4
55
+ 'ẹ̀tadínlógún', // 17 = 20 - 3
56
+ 'èjìdínlógún', // 18 = 20 - 2
57
+ 'ọ̀kàndínlógún' // 19 = 20 - 1
58
+ ]
59
+
60
+ // Decades (base-20 structure)
61
+ // Even decades are multiples of 20
62
+ // Odd decades subtract 10 from next even decade
63
+ const DECADES = {
64
+ 20: 'ogún', // 20 = 20 × 1
65
+ 30: 'ọgbọ̀n', // 30 = 20 + 10 (special word)
66
+ 40: 'ogójì', // 40 = 20 × 2
67
+ 50: 'àádọ́ta', // 50 = 60 - 10
68
+ 60: 'ogóta', // 60 = 20 × 3
69
+ 70: 'àádọ́rin', // 70 = 80 - 10
70
+ 80: 'ogórin', // 80 = 20 × 4
71
+ 90: 'àádọ́rùn', // 90 = 100 - 10
72
+ 100: 'ọgọ́rùn' // 100 = 20 × 5
73
+ }
74
+
75
+ // Prefixes for adding to decades (lé lógún, lé lọgbọ̀n, etc.)
76
+ const DECADE_ADD_SUFFIX = {
77
+ 20: 'lógún',
78
+ 30: 'lọgbọ̀n',
79
+ 40: 'lógójì',
80
+ 50: 'láàádọ́ta',
81
+ 60: 'lógóta',
82
+ 70: 'láàádọ́rin',
83
+ 80: 'lógórin',
84
+ 90: 'láàádọ́rùn',
85
+ 100: 'lọ́gọ́rùn'
86
+ }
87
+
88
+ // Prefixes for subtracting from decades (dín lógójì, etc.)
89
+ const DECADE_SUB_SUFFIX = {
90
+ 20: 'dínlógún',
91
+ 30: 'dínlọgbọ̀n',
92
+ 40: 'dínlógójì',
93
+ 50: 'dínláàádọ́ta',
94
+ 60: 'dínlógóta',
95
+ 70: 'dínláàádọ́rin',
96
+ 80: 'dínlógórin',
97
+ 90: 'dínláàádọ́rùn',
98
+ 100: 'dínlọ́gọ́rùn'
99
+ }
100
+
101
+ // Scale words
102
+ const HUNDRED = 'ọgọ́rùn'
103
+ const TWO_HUNDRED = 'igba' // 200 (special word, historically 200 cowries)
104
+ const FOUR_HUNDRED = 'irinwó' // 400 (20 × 20)
105
+ const THOUSAND = 'ẹgbẹ̀rún' // 1000
106
+ const TEN_THOUSAND = 'ẹgbàárùn' // 10,000 (special)
107
+ const TWENTY_THOUSAND = 'ọ̀kẹ́' // 20,000 (bag of cowries)
108
+ const MILLION = 'mílíọ̀nù' // million (loanword)
109
+
110
+ const ZERO = 'òdo'
111
+ const NEGATIVE = 'àìní'
112
+ const DECIMAL_SEP = 'àmì'
113
+ const AND = 'ó lé' // "and" / "plus" connector
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
+
132
+ // ============================================================================
133
+ // Segment Building
134
+ // ============================================================================
135
+
136
+ /**
137
+ * Builds word for numbers 0-99
138
+ */
139
+ function buildUnder100 (n) {
140
+ if (n === 0) return ''
141
+ if (n <= 10) return ONES[n]
142
+
143
+ // 11-14: additive from 10
144
+ if (n <= 14) return TEENS_ADD[n - 10]
145
+
146
+ // 15-19: subtractive from 20
147
+ if (n <= 19) return TEENS_SUB[n - 15]
148
+
149
+ // Exact decades
150
+ if (n % 10 === 0) return DECADES[n]
151
+
152
+ const decade = Math.trunc(n / 10) * 10
153
+ const unit = n % 10
154
+
155
+ // 1-4 are added to current decade (21 = 1 + 20, not 1 + 30)
156
+ if (unit <= 4) {
157
+ return ONES[unit] + ' lé ' + DECADE_ADD_SUFFIX[decade]
158
+ }
159
+
160
+ // 5-9 are subtracted from next decade
161
+ const nextDecade = decade + 10
162
+ const subtractAmount = 10 - unit
163
+ return ONES[subtractAmount] + DECADE_SUB_SUFFIX[nextDecade]
164
+ }
165
+
166
+ // ============================================================================
167
+ // Conversion Functions
168
+ // ============================================================================
169
+
170
+ /**
171
+ * Converts hundreds (100-999)
172
+ */
173
+ function convertHundreds (n) {
174
+ if (n < 100) return buildUnder100(n)
175
+
176
+ const hundreds = Math.trunc(n / 100)
177
+ const remainder = n % 100
178
+
179
+ let result
180
+
181
+ // Special cases for 200 and 400
182
+ if (hundreds === 2 && remainder === 0) {
183
+ return TWO_HUNDRED
184
+ }
185
+ if (hundreds === 4 && remainder === 0) {
186
+ return FOUR_HUNDRED
187
+ }
188
+
189
+ // Build hundreds
190
+ if (hundreds === 1) {
191
+ result = HUNDRED
192
+ } else if (hundreds === 2) {
193
+ result = TWO_HUNDRED
194
+ } else if (hundreds === 4) {
195
+ result = FOUR_HUNDRED
196
+ } else {
197
+ // Other hundreds: X ọgọ́rùn
198
+ result = ONES[hundreds] + ' ' + HUNDRED
199
+ }
200
+
201
+ if (remainder > 0) {
202
+ result += ' ' + AND + ' ' + buildUnder100(remainder)
203
+ }
204
+
205
+ return result
206
+ }
207
+
208
+ /**
209
+ * Converts a non-negative integer to Yoruba words.
210
+ *
211
+ * @param {bigint} n - Non-negative integer to convert
212
+ * @returns {string} Yoruba words
213
+ */
214
+ function integerToWords (n) {
215
+ if (n === 0n) return ZERO
216
+
217
+ // Fast path: numbers < 100
218
+ if (n < 100n) {
219
+ return buildUnder100(Number(n))
220
+ }
221
+
222
+ // Numbers < 1000
223
+ if (n < 1000n) {
224
+ return convertHundreds(Number(n))
225
+ }
226
+
227
+ // Build from segments
228
+ const parts = []
229
+ let remaining = n
230
+
231
+ // Millions
232
+ if (remaining >= 1_000_000n) {
233
+ const millions = remaining / 1_000_000n
234
+ remaining = remaining % 1_000_000n
235
+ if (millions === 1n) {
236
+ parts.push(MILLION + ' kan')
237
+ } else {
238
+ parts.push(MILLION + ' ' + integerToWords(millions))
239
+ }
240
+ }
241
+
242
+ // Thousands
243
+ if (remaining >= 1000n) {
244
+ const thousands = remaining / 1000n
245
+ remaining = remaining % 1000n
246
+
247
+ if (thousands === 1n) {
248
+ parts.push(THOUSAND + ' kan')
249
+ } else if (thousands === 10n) {
250
+ parts.push(TEN_THOUSAND)
251
+ } else if (thousands === 20n) {
252
+ parts.push(TWENTY_THOUSAND)
253
+ } else if (thousands < 100n) {
254
+ parts.push(THOUSAND + ' ' + buildUnder100(Number(thousands)))
255
+ } else {
256
+ parts.push(THOUSAND + ' ' + convertHundreds(Number(thousands)))
257
+ }
258
+ }
259
+
260
+ // Hundreds and below
261
+ if (remaining > 0n) {
262
+ if (remaining < 100n) {
263
+ if (parts.length > 0) {
264
+ parts.push(AND + ' ' + buildUnder100(Number(remaining)))
265
+ } else {
266
+ parts.push(buildUnder100(Number(remaining)))
267
+ }
268
+ } else {
269
+ if (parts.length > 0) {
270
+ parts.push(AND + ' ' + convertHundreds(Number(remaining)))
271
+ } else {
272
+ parts.push(convertHundreds(Number(remaining)))
273
+ }
274
+ }
275
+ }
276
+
277
+ return parts.join(', ')
278
+ }
279
+
280
+ /**
281
+ * Converts decimal digits to Yoruba words.
282
+ *
283
+ * @param {string} decimalPart - Decimal digits
284
+ * @returns {string} Yoruba words for decimal
285
+ */
286
+ function decimalPartToWords (decimalPart) {
287
+ const parts = []
288
+
289
+ for (const digit of decimalPart) {
290
+ const d = parseInt(digit, 10)
291
+ parts.push(d === 0 ? ZERO : ONES[d])
292
+ }
293
+
294
+ return parts.join(' ')
295
+ }
296
+
297
+ /**
298
+ * Converts a numeric value to Yoruba words.
299
+ *
300
+ * @param {number | string | bigint} value - The numeric value to convert
301
+ * @returns {string} The number in Yoruba words
302
+ */
303
+ function toCardinal (value) {
304
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
305
+
306
+ let result = ''
307
+
308
+ if (isNegative) {
309
+ result = NEGATIVE + ' '
310
+ }
311
+
312
+ result += integerToWords(integerPart)
313
+
314
+ if (decimalPart) {
315
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
316
+ }
317
+
318
+ return result
319
+ }
320
+
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;