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/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;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Hungarian language converter
|
|
2
|
+
* Hungarian (Hungary) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: hu-HU | Hungarian as used in Hungary
|
|
5
5
|
*
|
|
6
6
|
* Key features:
|
|
7
7
|
* - Agglutinative structure (no spaces between compound parts)
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* - "két" instead of "kettő" in compound forms
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
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'
|
|
14
16
|
|
|
15
17
|
// ============================================================================
|
|
16
18
|
// Vocabulary
|
|
@@ -71,6 +73,42 @@ const ZERO = 'nulla'
|
|
|
71
73
|
const NEGATIVE = 'mínusz'
|
|
72
74
|
const DECIMAL_SEP = 'egész'
|
|
73
75
|
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Ordinal Vocabulary
|
|
78
|
+
// ============================================================================
|
|
79
|
+
|
|
80
|
+
// Hungarian ordinals: special forms 1-10, then cardinal + -dik/-ik suffix
|
|
81
|
+
// Vowel harmony determines -dik vs -ik
|
|
82
|
+
const ORDINAL_SPECIAL = {
|
|
83
|
+
1: 'első',
|
|
84
|
+
2: 'második',
|
|
85
|
+
3: 'harmadik',
|
|
86
|
+
4: 'negyedik',
|
|
87
|
+
5: 'ötödik',
|
|
88
|
+
6: 'hatodik',
|
|
89
|
+
7: 'hetedik',
|
|
90
|
+
8: 'nyolcadik',
|
|
91
|
+
9: 'kilencedik',
|
|
92
|
+
10: 'tizedik',
|
|
93
|
+
20: 'huszadik',
|
|
94
|
+
30: 'harmincadik',
|
|
95
|
+
40: 'negyvenedik',
|
|
96
|
+
50: 'ötvenedik',
|
|
97
|
+
60: 'hatvanadik',
|
|
98
|
+
70: 'hetvenedik',
|
|
99
|
+
80: 'nyolcvanadik',
|
|
100
|
+
90: 'kilencvenedik',
|
|
101
|
+
100: 'századik',
|
|
102
|
+
1000: 'ezredik'
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Currency Vocabulary (Hungarian Forint)
|
|
107
|
+
// ============================================================================
|
|
108
|
+
|
|
109
|
+
const FORINT = 'forint' // same singular and plural
|
|
110
|
+
const FILLER = 'fillér' // subunit (rarely used, same singular and plural)
|
|
111
|
+
|
|
74
112
|
// ============================================================================
|
|
75
113
|
// Conversion Functions
|
|
76
114
|
// ============================================================================
|
|
@@ -191,8 +229,8 @@ function decimalPartToWords (decimalPart) {
|
|
|
191
229
|
* @param {number | string | bigint} value - The numeric value to convert
|
|
192
230
|
* @returns {string} The number in Hungarian words
|
|
193
231
|
*/
|
|
194
|
-
function
|
|
195
|
-
const { isNegative, integerPart, decimalPart } =
|
|
232
|
+
function toCardinal (value) {
|
|
233
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
196
234
|
|
|
197
235
|
let result = ''
|
|
198
236
|
|
|
@@ -209,8 +247,128 @@ function toWords (value) {
|
|
|
209
247
|
return result
|
|
210
248
|
}
|
|
211
249
|
|
|
250
|
+
// ============================================================================
|
|
251
|
+
// ORDINAL: toOrdinal(value)
|
|
252
|
+
// ============================================================================
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Converts a non-negative integer to Hungarian ordinal words.
|
|
256
|
+
*
|
|
257
|
+
* Hungarian ordinals: első (1st), második (2nd), harmadik (3rd), etc.
|
|
258
|
+
* 1-10 have special forms, others use cardinal + -dik/-edik/-adik/-ödik suffix.
|
|
259
|
+
*
|
|
260
|
+
* @param {bigint} n - Positive integer to convert
|
|
261
|
+
* @returns {string} Hungarian ordinal words
|
|
262
|
+
*/
|
|
263
|
+
function integerToOrdinal (n) {
|
|
264
|
+
const num = Number(n)
|
|
265
|
+
|
|
266
|
+
// Exact special forms
|
|
267
|
+
if (ORDINAL_SPECIAL[num]) {
|
|
268
|
+
return ORDINAL_SPECIAL[num]
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// For compound numbers, get cardinal and add suffix
|
|
272
|
+
const cardinal = integerToWords(n)
|
|
273
|
+
|
|
274
|
+
// Determine suffix based on last vowel (vowel harmony)
|
|
275
|
+
// Back vowels (a,á,o,ó,u,ú) -> -adik
|
|
276
|
+
// Front unrounded (e,é,i,í) -> -edik
|
|
277
|
+
// Front rounded (ö,ő,ü,ű) -> -ödik
|
|
278
|
+
// If ends in consonant, add linking vowel + dik
|
|
279
|
+
|
|
280
|
+
const lastChar = cardinal[cardinal.length - 1]
|
|
281
|
+
|
|
282
|
+
// If ends in vowel, just add -dik
|
|
283
|
+
if ('aáoóuúeéiíöőüű'.includes(lastChar)) {
|
|
284
|
+
return cardinal + 'dik'
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// If ends in consonant, find last vowel for harmony
|
|
288
|
+
const backVowels = 'aáoóuú'
|
|
289
|
+
const frontRoundedVowels = 'öőüű'
|
|
290
|
+
|
|
291
|
+
for (let i = cardinal.length - 1; i >= 0; i--) {
|
|
292
|
+
const char = cardinal[i]
|
|
293
|
+
if (backVowels.includes(char)) {
|
|
294
|
+
return cardinal + 'adik'
|
|
295
|
+
}
|
|
296
|
+
if (frontRoundedVowels.includes(char)) {
|
|
297
|
+
return cardinal + 'ödik'
|
|
298
|
+
}
|
|
299
|
+
if ('eéií'.includes(char)) {
|
|
300
|
+
return cardinal + 'edik'
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Default to -edik
|
|
305
|
+
return cardinal + 'edik'
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Converts a numeric value to Hungarian ordinal words.
|
|
310
|
+
*
|
|
311
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
312
|
+
* @returns {string} The number as ordinal words
|
|
313
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
314
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* toOrdinal(1) // 'első'
|
|
318
|
+
* toOrdinal(2) // 'második'
|
|
319
|
+
* toOrdinal(21) // 'huszonegyedik'
|
|
320
|
+
*/
|
|
321
|
+
function toOrdinal (value) {
|
|
322
|
+
const integerPart = parseOrdinalValue(value)
|
|
323
|
+
return integerToOrdinal(integerPart)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ============================================================================
|
|
327
|
+
// CURRENCY: toCurrency(value)
|
|
328
|
+
// ============================================================================
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Converts a numeric value to Hungarian currency words (Hungarian Forint).
|
|
332
|
+
*
|
|
333
|
+
* Uses forint (no plural form needed in Hungarian).
|
|
334
|
+
* Fillér (1/100) is rarely used but included for completeness.
|
|
335
|
+
*
|
|
336
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
337
|
+
* @returns {string} The amount in Hungarian currency words
|
|
338
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
339
|
+
* @throws {Error} If value is not a valid number format
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* toCurrency(42) // 'negyvenkettő forint'
|
|
343
|
+
* toCurrency(1.50) // 'egy forint ötven fillér'
|
|
344
|
+
* toCurrency(-5) // 'mínusz öt forint'
|
|
345
|
+
*/
|
|
346
|
+
function toCurrency (value) {
|
|
347
|
+
const { isNegative, dollars: forint, cents: filler } = parseCurrencyValue(value)
|
|
348
|
+
|
|
349
|
+
let result = ''
|
|
350
|
+
if (isNegative) {
|
|
351
|
+
result = NEGATIVE + ' '
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Forint part
|
|
355
|
+
if (forint > 0n || filler === 0n) {
|
|
356
|
+
result += integerToWords(forint) + ' ' + FORINT
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Fillér part
|
|
360
|
+
if (filler > 0n) {
|
|
361
|
+
if (forint > 0n) {
|
|
362
|
+
result += ' '
|
|
363
|
+
}
|
|
364
|
+
result += integerToWords(filler) + ' ' + FILLER
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return result
|
|
368
|
+
}
|
|
369
|
+
|
|
212
370
|
// ============================================================================
|
|
213
371
|
// Exports
|
|
214
372
|
// ============================================================================
|
|
215
373
|
|
|
216
|
-
export {
|
|
374
|
+
export { toCardinal, toOrdinal, toCurrency }
|