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.
- package/CHANGELOG.md +59 -0
- package/LICENSE +1 -1
- package/README.md +64 -184
- package/dist/am-ET.js +2 -0
- package/dist/am-ET.umd.js +2 -0
- package/dist/am-Latn-ET.js +2 -0
- package/dist/am-Latn-ET.umd.js +2 -0
- package/dist/ar-SA.js +2 -0
- package/dist/ar-SA.umd.js +2 -0
- package/dist/az-AZ.js +2 -0
- package/dist/az-AZ.umd.js +2 -0
- package/dist/bn-BD.js +2 -0
- package/dist/bn-BD.umd.js +2 -0
- package/dist/cs-CZ.js +2 -0
- package/dist/cs-CZ.umd.js +2 -0
- package/dist/da-DK.js +2 -0
- package/dist/da-DK.umd.js +2 -0
- package/dist/de-DE.js +2 -0
- package/dist/de-DE.umd.js +2 -0
- package/dist/el-GR.js +2 -0
- package/dist/el-GR.umd.js +2 -0
- package/dist/en-AU.js +2 -0
- package/dist/en-AU.umd.js +2 -0
- package/dist/en-BD.js +2 -0
- package/dist/en-BD.umd.js +2 -0
- package/dist/en-CA.js +2 -0
- package/dist/en-CA.umd.js +2 -0
- package/dist/en-GB.js +2 -0
- package/dist/en-GB.umd.js +2 -0
- package/dist/en-GH.js +2 -0
- package/dist/en-GH.umd.js +2 -0
- package/dist/en-IE.js +2 -0
- package/dist/en-IE.umd.js +2 -0
- package/dist/en-IN.js +2 -0
- package/dist/en-IN.umd.js +2 -0
- package/dist/en-KE.js +2 -0
- package/dist/en-KE.umd.js +2 -0
- package/dist/en-MY.js +2 -0
- package/dist/en-MY.umd.js +2 -0
- package/dist/en-NG.js +2 -0
- package/dist/en-NG.umd.js +2 -0
- package/dist/en-NZ.js +2 -0
- package/dist/en-NZ.umd.js +2 -0
- package/dist/en-PH.js +2 -0
- package/dist/en-PH.umd.js +2 -0
- package/dist/en-PK.js +2 -0
- package/dist/en-PK.umd.js +2 -0
- package/dist/en-SG.js +2 -0
- package/dist/en-SG.umd.js +2 -0
- package/dist/en-US.js +2 -0
- package/dist/en-US.umd.js +2 -0
- package/dist/en-ZA.js +2 -0
- package/dist/en-ZA.umd.js +2 -0
- package/dist/es-ES.js +2 -0
- package/dist/es-ES.umd.js +2 -0
- package/dist/es-MX.js +2 -0
- package/dist/es-MX.umd.js +2 -0
- package/dist/es-US.js +2 -0
- package/dist/es-US.umd.js +2 -0
- package/dist/fa-IR.js +2 -0
- package/dist/fa-IR.umd.js +2 -0
- package/dist/fi-FI.js +2 -0
- package/dist/fi-FI.umd.js +2 -0
- package/dist/fil-PH.js +2 -0
- package/dist/fil-PH.umd.js +2 -0
- package/dist/fr-BE.js +2 -0
- package/dist/fr-BE.umd.js +2 -0
- package/dist/fr-FR.js +2 -0
- package/dist/fr-FR.umd.js +2 -0
- package/dist/gu-IN.js +2 -0
- package/dist/gu-IN.umd.js +2 -0
- package/dist/ha-NG.js +2 -0
- package/dist/ha-NG.umd.js +2 -0
- package/dist/hbo-IL.js +2 -0
- package/dist/hbo-IL.umd.js +2 -0
- package/dist/he-IL.js +2 -0
- package/dist/he-IL.umd.js +2 -0
- package/dist/hi-IN.js +2 -0
- package/dist/hi-IN.umd.js +2 -0
- package/dist/hr-HR.js +2 -0
- package/dist/hr-HR.umd.js +2 -0
- package/dist/hu-HU.js +2 -0
- package/dist/hu-HU.umd.js +2 -0
- package/dist/id-ID.js +2 -0
- package/dist/id-ID.umd.js +2 -0
- package/dist/it-IT.js +2 -0
- package/dist/it-IT.umd.js +2 -0
- package/dist/ja-JP.js +2 -0
- package/dist/ja-JP.umd.js +2 -0
- package/dist/ka-GE.js +2 -0
- package/dist/ka-GE.umd.js +2 -0
- package/dist/kn-IN.js +2 -0
- package/dist/kn-IN.umd.js +2 -0
- package/dist/ko-KR.js +2 -0
- package/dist/ko-KR.umd.js +2 -0
- package/dist/lt-LT.js +2 -0
- package/dist/lt-LT.umd.js +2 -0
- package/dist/lv-LV.js +2 -0
- package/dist/lv-LV.umd.js +2 -0
- package/dist/mr-IN.js +2 -0
- package/dist/mr-IN.umd.js +2 -0
- package/dist/ms-MY.js +2 -0
- package/dist/ms-MY.umd.js +2 -0
- package/dist/nb-NO.js +2 -0
- package/dist/nb-NO.umd.js +2 -0
- package/dist/nl-NL.js +2 -0
- package/dist/nl-NL.umd.js +2 -0
- package/dist/pa-IN.js +2 -0
- package/dist/pa-IN.umd.js +2 -0
- package/dist/pl-PL.js +2 -0
- package/dist/pl-PL.umd.js +2 -0
- package/dist/pt-PT.js +2 -0
- package/dist/pt-PT.umd.js +2 -0
- package/dist/ro-RO.js +2 -0
- package/dist/ro-RO.umd.js +2 -0
- package/dist/ru-RU.js +2 -0
- package/dist/ru-RU.umd.js +2 -0
- package/dist/sr-Cyrl-RS.js +2 -0
- package/dist/sr-Cyrl-RS.umd.js +2 -0
- package/dist/sr-Latn-RS.js +2 -0
- package/dist/sr-Latn-RS.umd.js +2 -0
- package/dist/sv-SE.js +2 -0
- package/dist/sv-SE.umd.js +2 -0
- package/dist/sw-KE.js +2 -0
- package/dist/sw-KE.umd.js +2 -0
- package/dist/ta-IN.js +2 -0
- package/dist/ta-IN.umd.js +2 -0
- package/dist/te-IN.js +2 -0
- package/dist/te-IN.umd.js +2 -0
- package/dist/th-TH.js +2 -0
- package/dist/th-TH.umd.js +2 -0
- package/dist/tr-TR.js +2 -0
- package/dist/tr-TR.umd.js +2 -0
- package/dist/uk-UA.js +2 -0
- package/dist/uk-UA.umd.js +2 -0
- package/dist/ur-PK.js +2 -0
- package/dist/ur-PK.umd.js +2 -0
- package/dist/vi-VN.js +2 -0
- package/dist/vi-VN.umd.js +2 -0
- package/dist/yo-NG.js +2 -0
- package/dist/yo-NG.umd.js +2 -0
- package/dist/zh-Hans-CN.js +2 -0
- package/dist/zh-Hans-CN.umd.js +2 -0
- package/dist/zh-Hant-TW.js +2 -0
- package/dist/zh-Hant-TW.umd.js +2 -0
- package/package.json +47 -82
- package/src/am-ET.d.ts +40 -0
- package/src/am-ET.js +269 -0
- package/src/am-Latn-ET.d.ts +35 -0
- package/src/am-Latn-ET.js +264 -0
- package/src/ar-SA.d.ts +49 -0
- package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
- package/src/az-AZ.d.ts +37 -0
- package/src/az-AZ.js +312 -0
- package/src/bn-BD.d.ts +36 -0
- package/src/bn-BD.js +270 -0
- package/src/cs-CZ.d.ts +49 -0
- package/{lib/languages/cs.js → src/cs-CZ.js} +249 -40
- package/src/da-DK.d.ts +44 -0
- package/{lib/languages/da.js → src/da-DK.js} +136 -23
- package/src/de-DE.d.ts +57 -0
- package/src/de-DE.js +603 -0
- package/src/el-GR.d.ts +40 -0
- package/src/el-GR.js +418 -0
- package/src/en-AU.d.ts +47 -0
- package/src/en-AU.js +423 -0
- package/src/en-BD.d.ts +49 -0
- package/src/en-BD.js +415 -0
- package/src/en-CA.d.ts +63 -0
- package/src/en-CA.js +518 -0
- package/src/en-GB.d.ts +56 -0
- package/src/en-GB.js +469 -0
- package/src/en-GH.d.ts +11 -0
- package/src/en-GH.js +345 -0
- package/src/en-IE.d.ts +56 -0
- package/src/en-IE.js +479 -0
- package/src/en-IN.d.ts +49 -0
- package/src/en-IN.js +415 -0
- package/src/en-KE.d.ts +11 -0
- package/src/en-KE.js +345 -0
- package/src/en-MY.d.ts +11 -0
- package/src/en-MY.js +347 -0
- package/src/en-NG.d.ts +56 -0
- package/src/en-NG.js +479 -0
- package/src/en-NZ.d.ts +11 -0
- package/src/en-NZ.js +375 -0
- package/src/en-PH.d.ts +11 -0
- package/src/en-PH.js +345 -0
- package/src/en-PK.d.ts +49 -0
- package/src/en-PK.js +415 -0
- package/src/en-SG.d.ts +11 -0
- package/src/en-SG.js +345 -0
- package/src/en-US.d.ts +63 -0
- package/src/en-US.js +516 -0
- package/src/en-ZA.d.ts +56 -0
- package/src/en-ZA.js +478 -0
- package/src/es-ES.d.ts +65 -0
- package/src/es-ES.js +541 -0
- package/src/es-MX.d.ts +58 -0
- package/{lib/languages/es.js → src/es-MX.js} +237 -47
- package/src/es-US.d.ts +58 -0
- package/src/es-US.js +446 -0
- package/src/fa-IR.d.ts +38 -0
- package/src/fa-IR.js +246 -0
- package/src/fi-FI.d.ts +46 -0
- package/src/fi-FI.js +379 -0
- package/src/fil-PH.d.ts +37 -0
- package/{lib/languages/fil.js → src/fil-PH.js} +149 -24
- package/src/fr-BE.d.ts +49 -0
- package/src/fr-BE.js +453 -0
- package/src/fr-FR.d.ts +63 -0
- package/{lib/languages/fr.js → src/fr-FR.js} +200 -47
- package/src/gu-IN.d.ts +35 -0
- package/src/gu-IN.js +259 -0
- package/src/ha-NG.d.ts +37 -0
- package/{lib/languages/ha.js → src/ha-NG.js} +110 -16
- package/src/hbo-IL.d.ts +39 -0
- package/{lib/languages/hbo.js → src/hbo-IL.js} +217 -43
- package/src/he-IL.d.ts +37 -0
- package/src/he-IL.js +537 -0
- package/src/hi-IN.d.ts +36 -0
- package/src/hi-IN.js +280 -0
- package/src/hr-HR.d.ts +42 -0
- package/src/hr-HR.js +463 -0
- package/src/hu-HU.d.ts +38 -0
- package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
- package/src/id-ID.d.ts +38 -0
- package/{lib/languages/id.js → src/id-ID.js} +106 -20
- package/src/it-IT.d.ts +59 -0
- package/src/it-IT.js +506 -0
- package/src/ja-JP.d.ts +49 -0
- package/{lib/languages/ja.js → src/ja-JP.js} +119 -32
- package/src/ka-GE.d.ts +44 -0
- package/src/ka-GE.js +393 -0
- package/src/kn-IN.d.ts +35 -0
- package/{lib/languages/kn.js → src/kn-IN.js} +156 -34
- package/src/ko-KR.d.ts +45 -0
- package/{lib/languages/ko.js → src/ko-KR.js} +99 -24
- package/src/lt-LT.d.ts +49 -0
- package/src/lt-LT.js +543 -0
- package/src/lv-LV.d.ts +49 -0
- package/src/lv-LV.js +595 -0
- package/src/mr-IN.d.ts +36 -0
- package/src/mr-IN.js +260 -0
- package/src/ms-MY.d.ts +37 -0
- package/{lib/languages/ms.js → src/ms-MY.js} +118 -20
- package/src/nb-NO.d.ts +44 -0
- package/{lib/languages/nb.js → src/nb-NO.js} +165 -33
- package/src/nl-NL.d.ts +54 -0
- package/{lib/languages/nl.js → src/nl-NL.js} +271 -47
- package/src/pa-IN.d.ts +36 -0
- package/src/pa-IN.js +268 -0
- package/src/pl-PL.d.ts +55 -0
- package/src/pl-PL.js +585 -0
- package/src/pt-PT.d.ts +45 -0
- package/src/pt-PT.js +514 -0
- package/src/ro-RO.d.ts +44 -0
- package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
- package/src/ru-RU.d.ts +50 -0
- package/src/ru-RU.js +535 -0
- package/src/sr-Cyrl-RS.d.ts +49 -0
- package/src/sr-Cyrl-RS.js +503 -0
- package/src/sr-Latn-RS.d.ts +49 -0
- package/src/sr-Latn-RS.js +503 -0
- package/src/sv-SE.d.ts +44 -0
- package/{lib/languages/sv.js → src/sv-SE.js} +149 -34
- package/src/sw-KE.d.ts +37 -0
- package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
- package/src/ta-IN.d.ts +35 -0
- package/{lib/languages/ta.js → src/ta-IN.js} +163 -47
- package/src/te-IN.d.ts +35 -0
- package/{lib/languages/te.js → src/te-IN.js} +147 -46
- package/src/th-TH.d.ts +38 -0
- package/{lib/languages/th.js → src/th-TH.js} +99 -6
- package/src/tr-TR.d.ts +48 -0
- package/src/tr-TR.js +397 -0
- package/src/uk-UA.d.ts +42 -0
- package/src/uk-UA.js +463 -0
- package/src/ur-PK.d.ts +36 -0
- package/src/ur-PK.js +268 -0
- package/src/utils/expand-scientific.d.ts +32 -0
- package/src/utils/expand-scientific.js +65 -0
- package/src/utils/parse-cardinal.d.ts +14 -0
- package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
- package/src/utils/parse-currency.d.ts +14 -0
- package/src/utils/parse-currency.js +91 -0
- package/src/utils/parse-ordinal.d.ts +10 -0
- package/src/utils/parse-ordinal.js +103 -0
- package/src/vi-VN.d.ts +48 -0
- package/{lib/languages/vi.js → src/vi-VN.js} +124 -53
- package/src/yo-NG.d.ts +37 -0
- package/src/yo-NG.js +403 -0
- package/src/zh-Hans-CN.d.ts +48 -0
- package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
- package/src/zh-Hant-TW.d.ts +50 -0
- package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
- package/dist/languages/am-Latn.js +0 -3
- package/dist/languages/am-Latn.js.map +0 -1
- package/dist/languages/am.js +0 -3
- package/dist/languages/am.js.map +0 -1
- package/dist/languages/ar.js +0 -3
- package/dist/languages/ar.js.map +0 -1
- package/dist/languages/az.js +0 -3
- package/dist/languages/az.js.map +0 -1
- package/dist/languages/bn.js +0 -3
- package/dist/languages/bn.js.map +0 -1
- package/dist/languages/cs.js +0 -3
- package/dist/languages/cs.js.map +0 -1
- package/dist/languages/da.js +0 -3
- package/dist/languages/da.js.map +0 -1
- package/dist/languages/de.js +0 -3
- package/dist/languages/de.js.map +0 -1
- package/dist/languages/el.js +0 -3
- package/dist/languages/el.js.map +0 -1
- package/dist/languages/en.js +0 -3
- package/dist/languages/en.js.map +0 -1
- package/dist/languages/es.js +0 -3
- package/dist/languages/es.js.map +0 -1
- package/dist/languages/fa.js +0 -3
- package/dist/languages/fa.js.map +0 -1
- package/dist/languages/fi.js +0 -3
- package/dist/languages/fi.js.map +0 -1
- package/dist/languages/fil.js +0 -3
- package/dist/languages/fil.js.map +0 -1
- package/dist/languages/fr-BE.js +0 -3
- package/dist/languages/fr-BE.js.map +0 -1
- package/dist/languages/fr.js +0 -3
- package/dist/languages/fr.js.map +0 -1
- package/dist/languages/gu.js +0 -3
- package/dist/languages/gu.js.map +0 -1
- package/dist/languages/ha.js +0 -3
- package/dist/languages/ha.js.map +0 -1
- package/dist/languages/hbo.js +0 -3
- package/dist/languages/hbo.js.map +0 -1
- package/dist/languages/he.js +0 -3
- package/dist/languages/he.js.map +0 -1
- package/dist/languages/hi.js +0 -3
- package/dist/languages/hi.js.map +0 -1
- package/dist/languages/hr.js +0 -3
- package/dist/languages/hr.js.map +0 -1
- package/dist/languages/hu.js +0 -3
- package/dist/languages/hu.js.map +0 -1
- package/dist/languages/id.js +0 -3
- package/dist/languages/id.js.map +0 -1
- package/dist/languages/it.js +0 -3
- package/dist/languages/it.js.map +0 -1
- package/dist/languages/ja.js +0 -3
- package/dist/languages/ja.js.map +0 -1
- package/dist/languages/kn.js +0 -3
- package/dist/languages/kn.js.map +0 -1
- package/dist/languages/ko.js +0 -3
- package/dist/languages/ko.js.map +0 -1
- package/dist/languages/lt.js +0 -3
- package/dist/languages/lt.js.map +0 -1
- package/dist/languages/lv.js +0 -3
- package/dist/languages/lv.js.map +0 -1
- package/dist/languages/mr.js +0 -3
- package/dist/languages/mr.js.map +0 -1
- package/dist/languages/ms.js +0 -3
- package/dist/languages/ms.js.map +0 -1
- package/dist/languages/nb.js +0 -3
- package/dist/languages/nb.js.map +0 -1
- package/dist/languages/nl.js +0 -3
- package/dist/languages/nl.js.map +0 -1
- package/dist/languages/pa.js +0 -3
- package/dist/languages/pa.js.map +0 -1
- package/dist/languages/pl.js +0 -3
- package/dist/languages/pl.js.map +0 -1
- package/dist/languages/pt.js +0 -3
- package/dist/languages/pt.js.map +0 -1
- package/dist/languages/ro.js +0 -3
- package/dist/languages/ro.js.map +0 -1
- package/dist/languages/ru.js +0 -3
- package/dist/languages/ru.js.map +0 -1
- package/dist/languages/sr-Cyrl.js +0 -3
- package/dist/languages/sr-Cyrl.js.map +0 -1
- package/dist/languages/sr-Latn.js +0 -3
- package/dist/languages/sr-Latn.js.map +0 -1
- package/dist/languages/sv.js +0 -3
- package/dist/languages/sv.js.map +0 -1
- package/dist/languages/sw.js +0 -3
- package/dist/languages/sw.js.map +0 -1
- package/dist/languages/ta.js +0 -3
- package/dist/languages/ta.js.map +0 -1
- package/dist/languages/te.js +0 -3
- package/dist/languages/te.js.map +0 -1
- package/dist/languages/th.js +0 -3
- package/dist/languages/th.js.map +0 -1
- package/dist/languages/tr.js +0 -3
- package/dist/languages/tr.js.map +0 -1
- package/dist/languages/uk.js +0 -3
- package/dist/languages/uk.js.map +0 -1
- package/dist/languages/ur.js +0 -3
- package/dist/languages/ur.js.map +0 -1
- package/dist/languages/vi.js +0 -3
- package/dist/languages/vi.js.map +0 -1
- package/dist/languages/zh-Hans.js +0 -3
- package/dist/languages/zh-Hans.js.map +0 -1
- package/dist/languages/zh-Hant.js +0 -3
- package/dist/languages/zh-Hant.js.map +0 -1
- package/dist/n2words.js +0 -3
- package/dist/n2words.js.map +0 -1
- package/lib/languages/am-Latn.d.ts +0 -7
- package/lib/languages/am-Latn.js +0 -164
- package/lib/languages/am.d.ts +0 -7
- package/lib/languages/am.js +0 -164
- package/lib/languages/ar.d.ts +0 -17
- package/lib/languages/az.d.ts +0 -7
- package/lib/languages/az.js +0 -176
- package/lib/languages/bn.d.ts +0 -7
- package/lib/languages/bn.js +0 -145
- package/lib/languages/cs.d.ts +0 -18
- package/lib/languages/da.d.ts +0 -14
- package/lib/languages/de.d.ts +0 -17
- package/lib/languages/de.js +0 -332
- package/lib/languages/el.d.ts +0 -14
- package/lib/languages/el.js +0 -243
- package/lib/languages/en.d.ts +0 -17
- package/lib/languages/en.js +0 -256
- package/lib/languages/es.d.ts +0 -21
- package/lib/languages/fa.d.ts +0 -7
- package/lib/languages/fa.js +0 -134
- package/lib/languages/fi.d.ts +0 -14
- package/lib/languages/fi.js +0 -245
- package/lib/languages/fil.d.ts +0 -7
- package/lib/languages/fr-BE.d.ts +0 -11
- package/lib/languages/fr-BE.js +0 -300
- package/lib/languages/fr.d.ts +0 -21
- package/lib/languages/gu.d.ts +0 -7
- package/lib/languages/gu.js +0 -137
- package/lib/languages/ha.d.ts +0 -7
- package/lib/languages/hbo.d.ts +0 -13
- package/lib/languages/he.d.ts +0 -13
- package/lib/languages/he.js +0 -276
- package/lib/languages/hi.d.ts +0 -7
- package/lib/languages/hi.js +0 -145
- package/lib/languages/hr.d.ts +0 -11
- package/lib/languages/hr.js +0 -218
- package/lib/languages/hu.d.ts +0 -7
- package/lib/languages/id.d.ts +0 -7
- package/lib/languages/it.d.ts +0 -19
- package/lib/languages/it.js +0 -377
- package/lib/languages/ja.d.ts +0 -17
- package/lib/languages/kn.d.ts +0 -7
- package/lib/languages/ko.d.ts +0 -14
- package/lib/languages/lt.d.ts +0 -18
- package/lib/languages/lt.js +0 -310
- package/lib/languages/lv.d.ts +0 -18
- package/lib/languages/lv.js +0 -321
- package/lib/languages/mr.d.ts +0 -7
- package/lib/languages/mr.js +0 -137
- package/lib/languages/ms.d.ts +0 -7
- package/lib/languages/nb.d.ts +0 -14
- package/lib/languages/nl.d.ts +0 -26
- package/lib/languages/pa.d.ts +0 -7
- package/lib/languages/pa.js +0 -163
- package/lib/languages/pl.d.ts +0 -22
- package/lib/languages/pl.js +0 -330
- package/lib/languages/pt.d.ts +0 -17
- package/lib/languages/pt.js +0 -306
- package/lib/languages/ro.d.ts +0 -18
- package/lib/languages/ru.d.ts +0 -11
- package/lib/languages/ru.js +0 -240
- package/lib/languages/sr-Cyrl.d.ts +0 -11
- package/lib/languages/sr-Cyrl.js +0 -215
- package/lib/languages/sr-Latn.d.ts +0 -11
- package/lib/languages/sr-Latn.js +0 -215
- package/lib/languages/sv.d.ts +0 -14
- package/lib/languages/sw.d.ts +0 -7
- package/lib/languages/ta.d.ts +0 -7
- package/lib/languages/te.d.ts +0 -7
- package/lib/languages/th.d.ts +0 -7
- package/lib/languages/tr.d.ts +0 -18
- package/lib/languages/tr.js +0 -263
- package/lib/languages/uk.d.ts +0 -11
- package/lib/languages/uk.js +0 -218
- package/lib/languages/ur.d.ts +0 -7
- package/lib/languages/ur.js +0 -163
- package/lib/languages/vi.d.ts +0 -17
- package/lib/languages/zh-Hans.d.ts +0 -11
- package/lib/languages/zh-Hant.d.ts +0 -11
- package/lib/n2words.d.ts +0 -53
- package/lib/n2words.js +0 -122
- package/lib/utils/parse-numeric.d.ts +0 -17
- /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
- /package/{lib → src}/utils/is-plain-object.js +0 -0
- /package/{lib → src}/utils/validate-options.d.ts +0 -0
- /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
|
|
2
|
+
* Simplified Chinese (China) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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 {
|
|
14
|
-
import {
|
|
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
|
|
187
|
+
function toCardinal (value, options) {
|
|
162
188
|
options = validateOptions(options)
|
|
163
|
-
const { isNegative, integerPart, decimalPart } =
|
|
164
|
-
|
|
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 {
|
|
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;
|