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,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Hindi language converter
|
|
2
|
+
* Hindi (India) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: hi-IN | Hindi as used in India
|
|
5
5
|
*
|
|
6
6
|
* Key features:
|
|
7
7
|
* - Indian numbering system (हज़ार, लाख, करोड़)
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* - BigInt modulo for efficient segment extraction
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
15
17
|
|
|
16
18
|
// ============================================================================
|
|
17
19
|
// Vocabulary
|
|
@@ -22,6 +24,28 @@ const NEGATIVE = 'माइनस'
|
|
|
22
24
|
const DECIMAL_SEP = 'दशमलव'
|
|
23
25
|
const HUNDRED = 'सौ'
|
|
24
26
|
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Ordinal Vocabulary
|
|
29
|
+
// ============================================================================
|
|
30
|
+
|
|
31
|
+
// Ordinal suffix (adds to cardinal)
|
|
32
|
+
const ORDINAL_SUFFIX = 'वाँ'
|
|
33
|
+
|
|
34
|
+
// Special ordinals for first few numbers
|
|
35
|
+
const ORDINAL_SPECIAL = ['', 'पहला', 'दूसरा', 'तीसरा', 'चौथा', 'पाँचवाँ', 'छठा']
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Currency Vocabulary (Indian Rupee)
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
// Rupee: singular/plural (same form used)
|
|
42
|
+
const RUPEE = 'रुपया'
|
|
43
|
+
const RUPEES = 'रुपये'
|
|
44
|
+
|
|
45
|
+
// Paisa: singular/plural
|
|
46
|
+
const PAISA = 'पैसा'
|
|
47
|
+
const PAISE = 'पैसे'
|
|
48
|
+
|
|
25
49
|
const BELOW_HUNDRED = [
|
|
26
50
|
'शून्य', 'एक', 'दो', 'तीन', 'चार', 'पाँच', 'छह', 'सात', 'आठ', 'नौ',
|
|
27
51
|
'दस', 'ग्यारह', 'बारह', 'तेरह', 'चौदह', 'पंद्रह', 'सोलह', 'सत्रह', 'अठारह', 'उन्नीस',
|
|
@@ -145,8 +169,8 @@ function decimalPartToWords (decimalPart) {
|
|
|
145
169
|
* @param {number | string | bigint} value - The numeric value to convert
|
|
146
170
|
* @returns {string} The number in Hindi words
|
|
147
171
|
*/
|
|
148
|
-
function
|
|
149
|
-
const { isNegative, integerPart, decimalPart } =
|
|
172
|
+
function toCardinal (value) {
|
|
173
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
150
174
|
|
|
151
175
|
let result = ''
|
|
152
176
|
|
|
@@ -163,8 +187,94 @@ function toWords (value) {
|
|
|
163
187
|
return result
|
|
164
188
|
}
|
|
165
189
|
|
|
190
|
+
// ============================================================================
|
|
191
|
+
// ORDINAL: toOrdinal(value)
|
|
192
|
+
// ============================================================================
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Converts a positive integer to Hindi ordinal words.
|
|
196
|
+
*
|
|
197
|
+
* Hindi ordinals: First 6 are irregular, then add -वाँ suffix.
|
|
198
|
+
*
|
|
199
|
+
* @param {bigint} n - Positive integer to convert
|
|
200
|
+
* @returns {string} Hindi ordinal words
|
|
201
|
+
*/
|
|
202
|
+
function integerToOrdinal (n) {
|
|
203
|
+
// Special ordinals for 1-6
|
|
204
|
+
if (n >= 1n && n <= 6n) {
|
|
205
|
+
return ORDINAL_SPECIAL[Number(n)]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// For 7 and above, add suffix to cardinal
|
|
209
|
+
const cardinal = integerToWords(n)
|
|
210
|
+
return cardinal + ORDINAL_SUFFIX
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Converts a numeric value to Hindi ordinal words.
|
|
215
|
+
*
|
|
216
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
217
|
+
* @returns {string} The number as ordinal words
|
|
218
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
219
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* toOrdinal(1) // 'पहला'
|
|
223
|
+
* toOrdinal(2) // 'दूसरा'
|
|
224
|
+
* toOrdinal(3) // 'तीसरा'
|
|
225
|
+
* toOrdinal(10) // 'दसवाँ'
|
|
226
|
+
*/
|
|
227
|
+
function toOrdinal (value) {
|
|
228
|
+
const integerPart = parseOrdinalValue(value)
|
|
229
|
+
return integerToOrdinal(integerPart)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ============================================================================
|
|
233
|
+
// CURRENCY: toCurrency(value, options?)
|
|
234
|
+
// ============================================================================
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Converts a numeric value to Hindi currency words (Indian Rupee).
|
|
238
|
+
*
|
|
239
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
240
|
+
* @returns {string} The amount in Hindi currency words
|
|
241
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
242
|
+
* @throws {Error} If value is not a valid number format
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* toCurrency(42.50) // 'बयालीस रुपये पचास पैसे'
|
|
246
|
+
* toCurrency(1) // 'एक रुपया'
|
|
247
|
+
* toCurrency(0.01) // 'एक पैसा'
|
|
248
|
+
*/
|
|
249
|
+
function toCurrency (value) {
|
|
250
|
+
const { isNegative, dollars: rupees, cents: paise } = parseCurrencyValue(value)
|
|
251
|
+
|
|
252
|
+
// Build result
|
|
253
|
+
let result = ''
|
|
254
|
+
if (isNegative) result = NEGATIVE + ' '
|
|
255
|
+
|
|
256
|
+
// Rupees part - show if non-zero, or if no paise
|
|
257
|
+
if (rupees > 0n || paise === 0n) {
|
|
258
|
+
result += integerToWords(rupees)
|
|
259
|
+
// Singular for 1 rupee, plural otherwise
|
|
260
|
+
result += ' ' + (rupees === 1n ? RUPEE : RUPEES)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Paise part
|
|
264
|
+
if (paise > 0n) {
|
|
265
|
+
if (rupees > 0n) {
|
|
266
|
+
result += ' '
|
|
267
|
+
}
|
|
268
|
+
result += integerToWords(paise)
|
|
269
|
+
// Singular for 1 paisa, plural otherwise
|
|
270
|
+
result += ' ' + (paise === 1n ? PAISA : PAISE)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return result
|
|
274
|
+
}
|
|
275
|
+
|
|
166
276
|
// ============================================================================
|
|
167
277
|
// Exports
|
|
168
278
|
// ============================================================================
|
|
169
279
|
|
|
170
|
-
export {
|
|
280
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/hr-HR.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Croatian 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
|
+
* @returns {string} The number in Croatian words
|
|
8
|
+
*/
|
|
9
|
+
export function toCardinal(value: number | string | bigint, options?: {
|
|
10
|
+
gender?: "masculine" | "feminine" | undefined;
|
|
11
|
+
}): string;
|
|
12
|
+
/**
|
|
13
|
+
* Converts a numeric value to Croatian ordinal words (masculine nominative).
|
|
14
|
+
*
|
|
15
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
16
|
+
* @returns {string} The number as ordinal words
|
|
17
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
18
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* toOrdinal(1) // 'prvi'
|
|
22
|
+
* toOrdinal(2) // 'drugi'
|
|
23
|
+
* toOrdinal(21) // 'dvadeset prvi'
|
|
24
|
+
* toOrdinal(100) // 'stoti'
|
|
25
|
+
* toOrdinal(1000) // 'tisućiti'
|
|
26
|
+
*/
|
|
27
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
28
|
+
/**
|
|
29
|
+
* Converts a numeric value to Croatian currency words (Euro).
|
|
30
|
+
*
|
|
31
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
32
|
+
* @returns {string} The amount in Croatian currency words
|
|
33
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
34
|
+
* @throws {Error} If value is not a valid number format
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* toCurrency(42) // 'četrdeset dva eura'
|
|
38
|
+
* toCurrency(1) // 'jedan euro'
|
|
39
|
+
* toCurrency(1.50) // 'jedan euro pedeset centi'
|
|
40
|
+
* toCurrency(-5) // 'minus pet eura'
|
|
41
|
+
*/
|
|
42
|
+
export function toCurrency(value: number | string | bigint): string;
|
package/src/hr-HR.js
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Croatian (Croatia) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: hr-HR | Croatian as used in Croatia
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Three-form pluralization (one/few/many)
|
|
8
|
+
* - Gender: thousands are feminine, millions+ are masculine
|
|
9
|
+
* - Irregular hundreds (dvjesto, tristo, etc.)
|
|
10
|
+
* - Long scale naming with -ard forms
|
|
11
|
+
*/
|
|
12
|
+
|
|
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'
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Vocabulary
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
const ONES_MASC = ['', 'jedan', 'dva', 'tri', 'četiri', 'pet', 'šest', 'sedam', 'osam', 'devet']
|
|
23
|
+
const ONES_FEM = ['', 'jedna', 'dvije', 'tri', 'četiri', 'pet', 'šest', 'sedam', 'osam', 'devet']
|
|
24
|
+
|
|
25
|
+
const TEENS = ['deset', 'jedanaest', 'dvanaest', 'trinaest', 'četrnaest', 'petnaest', 'šesnaest', 'sedamnaest', 'osamnaest', 'devetnaest']
|
|
26
|
+
const TENS = ['', '', 'dvadeset', 'trideset', 'četrdeset', 'pedeset', 'šezdeset', 'sedamdeset', 'osamdeset', 'devedeset']
|
|
27
|
+
|
|
28
|
+
// Croatian has irregular hundreds
|
|
29
|
+
const HUNDREDS = ['', 'sto', 'dvjesto', 'tristo', 'četiristo', 'petsto', 'šesto', 'sedamsto', 'osamsto', 'devetsto']
|
|
30
|
+
|
|
31
|
+
const ZERO = 'nula'
|
|
32
|
+
const NEGATIVE = 'minus'
|
|
33
|
+
const DECIMAL_SEP = 'zarez'
|
|
34
|
+
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Ordinal Vocabulary
|
|
37
|
+
// ============================================================================
|
|
38
|
+
|
|
39
|
+
// Croatian ordinals (masculine nominative singular)
|
|
40
|
+
const ORDINAL_ONES = ['', 'prvi', 'drugi', 'treći', 'četvrti', 'peti', 'šesti', 'sedmi', 'osmi', 'deveti']
|
|
41
|
+
|
|
42
|
+
// Ordinal teens
|
|
43
|
+
const ORDINAL_TEENS = ['deseti', 'jedanaesti', 'dvanaesti', 'trinaesti', 'četrnaesti', 'petnaesti', 'šesnaesti', 'sedamnaesti', 'osamnaesti', 'devetnaesti']
|
|
44
|
+
|
|
45
|
+
// Ordinal tens (for exact tens)
|
|
46
|
+
const ORDINAL_TENS = ['', '', 'dvadeseti', 'trideseti', 'četrdeseti', 'pedeseti', 'šezdeseti', 'sedamdeseti', 'osamdeseti', 'devedeseti']
|
|
47
|
+
|
|
48
|
+
// Ordinal hundreds (for exact hundreds)
|
|
49
|
+
const ORDINAL_HUNDREDS = ['', 'stoti', 'dvjestoti', 'tristoti', 'četiristoti', 'petstoti', 'šeststoti', 'sedamstoti', 'osamstoti', 'devetstoti']
|
|
50
|
+
|
|
51
|
+
// Scale ordinals
|
|
52
|
+
const ORDINAL_SCALES = ['tisućiti', 'milijunti', 'milijarditi', 'bilijunti']
|
|
53
|
+
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Currency Vocabulary (Croatian Kuna - now Euro)
|
|
56
|
+
// ============================================================================
|
|
57
|
+
|
|
58
|
+
// Euro forms: [singular, few (2-4), many (5+)] - masculine
|
|
59
|
+
const EURO_FORMS = ['euro', 'eura', 'eura']
|
|
60
|
+
// Cent forms: [singular, few (2-4), many (5+)] - masculine
|
|
61
|
+
const CENT_FORMS = ['cent', 'centa', 'centi']
|
|
62
|
+
|
|
63
|
+
// Scale words: [singular, few, many]
|
|
64
|
+
// Thousands (index 0) are feminine, rest are masculine
|
|
65
|
+
const SCALE_FORMS = [
|
|
66
|
+
['tisuća', 'tisuće', 'tisuća'],
|
|
67
|
+
['milijun', 'milijuna', 'milijuna'],
|
|
68
|
+
['milijarda', 'milijarde', 'milijarda'],
|
|
69
|
+
['bilijun', 'bilijuna', 'bilijuna'],
|
|
70
|
+
['bilijarda', 'bilijarde', 'bilijarda'],
|
|
71
|
+
['trilijun', 'trilijuna', 'trilijuna'],
|
|
72
|
+
['trilijarda', 'trilijarde', 'trilijarda'],
|
|
73
|
+
['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna'],
|
|
74
|
+
['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda']
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Segment Building
|
|
79
|
+
// ============================================================================
|
|
80
|
+
|
|
81
|
+
function pluralize (n, forms) {
|
|
82
|
+
const num = typeof n === 'bigint' ? Number(n) : n
|
|
83
|
+
const lastDigit = num % 10
|
|
84
|
+
const lastTwoDigits = num % 100
|
|
85
|
+
|
|
86
|
+
if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
|
|
87
|
+
return forms[2]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (lastDigit === 1) return forms[0]
|
|
91
|
+
if (lastDigit >= 2 && lastDigit <= 4) return forms[1]
|
|
92
|
+
return forms[2]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function buildSegmentMasc (n) {
|
|
96
|
+
if (n === 0) return ''
|
|
97
|
+
|
|
98
|
+
const onesDigit = n % 10
|
|
99
|
+
const tensDigit = Math.trunc(n / 10) % 10
|
|
100
|
+
const hundredsDigit = Math.trunc(n / 100)
|
|
101
|
+
|
|
102
|
+
const parts = []
|
|
103
|
+
|
|
104
|
+
if (hundredsDigit > 0) {
|
|
105
|
+
parts.push(HUNDREDS[hundredsDigit])
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (tensDigit > 1) {
|
|
109
|
+
parts.push(TENS[tensDigit])
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (tensDigit === 1) {
|
|
113
|
+
parts.push(TEENS[onesDigit])
|
|
114
|
+
} else if (onesDigit > 0) {
|
|
115
|
+
parts.push(ONES_MASC[onesDigit])
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return parts.join(' ')
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function buildSegmentFem (n) {
|
|
122
|
+
if (n === 0) return ''
|
|
123
|
+
|
|
124
|
+
const onesDigit = n % 10
|
|
125
|
+
const tensDigit = Math.trunc(n / 10) % 10
|
|
126
|
+
const hundredsDigit = Math.trunc(n / 100)
|
|
127
|
+
|
|
128
|
+
const parts = []
|
|
129
|
+
|
|
130
|
+
if (hundredsDigit > 0) {
|
|
131
|
+
parts.push(HUNDREDS[hundredsDigit])
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (tensDigit > 1) {
|
|
135
|
+
parts.push(TENS[tensDigit])
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (tensDigit === 1) {
|
|
139
|
+
parts.push(TEENS[onesDigit])
|
|
140
|
+
} else if (onesDigit > 0) {
|
|
141
|
+
parts.push(ONES_FEM[onesDigit])
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return parts.join(' ')
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Conversion Functions
|
|
149
|
+
// ============================================================================
|
|
150
|
+
|
|
151
|
+
function integerToWords (n, gender) {
|
|
152
|
+
if (n === 0n) return ZERO
|
|
153
|
+
|
|
154
|
+
if (n < 1000n) {
|
|
155
|
+
return gender === 'feminine' ? buildSegmentFem(Number(n)) : buildSegmentMasc(Number(n))
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return buildLargeNumberWords(n, gender)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function buildLargeNumberWords (n, gender) {
|
|
162
|
+
const numStr = n.toString()
|
|
163
|
+
const len = numStr.length
|
|
164
|
+
|
|
165
|
+
const segments = []
|
|
166
|
+
const segmentSize = 3
|
|
167
|
+
|
|
168
|
+
const remainderLen = len % segmentSize
|
|
169
|
+
let pos = 0
|
|
170
|
+
if (remainderLen > 0) {
|
|
171
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
172
|
+
pos = remainderLen
|
|
173
|
+
}
|
|
174
|
+
while (pos < len) {
|
|
175
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
176
|
+
pos += segmentSize
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const parts = []
|
|
180
|
+
let scaleIndex = segments.length - 1
|
|
181
|
+
|
|
182
|
+
for (let i = 0; i < segments.length; i++) {
|
|
183
|
+
const segment = segments[i]
|
|
184
|
+
|
|
185
|
+
if (segment !== 0) {
|
|
186
|
+
if (scaleIndex === 0) {
|
|
187
|
+
parts.push(gender === 'feminine' ? buildSegmentFem(segment) : buildSegmentMasc(segment))
|
|
188
|
+
} else {
|
|
189
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
190
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
191
|
+
// Thousands (scaleIndex=1) are feminine, others masculine
|
|
192
|
+
const isFeminine = scaleIndex === 1
|
|
193
|
+
const segmentWord = isFeminine ? buildSegmentFem(segment) : buildSegmentMasc(segment)
|
|
194
|
+
parts.push(segmentWord + ' ' + scaleWord)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
scaleIndex--
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return parts.join(' ')
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function decimalPartToWords (decimalPart, gender) {
|
|
205
|
+
let result = ''
|
|
206
|
+
let i = 0
|
|
207
|
+
|
|
208
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
209
|
+
if (result) result += ' '
|
|
210
|
+
result += ZERO
|
|
211
|
+
i++
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const remainder = decimalPart.slice(i)
|
|
215
|
+
if (remainder) {
|
|
216
|
+
if (result) result += ' '
|
|
217
|
+
result += integerToWords(BigInt(remainder), gender)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return result
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Converts a numeric value to Croatian words.
|
|
225
|
+
*
|
|
226
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
227
|
+
* @param {Object} [options] - Optional configuration
|
|
228
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
229
|
+
* @returns {string} The number in Croatian words
|
|
230
|
+
*/
|
|
231
|
+
function toCardinal (value, options) {
|
|
232
|
+
options = validateOptions(options)
|
|
233
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
234
|
+
|
|
235
|
+
// Apply option defaults
|
|
236
|
+
const { gender = 'masculine' } = options
|
|
237
|
+
|
|
238
|
+
let result = ''
|
|
239
|
+
|
|
240
|
+
if (isNegative) {
|
|
241
|
+
result = NEGATIVE + ' '
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
result += integerToWords(integerPart, gender)
|
|
245
|
+
|
|
246
|
+
if (decimalPart) {
|
|
247
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, gender)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return result
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// ORDINAL: toOrdinal(value)
|
|
255
|
+
// ============================================================================
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
|
|
259
|
+
*
|
|
260
|
+
* @param {number} n - Number 0-99
|
|
261
|
+
* @returns {string} Ordinal words
|
|
262
|
+
*/
|
|
263
|
+
function buildOrdinalTensOnes (n) {
|
|
264
|
+
if (n === 0) return ''
|
|
265
|
+
|
|
266
|
+
const onesDigit = n % 10
|
|
267
|
+
const tensDigit = Math.trunc(n / 10)
|
|
268
|
+
|
|
269
|
+
if (tensDigit === 0) {
|
|
270
|
+
return ORDINAL_ONES[onesDigit]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (tensDigit === 1) {
|
|
274
|
+
return ORDINAL_TEENS[onesDigit]
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (onesDigit === 0) {
|
|
278
|
+
return ORDINAL_TENS[tensDigit]
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Converts a positive integer to Croatian ordinal words (masculine nominative).
|
|
286
|
+
*
|
|
287
|
+
* @param {bigint} n - Positive integer to convert
|
|
288
|
+
* @returns {string} Ordinal Croatian words
|
|
289
|
+
*/
|
|
290
|
+
function integerToOrdinal (n) {
|
|
291
|
+
if (n < 100n) {
|
|
292
|
+
return buildOrdinalTensOnes(Number(n))
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (n < 1000n) {
|
|
296
|
+
const num = Number(n)
|
|
297
|
+
const hundredsDigit = Math.trunc(num / 100)
|
|
298
|
+
const remainder = num % 100
|
|
299
|
+
|
|
300
|
+
if (remainder === 0) {
|
|
301
|
+
return ORDINAL_HUNDREDS[hundredsDigit]
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return HUNDREDS[hundredsDigit] + ' ' + buildOrdinalTensOnes(remainder)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (n < 1_000_000n) {
|
|
308
|
+
const thousands = Number(n / 1000n)
|
|
309
|
+
const remainder = Number(n % 1000n)
|
|
310
|
+
|
|
311
|
+
if (remainder === 0) {
|
|
312
|
+
if (thousands === 1) {
|
|
313
|
+
return ORDINAL_SCALES[0]
|
|
314
|
+
}
|
|
315
|
+
return buildSegmentFem(thousands) + ' ' + ORDINAL_SCALES[0]
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
319
|
+
const thousandsWord = buildSegmentFem(thousands)
|
|
320
|
+
return thousandsWord + ' ' + scaleWord + ' ' + integerToOrdinal(BigInt(remainder))
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return buildLargeOrdinal(n)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Builds ordinal words for numbers >= 1,000,000.
|
|
328
|
+
*
|
|
329
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
330
|
+
* @returns {string} Ordinal Croatian words
|
|
331
|
+
*/
|
|
332
|
+
function buildLargeOrdinal (n) {
|
|
333
|
+
const numStr = n.toString()
|
|
334
|
+
const len = numStr.length
|
|
335
|
+
|
|
336
|
+
const segments = []
|
|
337
|
+
const segmentSize = 3
|
|
338
|
+
|
|
339
|
+
const remainderLen = len % segmentSize
|
|
340
|
+
let pos = 0
|
|
341
|
+
if (remainderLen > 0) {
|
|
342
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
343
|
+
pos = remainderLen
|
|
344
|
+
}
|
|
345
|
+
while (pos < len) {
|
|
346
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
347
|
+
pos += segmentSize
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
let lastNonZeroIdx = segments.length - 1
|
|
351
|
+
while (lastNonZeroIdx >= 0 && segments[lastNonZeroIdx] === 0) {
|
|
352
|
+
lastNonZeroIdx--
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const parts = []
|
|
356
|
+
let scaleIndex = segments.length - 1
|
|
357
|
+
|
|
358
|
+
for (let i = 0; i < segments.length; i++) {
|
|
359
|
+
const segment = segments[i]
|
|
360
|
+
|
|
361
|
+
if (segment !== 0) {
|
|
362
|
+
const isLastNonZero = (i === lastNonZeroIdx)
|
|
363
|
+
|
|
364
|
+
if (scaleIndex === 0) {
|
|
365
|
+
if (isLastNonZero) {
|
|
366
|
+
parts.push(integerToOrdinal(BigInt(segment)))
|
|
367
|
+
} else {
|
|
368
|
+
parts.push(buildSegmentMasc(segment))
|
|
369
|
+
}
|
|
370
|
+
} else {
|
|
371
|
+
if (isLastNonZero) {
|
|
372
|
+
if (segment === 1) {
|
|
373
|
+
parts.push(ORDINAL_SCALES[scaleIndex - 1])
|
|
374
|
+
} else {
|
|
375
|
+
const isFeminine = scaleIndex === 1
|
|
376
|
+
const segmentWord = isFeminine ? buildSegmentFem(segment) : buildSegmentMasc(segment)
|
|
377
|
+
parts.push(segmentWord + ' ' + ORDINAL_SCALES[scaleIndex - 1])
|
|
378
|
+
}
|
|
379
|
+
} else {
|
|
380
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
381
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
382
|
+
const isFeminine = scaleIndex === 1
|
|
383
|
+
const segmentWord = isFeminine ? buildSegmentFem(segment) : buildSegmentMasc(segment)
|
|
384
|
+
parts.push(segmentWord + ' ' + scaleWord)
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
scaleIndex--
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return parts.join(' ')
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Converts a numeric value to Croatian ordinal words (masculine nominative).
|
|
397
|
+
*
|
|
398
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
399
|
+
* @returns {string} The number as ordinal words
|
|
400
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
401
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
402
|
+
*
|
|
403
|
+
* @example
|
|
404
|
+
* toOrdinal(1) // 'prvi'
|
|
405
|
+
* toOrdinal(2) // 'drugi'
|
|
406
|
+
* toOrdinal(21) // 'dvadeset prvi'
|
|
407
|
+
* toOrdinal(100) // 'stoti'
|
|
408
|
+
* toOrdinal(1000) // 'tisućiti'
|
|
409
|
+
*/
|
|
410
|
+
function toOrdinal (value) {
|
|
411
|
+
const integerPart = parseOrdinalValue(value)
|
|
412
|
+
return integerToOrdinal(integerPart)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// ============================================================================
|
|
416
|
+
// CURRENCY: toCurrency(value)
|
|
417
|
+
// ============================================================================
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Converts a numeric value to Croatian currency words (Euro).
|
|
421
|
+
*
|
|
422
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
423
|
+
* @returns {string} The amount in Croatian currency words
|
|
424
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
425
|
+
* @throws {Error} If value is not a valid number format
|
|
426
|
+
*
|
|
427
|
+
* @example
|
|
428
|
+
* toCurrency(42) // 'četrdeset dva eura'
|
|
429
|
+
* toCurrency(1) // 'jedan euro'
|
|
430
|
+
* toCurrency(1.50) // 'jedan euro pedeset centi'
|
|
431
|
+
* toCurrency(-5) // 'minus pet eura'
|
|
432
|
+
*/
|
|
433
|
+
function toCurrency (value) {
|
|
434
|
+
const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
|
|
435
|
+
|
|
436
|
+
let result = ''
|
|
437
|
+
if (isNegative) {
|
|
438
|
+
result = NEGATIVE + ' '
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Euro part (masculine)
|
|
442
|
+
if (euros > 0n || cents === 0n) {
|
|
443
|
+
result += integerToWords(euros, 'masculine')
|
|
444
|
+
result += ' ' + pluralize(euros, EURO_FORMS)
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Cent part (masculine)
|
|
448
|
+
if (cents > 0n) {
|
|
449
|
+
if (euros > 0n) {
|
|
450
|
+
result += ' '
|
|
451
|
+
}
|
|
452
|
+
result += integerToWords(cents, 'masculine')
|
|
453
|
+
result += ' ' + pluralize(cents, CENT_FORMS)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return result
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// ============================================================================
|
|
460
|
+
// Exports
|
|
461
|
+
// ============================================================================
|
|
462
|
+
|
|
463
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/hu-HU.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Hungarian words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Hungarian words
|
|
6
|
+
*/
|
|
7
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a numeric value to Hungarian 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) // 'első'
|
|
18
|
+
* toOrdinal(2) // 'második'
|
|
19
|
+
* toOrdinal(21) // 'huszonegyedik'
|
|
20
|
+
*/
|
|
21
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
22
|
+
/**
|
|
23
|
+
* Converts a numeric value to Hungarian currency words (Hungarian Forint).
|
|
24
|
+
*
|
|
25
|
+
* Uses forint (no plural form needed in Hungarian).
|
|
26
|
+
* Fillér (1/100) is rarely used but included for completeness.
|
|
27
|
+
*
|
|
28
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
29
|
+
* @returns {string} The amount in Hungarian currency words
|
|
30
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
31
|
+
* @throws {Error} If value is not a valid number format
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* toCurrency(42) // 'negyvenkettő forint'
|
|
35
|
+
* toCurrency(1.50) // 'egy forint ötven fillér'
|
|
36
|
+
* toCurrency(-5) // 'mínusz öt forint'
|
|
37
|
+
*/
|
|
38
|
+
export function toCurrency(value: number | string | bigint): string;
|