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.
- package/CHANGELOG.md +51 -40
- 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-BR.js +2 -0
- package/dist/pt-BR.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 +61 -88
- 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/{lib/languages/bn.js → src/bn-BD.js} +110 -6
- package/src/cs-CZ.d.ts +49 -0
- package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
- package/src/da-DK.d.ts +44 -0
- package/{lib/languages/da.js → src/da-DK.js} +131 -11
- 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/{lib/languages/en.js → src/en-NZ.js} +164 -31
- 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} +228 -18
- 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/{lib/languages/fi.js → src/fi-FI.js} +152 -11
- package/src/fil-PH.d.ts +37 -0
- package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
- package/src/fr-BE.d.ts +49 -0
- package/{lib/languages → src}/fr-BE.js +175 -13
- package/src/fr-FR.d.ts +63 -0
- package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
- package/src/gu-IN.d.ts +35 -0
- package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
- package/src/ha-NG.d.ts +37 -0
- package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
- package/src/hbo-IL.d.ts +39 -0
- package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
- package/src/he-IL.d.ts +37 -0
- package/src/he-IL.js +537 -0
- package/src/hi-IN.d.ts +36 -0
- package/{lib/languages/hi.js → src/hi-IN.js} +116 -6
- 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} +99 -8
- package/src/it-IT.d.ts +59 -0
- package/{lib/languages/it.js → src/it-IT.js} +179 -15
- package/src/ja-JP.d.ts +49 -0
- package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
- package/src/ka-GE.d.ts +44 -0
- package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
- package/src/kn-IN.d.ts +35 -0
- package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
- package/src/ko-KR.d.ts +45 -0
- package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
- 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/{lib/languages/mr.js → src/mr-IN.js} +116 -6
- package/src/ms-MY.d.ts +37 -0
- package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
- package/src/nb-NO.d.ts +44 -0
- package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
- package/src/nl-NL.d.ts +54 -0
- package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
- package/src/pa-IN.d.ts +36 -0
- package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
- package/src/pl-PL.d.ts +55 -0
- package/src/pl-PL.js +585 -0
- package/src/pt-BR.d.ts +31 -0
- package/src/pt-BR.js +534 -0
- package/src/pt-PT.d.ts +45 -0
- package/{lib/languages/pt.js → src/pt-PT.js} +234 -12
- 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} +136 -11
- 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} +109 -6
- package/src/te-IN.d.ts +35 -0
- package/{lib/languages/te.js → src/te-IN.js} +115 -6
- 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/{lib/languages/tr.js → src/tr-TR.js} +168 -23
- package/src/uk-UA.d.ts +42 -0
- package/src/uk-UA.js +463 -0
- package/src/ur-PK.d.ts +36 -0
- package/{lib/languages/ur.js → src/ur-PK.js} +116 -6
- 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} +102 -11
- package/src/yo-NG.d.ts +37 -0
- package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
- 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/ka.js +0 -3
- package/dist/languages/ka.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/yo.js +0 -3
- package/dist/languages/yo.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 -159
- package/lib/languages/am.d.ts +0 -7
- package/lib/languages/am.js +0 -159
- package/lib/languages/ar.d.ts +0 -17
- package/lib/languages/az.d.ts +0 -7
- package/lib/languages/az.js +0 -171
- package/lib/languages/bn.d.ts +0 -7
- 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 -320
- package/lib/languages/el.d.ts +0 -14
- package/lib/languages/el.js +0 -236
- package/lib/languages/en.d.ts +0 -17
- 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/fil.d.ts +0 -7
- package/lib/languages/fr-BE.d.ts +0 -11
- package/lib/languages/fr.d.ts +0 -21
- package/lib/languages/gu.d.ts +0 -7
- 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 -265
- package/lib/languages/hi.d.ts +0 -7
- package/lib/languages/hr.d.ts +0 -11
- package/lib/languages/hr.js +0 -224
- 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/ja.d.ts +0 -17
- package/lib/languages/ka.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 -301
- package/lib/languages/lv.d.ts +0 -18
- package/lib/languages/lv.js +0 -312
- package/lib/languages/mr.d.ts +0 -7
- 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/pl.d.ts +0 -22
- package/lib/languages/pl.js +0 -317
- package/lib/languages/pt.d.ts +0 -17
- package/lib/languages/ro.d.ts +0 -18
- package/lib/languages/ru.d.ts +0 -11
- package/lib/languages/ru.js +0 -245
- package/lib/languages/sr-Cyrl.d.ts +0 -11
- package/lib/languages/sr-Cyrl.js +0 -221
- package/lib/languages/sr-Latn.d.ts +0 -11
- package/lib/languages/sr-Latn.js +0 -221
- 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/uk.d.ts +0 -11
- package/lib/languages/uk.js +0 -224
- package/lib/languages/ur.d.ts +0 -7
- package/lib/languages/vi.d.ts +0 -17
- package/lib/languages/yo.d.ts +0 -7
- package/lib/languages/zh-Hans.d.ts +0 -11
- package/lib/languages/zh-Hant.d.ts +0 -11
- package/lib/n2words.d.ts +0 -55
- package/lib/n2words.js +0 -126
- 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
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Yoruba language converter
|
|
2
|
+
* Yoruba (Nigeria) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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 {
|
|
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.
|
|
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.
|
|
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
|
|
286
|
-
const { isNegative, integerPart, decimalPart } =
|
|
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
|
-
|
|
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;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Traditional Chinese language converter
|
|
2
|
+
* Traditional Chinese (Taiwan) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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 {
|
|
18
|
-
import {
|
|
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
|
|
199
|
+
function toCardinal (value, options) {
|
|
179
200
|
options = validateOptions(options)
|
|
180
|
-
const { isNegative, integerPart, decimalPart } =
|
|
181
|
-
|
|
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 {
|
|
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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"}
|
package/dist/languages/am.js
DELETED
|
@@ -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
|