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/am-ET.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amharic (Ethiopia) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: am-ET | Amharic as used in Ethiopia (Ge'ez script)
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Ge'ez/Ethiopic script numerals
|
|
8
|
+
* - Teens formed with "አስራ" prefix
|
|
9
|
+
* - Keeps "one" before hundred: "አንድ መቶ" (100)
|
|
10
|
+
* - Short scale naming
|
|
11
|
+
* - Per-digit decimal reading
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Vocabulary
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
const ONES = ['', 'አንድ', 'ሁለት', 'ሶስት', 'አራት', 'አምስት', 'ስድስት', 'ሰባት', 'ስምንት', 'ዘጠኝ']
|
|
23
|
+
const TEENS = ['አስር', 'አስራ አንድ', 'አስራ ሁለት', 'አስራ ሶስት', 'አስራ አራት', 'አስራ አምስት', 'አስራ ስድስት', 'አስራ ሰባት', 'አስራ ስምንት', 'አስራ ዘጠኝ']
|
|
24
|
+
const TENS = ['', '', 'ሃያ', 'ሰላሳ', 'አርባ', 'ሃምሳ', 'ስልሳ', 'ሰባ', 'ሰማንያ', 'ዘጠና']
|
|
25
|
+
|
|
26
|
+
const HUNDRED = 'መቶ'
|
|
27
|
+
const THOUSAND = 'ሺ'
|
|
28
|
+
|
|
29
|
+
const ZERO = 'ዜሮ'
|
|
30
|
+
const NEGATIVE = 'አሉታዊ'
|
|
31
|
+
const DECIMAL_SEP = 'ነጥብ'
|
|
32
|
+
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Ordinal Vocabulary
|
|
35
|
+
// ============================================================================
|
|
36
|
+
|
|
37
|
+
// Ordinal suffix
|
|
38
|
+
const ORDINAL_SUFFIX = 'ኛ'
|
|
39
|
+
|
|
40
|
+
// Special ordinal for first
|
|
41
|
+
const FIRST = 'አንደኛ'
|
|
42
|
+
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Currency Vocabulary (Ethiopian Birr)
|
|
45
|
+
// ============================================================================
|
|
46
|
+
|
|
47
|
+
// Birr (main unit)
|
|
48
|
+
const BIRR = 'ብር'
|
|
49
|
+
|
|
50
|
+
// Santim (1/100 of birr)
|
|
51
|
+
const SANTIM = 'ሳንቲም'
|
|
52
|
+
|
|
53
|
+
// Short scale
|
|
54
|
+
const SCALE_WORDS = ['', THOUSAND, 'ሚሊዮን', 'ቢሊዮን']
|
|
55
|
+
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Precomputed Lookup Table
|
|
58
|
+
// ============================================================================
|
|
59
|
+
|
|
60
|
+
function buildSegment (n) {
|
|
61
|
+
if (n === 0) return ''
|
|
62
|
+
|
|
63
|
+
const ones = n % 10
|
|
64
|
+
const tensDigit = Math.trunc(n / 10) % 10
|
|
65
|
+
const hundredsDigit = Math.trunc(n / 100)
|
|
66
|
+
|
|
67
|
+
const parts = []
|
|
68
|
+
|
|
69
|
+
// Amharic keeps "one" before hundred: "አንድ መቶ" (100)
|
|
70
|
+
if (hundredsDigit > 0) {
|
|
71
|
+
parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (tensDigit === 1) {
|
|
75
|
+
parts.push(TEENS[ones])
|
|
76
|
+
} else {
|
|
77
|
+
if (tensDigit > 1) {
|
|
78
|
+
parts.push(TENS[tensDigit])
|
|
79
|
+
}
|
|
80
|
+
if (ones > 0) {
|
|
81
|
+
parts.push(ONES[ones])
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return parts.join(' ')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Conversion Functions
|
|
90
|
+
// ============================================================================
|
|
91
|
+
|
|
92
|
+
function integerToWords (n) {
|
|
93
|
+
if (n === 0n) return ZERO
|
|
94
|
+
|
|
95
|
+
if (n < 1000n) {
|
|
96
|
+
return buildSegment(Number(n))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return buildLargeNumberWords(n)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildLargeNumberWords (n) {
|
|
103
|
+
const numStr = n.toString()
|
|
104
|
+
const len = numStr.length
|
|
105
|
+
|
|
106
|
+
const segments = []
|
|
107
|
+
const segmentSize = 3
|
|
108
|
+
|
|
109
|
+
const remainderLen = len % segmentSize
|
|
110
|
+
let pos = 0
|
|
111
|
+
if (remainderLen > 0) {
|
|
112
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
113
|
+
pos = remainderLen
|
|
114
|
+
}
|
|
115
|
+
while (pos < len) {
|
|
116
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
117
|
+
pos += segmentSize
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const parts = []
|
|
121
|
+
let scaleIndex = segments.length - 1
|
|
122
|
+
|
|
123
|
+
for (let i = 0; i < segments.length; i++) {
|
|
124
|
+
const segment = segments[i]
|
|
125
|
+
|
|
126
|
+
if (segment !== 0) {
|
|
127
|
+
const scaleWord = SCALE_WORDS[scaleIndex] || ''
|
|
128
|
+
|
|
129
|
+
if (scaleIndex === 0) {
|
|
130
|
+
parts.push(buildSegment(segment))
|
|
131
|
+
} else {
|
|
132
|
+
parts.push(buildSegment(segment) + ' ' + scaleWord)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
scaleIndex--
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return parts.join(' ')
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function decimalPartToWords (decimalPart) {
|
|
143
|
+
// Per-digit decimal reading
|
|
144
|
+
const digits = []
|
|
145
|
+
for (const char of decimalPart) {
|
|
146
|
+
const d = parseInt(char, 10)
|
|
147
|
+
digits.push(d === 0 ? ZERO : ONES[d])
|
|
148
|
+
}
|
|
149
|
+
return digits.join(' ')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Converts a numeric value to Amharic words.
|
|
154
|
+
*
|
|
155
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
156
|
+
* @returns {string} The number in Amharic words
|
|
157
|
+
*/
|
|
158
|
+
function toCardinal (value) {
|
|
159
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
160
|
+
|
|
161
|
+
let result = ''
|
|
162
|
+
|
|
163
|
+
if (isNegative) {
|
|
164
|
+
result = NEGATIVE + ' '
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
result += integerToWords(integerPart)
|
|
168
|
+
|
|
169
|
+
if (decimalPart) {
|
|
170
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return result
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ============================================================================
|
|
177
|
+
// ORDINAL: toOrdinal(value)
|
|
178
|
+
// ============================================================================
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Converts a positive integer to Amharic ordinal words.
|
|
182
|
+
*
|
|
183
|
+
* In Amharic, ordinals are formed by adding -ኛ suffix to the cardinal.
|
|
184
|
+
* Special case: 1 = አንደኛ (not አንድኛ)
|
|
185
|
+
*
|
|
186
|
+
* @param {bigint} n - Positive integer to convert
|
|
187
|
+
* @returns {string} Amharic ordinal words
|
|
188
|
+
*/
|
|
189
|
+
function integerToOrdinal (n) {
|
|
190
|
+
// Special case: 1 → አንደኛ
|
|
191
|
+
if (n === 1n) {
|
|
192
|
+
return FIRST
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Get cardinal form and add ordinal suffix
|
|
196
|
+
const cardinal = integerToWords(n)
|
|
197
|
+
return cardinal + ORDINAL_SUFFIX
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Converts a numeric value to Amharic ordinal words.
|
|
202
|
+
*
|
|
203
|
+
* Amharic ordinals: add -ኛ suffix to cardinal.
|
|
204
|
+
* Special case: 1 → አንደኛ
|
|
205
|
+
*
|
|
206
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
207
|
+
* @returns {string} The number as ordinal words
|
|
208
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
209
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* toOrdinal(1) // 'አንደኛ'
|
|
213
|
+
* toOrdinal(2) // 'ሁለትኛ'
|
|
214
|
+
* toOrdinal(10) // 'አስርኛ'
|
|
215
|
+
* toOrdinal(100) // 'አንድ መቶኛ'
|
|
216
|
+
*/
|
|
217
|
+
function toOrdinal (value) {
|
|
218
|
+
const integerPart = parseOrdinalValue(value)
|
|
219
|
+
return integerToOrdinal(integerPart)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// CURRENCY: toCurrency(value, options?)
|
|
224
|
+
// ============================================================================
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Converts a numeric value to Amharic currency words (Ethiopian Birr).
|
|
228
|
+
*
|
|
229
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
230
|
+
* @returns {string} The amount in Amharic currency words
|
|
231
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
232
|
+
* @throws {Error} If value is not a valid number format
|
|
233
|
+
*
|
|
234
|
+
* @example
|
|
235
|
+
* toCurrency(42.50) // 'አርባ ሁለት ብር ሃምሳ ሳንቲም'
|
|
236
|
+
* toCurrency(1) // 'አንድ ብር'
|
|
237
|
+
* toCurrency(0.99) // 'ዘጠና ዘጠኝ ሳንቲም'
|
|
238
|
+
* toCurrency(0.01) // 'አንድ ሳንቲም'
|
|
239
|
+
*/
|
|
240
|
+
function toCurrency (value) {
|
|
241
|
+
const { isNegative, dollars: birr, cents: santim } = parseCurrencyValue(value)
|
|
242
|
+
|
|
243
|
+
// Build result
|
|
244
|
+
let result = ''
|
|
245
|
+
if (isNegative) result = NEGATIVE + ' '
|
|
246
|
+
|
|
247
|
+
// Birr part - show if non-zero, or if no santim
|
|
248
|
+
if (birr > 0n || santim === 0n) {
|
|
249
|
+
result += integerToWords(birr)
|
|
250
|
+
result += ' ' + BIRR
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Santim part
|
|
254
|
+
if (santim > 0n) {
|
|
255
|
+
if (birr > 0n) {
|
|
256
|
+
result += ' '
|
|
257
|
+
}
|
|
258
|
+
result += integerToWords(santim)
|
|
259
|
+
result += ' ' + SANTIM
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return result
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// ============================================================================
|
|
266
|
+
// Exports
|
|
267
|
+
// ============================================================================
|
|
268
|
+
|
|
269
|
+
export { toCardinal, toOrdinal, toCurrency }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Amharic (Latin script) words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Amharic Latin words
|
|
6
|
+
*/
|
|
7
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a numeric value to Amharic (Latin script) ordinal words.
|
|
10
|
+
*
|
|
11
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
12
|
+
* @returns {string} The number as ordinal words
|
|
13
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
14
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* toOrdinal(1) // 'andenya'
|
|
18
|
+
* toOrdinal(2) // 'huletnya'
|
|
19
|
+
* toOrdinal(10) // 'asirnya'
|
|
20
|
+
*/
|
|
21
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
22
|
+
/**
|
|
23
|
+
* Converts a numeric value to Amharic (Latin script) currency words (Ethiopian Birr).
|
|
24
|
+
*
|
|
25
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
26
|
+
* @returns {string} The amount in Amharic (Latin) currency words
|
|
27
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
28
|
+
* @throws {Error} If value is not a valid number format
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* toCurrency(42.50) // 'arba hulet birr hamsa santim'
|
|
32
|
+
* toCurrency(1) // 'and birr'
|
|
33
|
+
* toCurrency(0.01) // 'and santim'
|
|
34
|
+
*/
|
|
35
|
+
export function toCurrency(value: number | string | bigint): string;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amharic (Ethiopia, Latin script) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: am-Latn-ET | Amharic as used in Ethiopia (Latin script romanization)
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Romanized numerals (and, hulet, sost)
|
|
8
|
+
* - Teens formed with "asra" prefix
|
|
9
|
+
* - Keeps "one" before hundred: "and meto" (100)
|
|
10
|
+
* - Short scale naming
|
|
11
|
+
* - Per-digit decimal reading
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Vocabulary
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
const ONES = ['', 'and', 'hulet', 'sost', 'arat', 'amist', 'siddist', 'sebat', 'siment', 'zeteny']
|
|
23
|
+
const TEENS = ['asir', 'asra and', 'asra hulet', 'asra sost', 'asra arat', 'asra amist', 'asra siddist', 'asra sebat', 'asra siment', 'asra zeteny']
|
|
24
|
+
const TENS = ['', '', 'haya', 'selasa', 'arba', 'hamsa', 'silsa', 'seba', 'semanya', 'zetena']
|
|
25
|
+
|
|
26
|
+
const HUNDRED = 'meto'
|
|
27
|
+
const THOUSAND = 'shi'
|
|
28
|
+
|
|
29
|
+
const ZERO = 'zero'
|
|
30
|
+
const NEGATIVE = 'asitegna'
|
|
31
|
+
const DECIMAL_SEP = 'netib'
|
|
32
|
+
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Ordinal Vocabulary
|
|
35
|
+
// ============================================================================
|
|
36
|
+
|
|
37
|
+
// Ordinal suffix (romanized -ኛ)
|
|
38
|
+
const ORDINAL_SUFFIX = 'nya'
|
|
39
|
+
|
|
40
|
+
// Special ordinal for first (romanized አንደኛ)
|
|
41
|
+
const FIRST = 'andenya'
|
|
42
|
+
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Currency Vocabulary (Ethiopian Birr)
|
|
45
|
+
// ============================================================================
|
|
46
|
+
|
|
47
|
+
// Birr (main unit, romanized ብር)
|
|
48
|
+
const BIRR = 'birr'
|
|
49
|
+
|
|
50
|
+
// Santim (1/100 of birr, romanized ሳንቲም)
|
|
51
|
+
const SANTIM = 'santim'
|
|
52
|
+
|
|
53
|
+
// Short scale
|
|
54
|
+
const SCALE_WORDS = ['', THOUSAND, 'miliyon', 'billiyon']
|
|
55
|
+
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Precomputed Lookup Table
|
|
58
|
+
// ============================================================================
|
|
59
|
+
|
|
60
|
+
function buildSegment (n) {
|
|
61
|
+
if (n === 0) return ''
|
|
62
|
+
|
|
63
|
+
const ones = n % 10
|
|
64
|
+
const tensDigit = Math.trunc(n / 10) % 10
|
|
65
|
+
const hundredsDigit = Math.trunc(n / 100)
|
|
66
|
+
|
|
67
|
+
const parts = []
|
|
68
|
+
|
|
69
|
+
// Amharic keeps "one" before hundred: "and meto" (100)
|
|
70
|
+
if (hundredsDigit > 0) {
|
|
71
|
+
parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (tensDigit === 1) {
|
|
75
|
+
parts.push(TEENS[ones])
|
|
76
|
+
} else {
|
|
77
|
+
if (tensDigit > 1) {
|
|
78
|
+
parts.push(TENS[tensDigit])
|
|
79
|
+
}
|
|
80
|
+
if (ones > 0) {
|
|
81
|
+
parts.push(ONES[ones])
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return parts.join(' ')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Conversion Functions
|
|
90
|
+
// ============================================================================
|
|
91
|
+
|
|
92
|
+
function integerToWords (n) {
|
|
93
|
+
if (n === 0n) return ZERO
|
|
94
|
+
|
|
95
|
+
if (n < 1000n) {
|
|
96
|
+
return buildSegment(Number(n))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return buildLargeNumberWords(n)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildLargeNumberWords (n) {
|
|
103
|
+
const numStr = n.toString()
|
|
104
|
+
const len = numStr.length
|
|
105
|
+
|
|
106
|
+
const segments = []
|
|
107
|
+
const segmentSize = 3
|
|
108
|
+
|
|
109
|
+
const remainderLen = len % segmentSize
|
|
110
|
+
let pos = 0
|
|
111
|
+
if (remainderLen > 0) {
|
|
112
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
113
|
+
pos = remainderLen
|
|
114
|
+
}
|
|
115
|
+
while (pos < len) {
|
|
116
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
117
|
+
pos += segmentSize
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const parts = []
|
|
121
|
+
let scaleIndex = segments.length - 1
|
|
122
|
+
|
|
123
|
+
for (let i = 0; i < segments.length; i++) {
|
|
124
|
+
const segment = segments[i]
|
|
125
|
+
|
|
126
|
+
if (segment !== 0) {
|
|
127
|
+
const scaleWord = SCALE_WORDS[scaleIndex] || ''
|
|
128
|
+
|
|
129
|
+
if (scaleIndex === 0) {
|
|
130
|
+
parts.push(buildSegment(segment))
|
|
131
|
+
} else {
|
|
132
|
+
parts.push(buildSegment(segment) + ' ' + scaleWord)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
scaleIndex--
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return parts.join(' ')
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function decimalPartToWords (decimalPart) {
|
|
143
|
+
// Per-digit decimal reading
|
|
144
|
+
const digits = []
|
|
145
|
+
for (const char of decimalPart) {
|
|
146
|
+
const d = parseInt(char, 10)
|
|
147
|
+
digits.push(d === 0 ? ZERO : ONES[d])
|
|
148
|
+
}
|
|
149
|
+
return digits.join(' ')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Converts a numeric value to Amharic (Latin script) words.
|
|
154
|
+
*
|
|
155
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
156
|
+
* @returns {string} The number in Amharic Latin words
|
|
157
|
+
*/
|
|
158
|
+
function toCardinal (value) {
|
|
159
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
160
|
+
|
|
161
|
+
let result = ''
|
|
162
|
+
|
|
163
|
+
if (isNegative) {
|
|
164
|
+
result = NEGATIVE + ' '
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
result += integerToWords(integerPart)
|
|
168
|
+
|
|
169
|
+
if (decimalPart) {
|
|
170
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return result
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ============================================================================
|
|
177
|
+
// ORDINAL: toOrdinal(value)
|
|
178
|
+
// ============================================================================
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Converts a positive integer to Amharic (Latin script) ordinal words.
|
|
182
|
+
*
|
|
183
|
+
* In Amharic, ordinals are formed by adding -nya suffix to the cardinal.
|
|
184
|
+
* Special case: 1 = andenya
|
|
185
|
+
*
|
|
186
|
+
* @param {bigint} n - Positive integer to convert
|
|
187
|
+
* @returns {string} Amharic (Latin) ordinal words
|
|
188
|
+
*/
|
|
189
|
+
function integerToOrdinal (n) {
|
|
190
|
+
// Special case: 1 → andenya
|
|
191
|
+
if (n === 1n) {
|
|
192
|
+
return FIRST
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Get cardinal form and add ordinal suffix
|
|
196
|
+
const cardinal = integerToWords(n)
|
|
197
|
+
return cardinal + ORDINAL_SUFFIX
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Converts a numeric value to Amharic (Latin script) ordinal words.
|
|
202
|
+
*
|
|
203
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
204
|
+
* @returns {string} The number as ordinal words
|
|
205
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
206
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* toOrdinal(1) // 'andenya'
|
|
210
|
+
* toOrdinal(2) // 'huletnya'
|
|
211
|
+
* toOrdinal(10) // 'asirnya'
|
|
212
|
+
*/
|
|
213
|
+
function toOrdinal (value) {
|
|
214
|
+
const integerPart = parseOrdinalValue(value)
|
|
215
|
+
return integerToOrdinal(integerPart)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ============================================================================
|
|
219
|
+
// CURRENCY: toCurrency(value, options?)
|
|
220
|
+
// ============================================================================
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Converts a numeric value to Amharic (Latin script) currency words (Ethiopian Birr).
|
|
224
|
+
*
|
|
225
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
226
|
+
* @returns {string} The amount in Amharic (Latin) currency words
|
|
227
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
228
|
+
* @throws {Error} If value is not a valid number format
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* toCurrency(42.50) // 'arba hulet birr hamsa santim'
|
|
232
|
+
* toCurrency(1) // 'and birr'
|
|
233
|
+
* toCurrency(0.01) // 'and santim'
|
|
234
|
+
*/
|
|
235
|
+
function toCurrency (value) {
|
|
236
|
+
const { isNegative, dollars: birr, cents: santim } = parseCurrencyValue(value)
|
|
237
|
+
|
|
238
|
+
// Build result
|
|
239
|
+
let result = ''
|
|
240
|
+
if (isNegative) result = NEGATIVE + ' '
|
|
241
|
+
|
|
242
|
+
// Birr part - show if non-zero, or if no santim
|
|
243
|
+
if (birr > 0n || santim === 0n) {
|
|
244
|
+
result += integerToWords(birr)
|
|
245
|
+
result += ' ' + BIRR
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Santim part
|
|
249
|
+
if (santim > 0n) {
|
|
250
|
+
if (birr > 0n) {
|
|
251
|
+
result += ' '
|
|
252
|
+
}
|
|
253
|
+
result += integerToWords(santim)
|
|
254
|
+
result += ' ' + SANTIM
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return result
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// ============================================================================
|
|
261
|
+
// Exports
|
|
262
|
+
// ============================================================================
|
|
263
|
+
|
|
264
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/ar-SA.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Arabic words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @param {Object} [options] - Optional configuration
|
|
6
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
7
|
+
* @param {string} [options.negativeWord] - Custom word for negative numbers
|
|
8
|
+
* @returns {string} The number in Arabic words
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* toCardinal(1) // 'واحد'
|
|
12
|
+
* toCardinal(1, {gender: 'feminine'}) // 'واحدة'
|
|
13
|
+
*/
|
|
14
|
+
export function toCardinal(value: number | string | bigint, options?: {
|
|
15
|
+
gender?: "masculine" | "feminine" | undefined;
|
|
16
|
+
negativeWord?: string | undefined;
|
|
17
|
+
}): string;
|
|
18
|
+
/**
|
|
19
|
+
* Converts a numeric value to Arabic ordinal words.
|
|
20
|
+
*
|
|
21
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
22
|
+
* @param {Object} [options] - Optional configuration
|
|
23
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
24
|
+
* @returns {string} The number as ordinal words
|
|
25
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
26
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* toOrdinal(1) // 'الأول'
|
|
30
|
+
* toOrdinal(1, {gender: 'feminine'}) // 'الأولى'
|
|
31
|
+
* toOrdinal(3) // 'الثالث'
|
|
32
|
+
*/
|
|
33
|
+
export function toOrdinal(value: number | string | bigint, options?: {
|
|
34
|
+
gender?: "masculine" | "feminine" | undefined;
|
|
35
|
+
}): string;
|
|
36
|
+
/**
|
|
37
|
+
* Converts a numeric value to Arabic currency words (Saudi Riyal).
|
|
38
|
+
*
|
|
39
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
40
|
+
* @returns {string} The amount in Arabic currency words
|
|
41
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
42
|
+
* @throws {Error} If value is not a valid number format
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* toCurrency(42.50) // 'اثنان وأربعون ريالاً وخمسون هللة'
|
|
46
|
+
* toCurrency(1) // 'ريال واحد'
|
|
47
|
+
* toCurrency(0.01) // 'هللة واحدة'
|
|
48
|
+
*/
|
|
49
|
+
export function toCurrency(value: number | string | bigint): string;
|