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/lv-LV.js
ADDED
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Latvian (Latvia) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: lv-LV | Latvian as used in Latvia
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Two-form pluralization (singular for 1 except 11, plural otherwise)
|
|
8
|
+
* - Gender agreement (masculine/feminine for numbers < 1000)
|
|
9
|
+
* - Special hundreds forms (simts/simti/simtu)
|
|
10
|
+
* - Omit "one" before scale words
|
|
11
|
+
* - Long scale naming
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
17
|
+
import { validateOptions } from './utils/validate-options.js'
|
|
18
|
+
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Vocabulary (module-level constants)
|
|
21
|
+
// ============================================================================
|
|
22
|
+
|
|
23
|
+
const ONES_MASC = ['', 'viens', 'divi', 'trīs', 'četri', 'pieci', 'seši', 'septiņi', 'astoņi', 'deviņi']
|
|
24
|
+
const ONES_FEM = ['', 'viena', 'divas', 'trīs', 'četras', 'piecas', 'sešas', 'septiņas', 'astoņas', 'deviņas']
|
|
25
|
+
|
|
26
|
+
const TEENS = ['desmit', 'vienpadsmit', 'divpadsmit', 'trīspadsmit', 'četrpadsmit', 'piecpadsmit', 'sešpadsmit', 'septiņpadsmit', 'astoņpadsmit', 'deviņpadsmit']
|
|
27
|
+
const TENS = ['', '', 'divdesmit', 'trīsdesmit', 'četrdesmit', 'piecdesmit', 'sešdesmit', 'septiņdesmit', 'astoņdesmit', 'deviņdesmit']
|
|
28
|
+
|
|
29
|
+
// Hundreds: simts (100, 110-199), simti (200-999), simtu (101-109)
|
|
30
|
+
const HUNDRED_SINGULAR = 'simts'
|
|
31
|
+
const HUNDRED_PLURAL = 'simti'
|
|
32
|
+
const HUNDRED_GENITIVE = 'simtu'
|
|
33
|
+
|
|
34
|
+
const ZERO = 'nulle'
|
|
35
|
+
const NEGATIVE = 'mīnus'
|
|
36
|
+
const DECIMAL_SEP = 'komats'
|
|
37
|
+
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Ordinal Vocabulary
|
|
40
|
+
// ============================================================================
|
|
41
|
+
|
|
42
|
+
// Latvian ordinals (masculine nominative singular)
|
|
43
|
+
const ORDINAL_ONES = ['', 'pirmais', 'otrais', 'trešais', 'ceturtais', 'piektais', 'sestais', 'septītais', 'astotais', 'devītais']
|
|
44
|
+
|
|
45
|
+
// Ordinal teens
|
|
46
|
+
const ORDINAL_TEENS = ['desmitais', 'vienpadsmitais', 'divpadsmitais', 'trīspadsmitais', 'četrpadsmitais', 'piecpadsmitais', 'sešpadsmitais', 'septiņpadsmitais', 'astoņpadsmitais', 'deviņpadsmitais']
|
|
47
|
+
|
|
48
|
+
// Ordinal tens
|
|
49
|
+
const ORDINAL_TENS = ['', '', 'divdesmitais', 'trīsdesmitais', 'četrdesmitais', 'piecdesmitais', 'sešdesmitais', 'septiņdesmitais', 'astoņdesmitais', 'deviņdesmitais']
|
|
50
|
+
|
|
51
|
+
// Ordinal hundreds (complete forms with suffix)
|
|
52
|
+
const ORDINAL_HUNDREDS = ['', 'simtais', 'divsimtais', 'trīssimtais', 'četrsimtais', 'piecsimtais', 'sešsimtais', 'septiņsimtais', 'astoņsimtais', 'deviņsimtais']
|
|
53
|
+
|
|
54
|
+
// Scale ordinals
|
|
55
|
+
const ORDINAL_SCALES = ['tūkstošais', 'miljonais', 'miljardais', 'triljonais']
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Currency Vocabulary (Euro - Latvia uses Euro since 2014)
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
// Cent forms: [singular, plural, genitive]
|
|
62
|
+
// Note: Eiro is indeclinable in Latvian, so we just use 'eiro' directly
|
|
63
|
+
const CENT_FORMS = ['cents', 'centi', 'centu']
|
|
64
|
+
|
|
65
|
+
// Scale words: [singular, plural, genitive]
|
|
66
|
+
const SCALE_FORMS = [
|
|
67
|
+
['tūkstotis', 'tūkstoši', 'tūkstošu'],
|
|
68
|
+
['miljons', 'miljoni', 'miljonu'],
|
|
69
|
+
['miljards', 'miljardi', 'miljardu'],
|
|
70
|
+
['triljons', 'triljoni', 'triljonu'],
|
|
71
|
+
['kvadriljons', 'kvadriljoni', 'kvadriljonu'],
|
|
72
|
+
['kvintiljons', 'kvintiljoni', 'kvintiljonu'],
|
|
73
|
+
['sikstiljons', 'sikstiljoni', 'sikstiljonu'],
|
|
74
|
+
['septiljons', 'septiljoni', 'septiljonu'],
|
|
75
|
+
['oktiljons', 'oktiljoni', 'oktiljonu']
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Segment Building
|
|
80
|
+
// ============================================================================
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Builds segment word for 0-999 (masculine form).
|
|
84
|
+
* Does NOT include special handling for segment=1 (omitOneBeforeScale).
|
|
85
|
+
* That's handled at join time.
|
|
86
|
+
*/
|
|
87
|
+
function buildSegment (n) {
|
|
88
|
+
if (n === 0) return ''
|
|
89
|
+
|
|
90
|
+
const ones = n % 10
|
|
91
|
+
const tens = Math.trunc(n / 10) % 10
|
|
92
|
+
const hundreds = Math.trunc(n / 100)
|
|
93
|
+
|
|
94
|
+
const parts = []
|
|
95
|
+
|
|
96
|
+
// Hundreds - Latvian has special forms
|
|
97
|
+
if (hundreds > 0) {
|
|
98
|
+
if (hundreds === 1 && tens === 0 && ones > 0) {
|
|
99
|
+
// 101-109: use genitive form "simtu"
|
|
100
|
+
parts.push(HUNDRED_GENITIVE)
|
|
101
|
+
} else if (hundreds > 1) {
|
|
102
|
+
// 200-999: use plural "simti"
|
|
103
|
+
parts.push(ONES_MASC[hundreds])
|
|
104
|
+
parts.push(HUNDRED_PLURAL)
|
|
105
|
+
} else {
|
|
106
|
+
// 100, 110-199: use singular "simts"
|
|
107
|
+
parts.push(HUNDRED_SINGULAR)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Tens
|
|
112
|
+
if (tens > 1) {
|
|
113
|
+
parts.push(TENS[tens])
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Teens or ones
|
|
117
|
+
if (tens === 1) {
|
|
118
|
+
parts.push(TEENS[ones])
|
|
119
|
+
} else if (ones > 0) {
|
|
120
|
+
parts.push(ONES_MASC[ones])
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return parts.join(' ')
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Builds segment word for 0-999 (feminine form - only differs in ones).
|
|
128
|
+
*/
|
|
129
|
+
function buildSegmentFeminine (n) {
|
|
130
|
+
if (n === 0) return ''
|
|
131
|
+
|
|
132
|
+
const ones = n % 10
|
|
133
|
+
const tens = Math.trunc(n / 10) % 10
|
|
134
|
+
const hundreds = Math.trunc(n / 100)
|
|
135
|
+
|
|
136
|
+
const parts = []
|
|
137
|
+
|
|
138
|
+
// Hundreds - always masculine
|
|
139
|
+
if (hundreds > 0) {
|
|
140
|
+
if (hundreds === 1 && tens === 0 && ones > 0) {
|
|
141
|
+
parts.push(HUNDRED_GENITIVE)
|
|
142
|
+
} else if (hundreds > 1) {
|
|
143
|
+
parts.push(ONES_MASC[hundreds])
|
|
144
|
+
parts.push(HUNDRED_PLURAL)
|
|
145
|
+
} else {
|
|
146
|
+
parts.push(HUNDRED_SINGULAR)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Tens
|
|
151
|
+
if (tens > 1) {
|
|
152
|
+
parts.push(TENS[tens])
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Teens or ones - feminine for ones only
|
|
156
|
+
if (tens === 1) {
|
|
157
|
+
parts.push(TEENS[ones])
|
|
158
|
+
} else if (ones > 0) {
|
|
159
|
+
parts.push(ONES_FEM[ones])
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return parts.join(' ')
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// Pluralization
|
|
167
|
+
// ============================================================================
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Latvian pluralization - simpler than Slavic.
|
|
171
|
+
* Singular: ends in 1 (except 11)
|
|
172
|
+
* Plural: everything else
|
|
173
|
+
*
|
|
174
|
+
* @param {number} n - The segment value
|
|
175
|
+
* @param {string[]} forms - [singular, plural, genitive]
|
|
176
|
+
* @returns {string} The appropriate form
|
|
177
|
+
*/
|
|
178
|
+
function pluralize (n, forms) {
|
|
179
|
+
if (n === 0) return forms[2]
|
|
180
|
+
|
|
181
|
+
const lastDigit = n % 10
|
|
182
|
+
const lastTwoDigits = n % 100
|
|
183
|
+
|
|
184
|
+
if (lastDigit === 1 && lastTwoDigits !== 11) {
|
|
185
|
+
return forms[0]
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return forms[1]
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Latvian currency pluralization.
|
|
193
|
+
* Uses genitive for 0, 10-19, and multiples of 10.
|
|
194
|
+
*
|
|
195
|
+
* @param {number} n - The segment value
|
|
196
|
+
* @param {string[]} forms - [singular, plural, genitive]
|
|
197
|
+
* @returns {string} The appropriate form
|
|
198
|
+
*/
|
|
199
|
+
function pluralizeCurrency (n, forms) {
|
|
200
|
+
if (n === 0) return forms[2]
|
|
201
|
+
|
|
202
|
+
const lastDigit = n % 10
|
|
203
|
+
const lastTwoDigits = n % 100
|
|
204
|
+
|
|
205
|
+
// 10-19 use genitive
|
|
206
|
+
if (lastTwoDigits >= 10 && lastTwoDigits <= 19) {
|
|
207
|
+
return forms[2]
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Ends in 0 uses genitive
|
|
211
|
+
if (lastDigit === 0) {
|
|
212
|
+
return forms[2]
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Ends in 1 uses singular
|
|
216
|
+
if (lastDigit === 1) {
|
|
217
|
+
return forms[0]
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// 2-9 uses plural
|
|
221
|
+
return forms[1]
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ============================================================================
|
|
225
|
+
// Conversion Functions
|
|
226
|
+
// ============================================================================
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Converts a non-negative integer to Latvian words.
|
|
230
|
+
*
|
|
231
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
232
|
+
* @param {Object} options - Conversion options
|
|
233
|
+
* @returns {string} Latvian words
|
|
234
|
+
*/
|
|
235
|
+
function integerToWords (n, gender) {
|
|
236
|
+
if (n === 0n) return ZERO
|
|
237
|
+
|
|
238
|
+
// Fast path: numbers < 1000
|
|
239
|
+
if (n < 1000n) {
|
|
240
|
+
const num = Number(n)
|
|
241
|
+
return gender === 'feminine' ? buildSegmentFeminine(num) : buildSegment(num)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// For numbers >= 1000, feminine only applies to final segment if < 1000
|
|
245
|
+
// But we use masculine for all segments when n >= 1000
|
|
246
|
+
return buildLargeNumberWords(n, gender)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Builds words for numbers >= 1000.
|
|
251
|
+
*
|
|
252
|
+
* @param {bigint} n - Number >= 1000
|
|
253
|
+
* @param {Object} options - Conversion options
|
|
254
|
+
* @returns {string} Latvian words
|
|
255
|
+
*/
|
|
256
|
+
function buildLargeNumberWords (n, gender) {
|
|
257
|
+
const numStr = n.toString()
|
|
258
|
+
const len = numStr.length
|
|
259
|
+
|
|
260
|
+
// Build segments of 3 digits from right to left
|
|
261
|
+
const segments = []
|
|
262
|
+
const segmentSize = 3
|
|
263
|
+
|
|
264
|
+
const remainderLen = len % segmentSize
|
|
265
|
+
let pos = 0
|
|
266
|
+
if (remainderLen > 0) {
|
|
267
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
268
|
+
pos = remainderLen
|
|
269
|
+
}
|
|
270
|
+
while (pos < len) {
|
|
271
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
272
|
+
pos += segmentSize
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Convert segments to words
|
|
276
|
+
const parts = []
|
|
277
|
+
let scaleIndex = segments.length - 1
|
|
278
|
+
|
|
279
|
+
for (let i = 0; i < segments.length; i++) {
|
|
280
|
+
const segment = segments[i]
|
|
281
|
+
|
|
282
|
+
if (segment !== 0) {
|
|
283
|
+
const segmentWord = buildSegment(segment)
|
|
284
|
+
|
|
285
|
+
if (scaleIndex === 0) {
|
|
286
|
+
// Units segment - use masculine (feminine doesn't apply when n >= 1000)
|
|
287
|
+
parts.push(segmentWord)
|
|
288
|
+
} else {
|
|
289
|
+
// Segment with scale word
|
|
290
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
291
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
292
|
+
|
|
293
|
+
// Latvian omits "one" before scale words
|
|
294
|
+
if (segment === 1) {
|
|
295
|
+
parts.push(scaleWord)
|
|
296
|
+
} else {
|
|
297
|
+
parts.push(segmentWord + ' ' + scaleWord)
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
scaleIndex--
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return parts.join(' ')
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Converts decimal digits to Latvian words.
|
|
310
|
+
*
|
|
311
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
312
|
+
* @param {Object} options - Conversion options
|
|
313
|
+
* @returns {string} Latvian words for decimal part
|
|
314
|
+
*/
|
|
315
|
+
function decimalPartToWords (decimalPart, gender) {
|
|
316
|
+
let result = ''
|
|
317
|
+
|
|
318
|
+
// Handle leading zeros
|
|
319
|
+
let i = 0
|
|
320
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
321
|
+
if (result) result += ' '
|
|
322
|
+
result += ZERO
|
|
323
|
+
i++
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Convert remainder as a single number
|
|
327
|
+
const remainder = decimalPart.slice(i)
|
|
328
|
+
if (remainder) {
|
|
329
|
+
if (result) result += ' '
|
|
330
|
+
result += integerToWords(BigInt(remainder), gender)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return result
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Converts a numeric value to Latvian words.
|
|
338
|
+
*
|
|
339
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
340
|
+
* @param {Object} [options] - Conversion options
|
|
341
|
+
* @param {string} [options.gender='masculine'] - Gender for numbers < 1000
|
|
342
|
+
* @returns {string} The number in Latvian words
|
|
343
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
344
|
+
* @throws {Error} If value is not a valid number format
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* toCardinal(42) // 'četrdesmit divi'
|
|
348
|
+
* toCardinal(1, { gender: 'feminine' }) // 'viena'
|
|
349
|
+
* toCardinal(1000) // 'tūkstotis'
|
|
350
|
+
*/
|
|
351
|
+
function toCardinal (value, options) {
|
|
352
|
+
options = validateOptions(options)
|
|
353
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
354
|
+
|
|
355
|
+
// Apply option defaults
|
|
356
|
+
const { gender = 'masculine' } = options
|
|
357
|
+
|
|
358
|
+
let result = ''
|
|
359
|
+
|
|
360
|
+
if (isNegative) {
|
|
361
|
+
result = NEGATIVE + ' '
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
result += integerToWords(integerPart, gender)
|
|
365
|
+
|
|
366
|
+
if (decimalPart) {
|
|
367
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, gender)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return result
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// ============================================================================
|
|
374
|
+
// ORDINAL: toOrdinal(value)
|
|
375
|
+
// ============================================================================
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
|
|
379
|
+
*
|
|
380
|
+
* @param {number} n - Number 0-99
|
|
381
|
+
* @returns {string} Ordinal words
|
|
382
|
+
*/
|
|
383
|
+
function buildOrdinalTensOnes (n) {
|
|
384
|
+
if (n === 0) return ''
|
|
385
|
+
|
|
386
|
+
const onesDigit = n % 10
|
|
387
|
+
const tensDigit = Math.trunc(n / 10)
|
|
388
|
+
|
|
389
|
+
if (tensDigit === 0) {
|
|
390
|
+
return ORDINAL_ONES[onesDigit]
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (tensDigit === 1) {
|
|
394
|
+
return ORDINAL_TEENS[onesDigit]
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (onesDigit === 0) {
|
|
398
|
+
return ORDINAL_TENS[tensDigit]
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Converts a positive integer to Latvian ordinal words (masculine nominative).
|
|
406
|
+
*
|
|
407
|
+
* @param {bigint} n - Positive integer to convert
|
|
408
|
+
* @returns {string} Ordinal Latvian words
|
|
409
|
+
*/
|
|
410
|
+
function integerToOrdinal (n) {
|
|
411
|
+
if (n < 100n) {
|
|
412
|
+
return buildOrdinalTensOnes(Number(n))
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (n < 1000n) {
|
|
416
|
+
const num = Number(n)
|
|
417
|
+
const hundredsDigit = Math.trunc(num / 100)
|
|
418
|
+
const remainder = num % 100
|
|
419
|
+
|
|
420
|
+
if (remainder === 0) {
|
|
421
|
+
return ORDINAL_HUNDREDS[hundredsDigit]
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Cardinal hundreds + ordinal remainder
|
|
425
|
+
let hundredWord
|
|
426
|
+
if (hundredsDigit === 1) {
|
|
427
|
+
hundredWord = HUNDRED_SINGULAR
|
|
428
|
+
} else {
|
|
429
|
+
hundredWord = ONES_MASC[hundredsDigit] + ' ' + HUNDRED_PLURAL
|
|
430
|
+
}
|
|
431
|
+
return hundredWord + ' ' + buildOrdinalTensOnes(remainder)
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
if (n < 1_000_000n) {
|
|
435
|
+
const thousands = Number(n / 1000n)
|
|
436
|
+
const remainder = Number(n % 1000n)
|
|
437
|
+
|
|
438
|
+
if (remainder === 0) {
|
|
439
|
+
if (thousands === 1) {
|
|
440
|
+
return ORDINAL_SCALES[0]
|
|
441
|
+
}
|
|
442
|
+
// For 2000+, include cardinal scale word before ordinal
|
|
443
|
+
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
444
|
+
return buildSegment(thousands) + ' ' + scaleWord + ' ' + ORDINAL_SCALES[0]
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
448
|
+
const thousandsWord = thousands === 1 ? '' : buildSegment(thousands) + ' '
|
|
449
|
+
return (thousands === 1 ? scaleWord : thousandsWord + scaleWord) + ' ' + integerToOrdinal(BigInt(remainder))
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return buildLargeOrdinal(n)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Builds ordinal words for numbers >= 1,000,000.
|
|
457
|
+
*
|
|
458
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
459
|
+
* @returns {string} Ordinal Latvian words
|
|
460
|
+
*/
|
|
461
|
+
function buildLargeOrdinal (n) {
|
|
462
|
+
const numStr = n.toString()
|
|
463
|
+
const len = numStr.length
|
|
464
|
+
|
|
465
|
+
const segments = []
|
|
466
|
+
const segmentSize = 3
|
|
467
|
+
|
|
468
|
+
const remainderLen = len % segmentSize
|
|
469
|
+
let pos = 0
|
|
470
|
+
if (remainderLen > 0) {
|
|
471
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
472
|
+
pos = remainderLen
|
|
473
|
+
}
|
|
474
|
+
while (pos < len) {
|
|
475
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
476
|
+
pos += segmentSize
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
let lastNonZeroIdx = segments.length - 1
|
|
480
|
+
while (lastNonZeroIdx >= 0 && segments[lastNonZeroIdx] === 0) {
|
|
481
|
+
lastNonZeroIdx--
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
const parts = []
|
|
485
|
+
let scaleIndex = segments.length - 1
|
|
486
|
+
|
|
487
|
+
for (let i = 0; i < segments.length; i++) {
|
|
488
|
+
const segment = segments[i]
|
|
489
|
+
|
|
490
|
+
if (segment !== 0) {
|
|
491
|
+
const isLastNonZero = (i === lastNonZeroIdx)
|
|
492
|
+
|
|
493
|
+
if (scaleIndex === 0) {
|
|
494
|
+
if (isLastNonZero) {
|
|
495
|
+
parts.push(integerToOrdinal(BigInt(segment)))
|
|
496
|
+
} else {
|
|
497
|
+
parts.push(buildSegment(segment))
|
|
498
|
+
}
|
|
499
|
+
} else {
|
|
500
|
+
if (isLastNonZero) {
|
|
501
|
+
if (segment === 1) {
|
|
502
|
+
parts.push(ORDINAL_SCALES[scaleIndex - 1])
|
|
503
|
+
} else {
|
|
504
|
+
// For 2+, include cardinal scale word before ordinal
|
|
505
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
506
|
+
const cardinalScaleWord = pluralize(segment, scaleForms)
|
|
507
|
+
parts.push(buildSegment(segment) + ' ' + cardinalScaleWord + ' ' + ORDINAL_SCALES[scaleIndex - 1])
|
|
508
|
+
}
|
|
509
|
+
} else {
|
|
510
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
511
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
512
|
+
if (segment === 1) {
|
|
513
|
+
parts.push(scaleWord)
|
|
514
|
+
} else {
|
|
515
|
+
parts.push(buildSegment(segment) + ' ' + scaleWord)
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
scaleIndex--
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return parts.join(' ')
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Converts a numeric value to Latvian ordinal words (masculine nominative).
|
|
529
|
+
*
|
|
530
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
531
|
+
* @returns {string} The number as ordinal words
|
|
532
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
533
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
534
|
+
*
|
|
535
|
+
* @example
|
|
536
|
+
* toOrdinal(1) // 'pirmais'
|
|
537
|
+
* toOrdinal(2) // 'otrais'
|
|
538
|
+
* toOrdinal(21) // 'divdesmit pirmais'
|
|
539
|
+
* toOrdinal(100) // 'simtais'
|
|
540
|
+
* toOrdinal(1000) // 'tūkstošais'
|
|
541
|
+
*/
|
|
542
|
+
function toOrdinal (value) {
|
|
543
|
+
const integerPart = parseOrdinalValue(value)
|
|
544
|
+
return integerToOrdinal(integerPart)
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// ============================================================================
|
|
548
|
+
// CURRENCY: toCurrency(value)
|
|
549
|
+
// ============================================================================
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Converts a numeric value to Latvian currency words (Euro).
|
|
553
|
+
*
|
|
554
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
555
|
+
* @returns {string} The amount in Latvian currency words
|
|
556
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
557
|
+
* @throws {Error} If value is not a valid number format
|
|
558
|
+
*
|
|
559
|
+
* @example
|
|
560
|
+
* toCurrency(42) // 'četrdesmit divi eiro'
|
|
561
|
+
* toCurrency(1) // 'viens eiro'
|
|
562
|
+
* toCurrency(1.50) // 'viens eiro piecdesmit centu'
|
|
563
|
+
* toCurrency(-5) // 'mīnus pieci eiro'
|
|
564
|
+
*/
|
|
565
|
+
function toCurrency (value) {
|
|
566
|
+
const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
|
|
567
|
+
|
|
568
|
+
let result = ''
|
|
569
|
+
if (isNegative) {
|
|
570
|
+
result = NEGATIVE + ' '
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// Euro part (eiro is indeclinable)
|
|
574
|
+
if (euros > 0n || cents === 0n) {
|
|
575
|
+
result += integerToWords(euros, 'masculine')
|
|
576
|
+
result += ' eiro'
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Cent part (masculine)
|
|
580
|
+
if (cents > 0n) {
|
|
581
|
+
if (euros > 0n) {
|
|
582
|
+
result += ' '
|
|
583
|
+
}
|
|
584
|
+
result += integerToWords(cents, 'masculine')
|
|
585
|
+
result += ' ' + pluralizeCurrency(Number(cents), CENT_FORMS)
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
return result
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// ============================================================================
|
|
592
|
+
// Public API
|
|
593
|
+
// ============================================================================
|
|
594
|
+
|
|
595
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/mr-IN.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Marathi words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Marathi words
|
|
6
|
+
*/
|
|
7
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a numeric value to Marathi 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 Marathi currency words (Indian Rupee).
|
|
25
|
+
*
|
|
26
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
27
|
+
* @returns {string} The amount in Marathi 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;
|