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/uk-UA.js
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ukrainian (Ukraine) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: uk-UA | Ukrainian as used in Ukraine
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Three-form pluralization (one/few/many)
|
|
8
|
+
* - Gender: thousands are feminine, millions+ are masculine
|
|
9
|
+
* - Irregular hundreds
|
|
10
|
+
* - Long scale naming
|
|
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 = ['', 'один', 'два', 'три', 'чотири', 'п\'ять', 'шiсть', 'сiм', 'вiсiм', 'дев\'ять']
|
|
23
|
+
const ONES_FEM = ['', 'одна', 'двi', 'три', 'чотири', 'п\'ять', 'шiсть', 'сiм', 'вiсiм', 'дев\'ять']
|
|
24
|
+
|
|
25
|
+
const TEENS = ['десять', 'одинадцять', 'дванадцять', 'тринадцять', 'чотирнадцять', 'п\'ятнадцять', 'шiстнадцять', 'сiмнадцять', 'вiсiмнадцять', 'дев\'ятнадцять']
|
|
26
|
+
const TENS = ['', '', 'двадцять', 'тридцять', 'сорок', 'п\'ятдесят', 'шiстдесят', 'сiмдесят', 'вiсiмдесят', 'дев\'яносто']
|
|
27
|
+
|
|
28
|
+
// Irregular hundreds
|
|
29
|
+
const HUNDREDS = ['', 'сто', 'двiстi', 'триста', 'чотириста', 'п\'ятсот', 'шiстсот', 'сiмсот', 'вiсiмсот', 'дев\'ятсот']
|
|
30
|
+
|
|
31
|
+
const ZERO = 'нуль'
|
|
32
|
+
const NEGATIVE = 'мiнус'
|
|
33
|
+
const DECIMAL_SEP = 'кома'
|
|
34
|
+
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Ordinal Vocabulary
|
|
37
|
+
// ============================================================================
|
|
38
|
+
|
|
39
|
+
// Ukrainian ordinals (masculine nominative singular)
|
|
40
|
+
const ORDINAL_ONES = ['', 'перший', 'другий', 'третiй', 'четвертий', 'п\'ятий', 'шостий', 'сьомий', 'восьмий', 'дев\'ятий']
|
|
41
|
+
|
|
42
|
+
// Teens ordinals
|
|
43
|
+
const ORDINAL_TEENS = ['десятий', 'одинадцятий', 'дванадцятий', 'тринадцятий', 'чотирнадцятий', 'п\'ятнадцятий', 'шiстнадцятий', 'сiмнадцятий', 'вiсiмнадцятий', 'дев\'ятнадцятий']
|
|
44
|
+
|
|
45
|
+
// Tens ordinals (for exact tens)
|
|
46
|
+
const ORDINAL_TENS = ['', '', 'двадцятий', 'тридцятий', 'сороковий', 'п\'ятдесятий', 'шiстдесятий', 'сiмдесятий', 'вiсiмдесятий', 'дев\'яностий']
|
|
47
|
+
|
|
48
|
+
// Hundreds ordinals (for exact hundreds)
|
|
49
|
+
const ORDINAL_HUNDREDS = ['', 'сотий', 'двохсотий', 'трьохсотий', 'чотирьохсотий', 'п\'ятисотий', 'шестисотий', 'семисотий', 'восьмисотий', 'дев\'ятисотий']
|
|
50
|
+
|
|
51
|
+
// Scale ordinals
|
|
52
|
+
const ORDINAL_SCALES = ['тисячний', 'мiльйонний', 'мiльярдний', 'трильйонний']
|
|
53
|
+
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Currency Vocabulary (Ukrainian Hryvnia)
|
|
56
|
+
// ============================================================================
|
|
57
|
+
|
|
58
|
+
// Hryvnia forms: [singular, few (2-4), many (5+)]
|
|
59
|
+
const HRYVNIA_FORMS = ['гривня', 'гривнi', 'гривень']
|
|
60
|
+
// Kopiyka forms: [singular, few (2-4), many (5+)]
|
|
61
|
+
const KOPIYKA_FORMS = ['копiйка', 'копiйки', 'копiйок']
|
|
62
|
+
|
|
63
|
+
// Scale words: [singular, few, many]
|
|
64
|
+
// Thousands (index 0) are feminine, rest are masculine
|
|
65
|
+
const SCALE_FORMS = [
|
|
66
|
+
['тисяча', 'тисячi', 'тисяч'],
|
|
67
|
+
['мiльйон', 'мiльйони', 'мiльйонiв'],
|
|
68
|
+
['мiльярд', 'мiльярди', 'мiльярдiв'],
|
|
69
|
+
['трильйон', 'трильйони', 'трильйонiв'],
|
|
70
|
+
['квадрильйон', 'квадрильйони', 'квадрильйонiв'],
|
|
71
|
+
['квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'],
|
|
72
|
+
['секстильйон', 'секстильйони', 'секстильйонiв'],
|
|
73
|
+
['септильйон', 'септильйони', 'септильйонiв'],
|
|
74
|
+
['октильйон', 'октильйони', 'октильйонiв']
|
|
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 Ukrainian 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 Ukrainian 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 Ukrainian ordinal words (masculine nominative).
|
|
286
|
+
*
|
|
287
|
+
* @param {bigint} n - Positive integer to convert
|
|
288
|
+
* @returns {string} Ordinal Ukrainian 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 Ukrainian 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 Ukrainian 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) // 'перший'
|
|
405
|
+
* toOrdinal(2) // 'другий'
|
|
406
|
+
* toOrdinal(21) // 'двадцять перший'
|
|
407
|
+
* toOrdinal(100) // 'сотий'
|
|
408
|
+
* toOrdinal(1000) // 'тисячний'
|
|
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 Ukrainian currency words (Hryvnia).
|
|
421
|
+
*
|
|
422
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
423
|
+
* @returns {string} The amount in Ukrainian 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) // 'сорок двi гривнi'
|
|
429
|
+
* toCurrency(1) // 'одна гривня'
|
|
430
|
+
* toCurrency(1.50) // 'одна гривня п\'ятдесят копiйок'
|
|
431
|
+
* toCurrency(-5) // 'мiнус п\'ять гривень'
|
|
432
|
+
*/
|
|
433
|
+
function toCurrency (value) {
|
|
434
|
+
const { isNegative, dollars: hryvnia, cents: kopiyky } = parseCurrencyValue(value)
|
|
435
|
+
|
|
436
|
+
let result = ''
|
|
437
|
+
if (isNegative) {
|
|
438
|
+
result = NEGATIVE + ' '
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Hryvnia part (feminine)
|
|
442
|
+
if (hryvnia > 0n || kopiyky === 0n) {
|
|
443
|
+
result += integerToWords(hryvnia, 'feminine')
|
|
444
|
+
result += ' ' + pluralize(hryvnia, HRYVNIA_FORMS)
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Kopiyky part (feminine)
|
|
448
|
+
if (kopiyky > 0n) {
|
|
449
|
+
if (hryvnia > 0n) {
|
|
450
|
+
result += ' '
|
|
451
|
+
}
|
|
452
|
+
result += integerToWords(kopiyky, 'feminine')
|
|
453
|
+
result += ' ' + pluralize(kopiyky, KOPIYKA_FORMS)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return result
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// ============================================================================
|
|
460
|
+
// Exports
|
|
461
|
+
// ============================================================================
|
|
462
|
+
|
|
463
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/ur-PK.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Urdu words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Urdu words
|
|
6
|
+
*/
|
|
7
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a numeric value to Urdu 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) // 'پہلا'
|
|
18
|
+
* toOrdinal(2) // 'دوسرا'
|
|
19
|
+
* toOrdinal(3) // 'تیسرا'
|
|
20
|
+
* toOrdinal(10) // 'دسواں'
|
|
21
|
+
*/
|
|
22
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a numeric value to Urdu currency words (Pakistani Rupee).
|
|
25
|
+
*
|
|
26
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
27
|
+
* @returns {string} The amount in Urdu currency words
|
|
28
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
29
|
+
* @throws {Error} If value is not a valid number format
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* toCurrency(42.50) // 'بیالیس روپے پچاس پیسے'
|
|
33
|
+
* toCurrency(1) // 'ایک روپیہ'
|
|
34
|
+
* toCurrency(0.01) // 'ایک پیسہ'
|
|
35
|
+
*/
|
|
36
|
+
export function toCurrency(value: number | string | bigint): string;
|