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/lt-LT.js
ADDED
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lithuanian (Lithuania) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: lt-LT | Lithuanian as used in Lithuania
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Three-form pluralization (singular/plural/genitive)
|
|
8
|
+
* - Gender agreement (masculine/feminine for numbers < 1000)
|
|
9
|
+
* - Two-form hundreds (šimtas/šimtai)
|
|
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 (module-level constants)
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
const ONES_MASC = ['', 'vienas', 'du', 'trys', 'keturi', 'penki', 'šeši', 'septyni', 'aštuoni', 'devyni']
|
|
23
|
+
const ONES_FEM = ['', 'viena', 'dvi', 'trys', 'keturios', 'penkios', 'šešios', 'septynios', 'aštuonios', 'devynios']
|
|
24
|
+
|
|
25
|
+
const TEENS = ['dešimt', 'vienuolika', 'dvylika', 'trylika', 'keturiolika', 'penkiolika', 'šešiolika', 'septyniolika', 'aštuoniolika', 'devyniolika']
|
|
26
|
+
const TENS = ['', '', 'dvidešimt', 'trisdešimt', 'keturiasdešimt', 'penkiasdešimt', 'šešiasdešimt', 'septyniasdešimt', 'aštuoniasdešimt', 'devyniasdešimt']
|
|
27
|
+
|
|
28
|
+
// Hundreds: šimtas (singular), šimtai (plural)
|
|
29
|
+
const HUNDRED_SINGULAR = 'šimtas'
|
|
30
|
+
const HUNDRED_PLURAL = 'šimtai'
|
|
31
|
+
|
|
32
|
+
const ZERO = 'nulis'
|
|
33
|
+
const NEGATIVE = 'minus'
|
|
34
|
+
const DECIMAL_SEP = 'kablelis'
|
|
35
|
+
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Ordinal Vocabulary
|
|
38
|
+
// ============================================================================
|
|
39
|
+
|
|
40
|
+
// Lithuanian ordinals (masculine nominative singular)
|
|
41
|
+
const ORDINAL_ONES = ['', 'pirmas', 'antras', 'trečias', 'ketvirtas', 'penktas', 'šeštas', 'septintas', 'aštuntas', 'devintas']
|
|
42
|
+
|
|
43
|
+
// Ordinal teens
|
|
44
|
+
const ORDINAL_TEENS = ['dešimtas', 'vienuoliktas', 'dvyliktas', 'tryliktas', 'keturioliktas', 'penkioliktas', 'šešioliktas', 'septynioliktas', 'aštuonioliktas', 'devynioliktas']
|
|
45
|
+
|
|
46
|
+
// Ordinal tens
|
|
47
|
+
const ORDINAL_TENS = ['', '', 'dvidešimtas', 'trisdešimtas', 'keturiasdešimtas', 'penkiasdešimtas', 'šešiasdešimtas', 'septyniasdešimtas', 'aštuoniasdešimtas', 'devyniasdešimtas']
|
|
48
|
+
|
|
49
|
+
// Ordinal hundreds
|
|
50
|
+
const ORDINAL_HUNDREDS = ['', 'šimtasis', 'dviejų šimtasis', 'trijų šimtasis', 'keturių šimtasis', 'penkių šimtasis', 'šešių šimtasis', 'septynių šimtasis', 'aštuonių šimtasis', 'devynių šimtasis']
|
|
51
|
+
|
|
52
|
+
// Scale ordinals
|
|
53
|
+
const ORDINAL_SCALES = ['tūkstantasis', 'milijonasis', 'milijardasis', 'trilijonasis']
|
|
54
|
+
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Currency Vocabulary (Euro - Lithuania uses Euro since 2015)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
|
|
59
|
+
// Euro forms: [singular, plural, genitive]
|
|
60
|
+
const EURO_FORMS = ['euras', 'eurai', 'eurų']
|
|
61
|
+
// Cent forms: [singular, plural, genitive]
|
|
62
|
+
const CENT_FORMS = ['centas', 'centai', 'centų']
|
|
63
|
+
|
|
64
|
+
// Scale words: [singular, plural, genitive]
|
|
65
|
+
const SCALE_FORMS = [
|
|
66
|
+
['tūkstantis', 'tūkstančiai', 'tūkstančių'],
|
|
67
|
+
['milijonas', 'milijonai', 'milijonų'],
|
|
68
|
+
['milijardas', 'milijardai', 'milijardų'],
|
|
69
|
+
['trilijonas', 'trilijonai', 'trilijonų'],
|
|
70
|
+
['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],
|
|
71
|
+
['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],
|
|
72
|
+
['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],
|
|
73
|
+
['septilijonas', 'septilijonai', 'septilijonų'],
|
|
74
|
+
['oktilijonas', 'oktilijonai', 'oktilijonų']
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Segment Building
|
|
79
|
+
// ============================================================================
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Builds segment word for 0-999 (masculine form).
|
|
83
|
+
*/
|
|
84
|
+
function buildSegment (n) {
|
|
85
|
+
if (n === 0) return ''
|
|
86
|
+
|
|
87
|
+
const ones = n % 10
|
|
88
|
+
const tens = Math.trunc(n / 10) % 10
|
|
89
|
+
const hundreds = Math.trunc(n / 100)
|
|
90
|
+
|
|
91
|
+
const parts = []
|
|
92
|
+
|
|
93
|
+
// Hundreds - Lithuanian always includes the numeral
|
|
94
|
+
if (hundreds > 0) {
|
|
95
|
+
parts.push(ONES_MASC[hundreds])
|
|
96
|
+
parts.push(hundreds === 1 ? HUNDRED_SINGULAR : HUNDRED_PLURAL)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Tens
|
|
100
|
+
if (tens > 1) {
|
|
101
|
+
parts.push(TENS[tens])
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Teens or ones
|
|
105
|
+
if (tens === 1) {
|
|
106
|
+
parts.push(TEENS[ones])
|
|
107
|
+
} else if (ones > 0) {
|
|
108
|
+
parts.push(ONES_MASC[ones])
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return parts.join(' ')
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Builds segment word for 0-999 (feminine form - only differs in ones).
|
|
116
|
+
*/
|
|
117
|
+
function buildSegmentFeminine (n) {
|
|
118
|
+
if (n === 0) return ''
|
|
119
|
+
|
|
120
|
+
const ones = n % 10
|
|
121
|
+
const tens = Math.trunc(n / 10) % 10
|
|
122
|
+
const hundreds = Math.trunc(n / 100)
|
|
123
|
+
|
|
124
|
+
const parts = []
|
|
125
|
+
|
|
126
|
+
// Hundreds - always masculine
|
|
127
|
+
if (hundreds > 0) {
|
|
128
|
+
parts.push(ONES_MASC[hundreds])
|
|
129
|
+
parts.push(hundreds === 1 ? HUNDRED_SINGULAR : HUNDRED_PLURAL)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Tens
|
|
133
|
+
if (tens > 1) {
|
|
134
|
+
parts.push(TENS[tens])
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Teens or ones - feminine for ones only
|
|
138
|
+
if (tens === 1) {
|
|
139
|
+
parts.push(TEENS[ones])
|
|
140
|
+
} else if (ones > 0) {
|
|
141
|
+
parts.push(ONES_FEM[ones])
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return parts.join(' ')
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Pluralization
|
|
149
|
+
// ============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Lithuanian pluralization rules.
|
|
153
|
+
* - Singular: ends in 1 (except 11)
|
|
154
|
+
* - Plural: ends in 2-9 (except 12-19)
|
|
155
|
+
* - Genitive: 0, 10-19, or ends in 0
|
|
156
|
+
*
|
|
157
|
+
* @param {number} n - The segment value
|
|
158
|
+
* @param {string[]} forms - [singular, plural, genitive]
|
|
159
|
+
* @returns {string} The appropriate form
|
|
160
|
+
*/
|
|
161
|
+
function pluralize (n, forms) {
|
|
162
|
+
if (n === 0) return forms[2]
|
|
163
|
+
|
|
164
|
+
const lastDigit = n % 10
|
|
165
|
+
const lastTwoDigits = n % 100
|
|
166
|
+
|
|
167
|
+
// 10-19 always use genitive
|
|
168
|
+
if (lastTwoDigits >= 10 && lastTwoDigits <= 19) {
|
|
169
|
+
return forms[2]
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Ends in 0 → genitive
|
|
173
|
+
if (lastDigit === 0) {
|
|
174
|
+
return forms[2]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Ends in 1 → singular
|
|
178
|
+
if (lastDigit === 1) {
|
|
179
|
+
return forms[0]
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Ends in 2-9 → plural
|
|
183
|
+
return forms[1]
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// ============================================================================
|
|
187
|
+
// Conversion Functions
|
|
188
|
+
// ============================================================================
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Converts a non-negative integer to Lithuanian words.
|
|
192
|
+
*
|
|
193
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
194
|
+
* @param {Object} options - Conversion options
|
|
195
|
+
* @returns {string} Lithuanian words
|
|
196
|
+
*/
|
|
197
|
+
function integerToWords (n, gender) {
|
|
198
|
+
if (n === 0n) return ZERO
|
|
199
|
+
|
|
200
|
+
// Fast path: numbers < 1000
|
|
201
|
+
if (n < 1000n) {
|
|
202
|
+
const num = Number(n)
|
|
203
|
+
return gender === 'feminine' ? buildSegmentFeminine(num) : buildSegment(num)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// For numbers >= 1000, feminine only applies to final segment if < 1000
|
|
207
|
+
// But the fixture shows feminine NOT applying for n >= 1000
|
|
208
|
+
// So we use masculine for all segments when n >= 1000
|
|
209
|
+
return buildLargeNumberWords(n, gender)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Builds words for numbers >= 1000.
|
|
214
|
+
*
|
|
215
|
+
* @param {bigint} n - Number >= 1000
|
|
216
|
+
* @param {Object} options - Conversion options
|
|
217
|
+
* @returns {string} Lithuanian words
|
|
218
|
+
*/
|
|
219
|
+
function buildLargeNumberWords (n, gender) {
|
|
220
|
+
const numStr = n.toString()
|
|
221
|
+
const len = numStr.length
|
|
222
|
+
|
|
223
|
+
// Build segments of 3 digits from right to left
|
|
224
|
+
const segments = []
|
|
225
|
+
const segmentSize = 3
|
|
226
|
+
|
|
227
|
+
const remainderLen = len % segmentSize
|
|
228
|
+
let pos = 0
|
|
229
|
+
if (remainderLen > 0) {
|
|
230
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
231
|
+
pos = remainderLen
|
|
232
|
+
}
|
|
233
|
+
while (pos < len) {
|
|
234
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
235
|
+
pos += segmentSize
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Convert segments to words
|
|
239
|
+
const parts = []
|
|
240
|
+
let scaleIndex = segments.length - 1
|
|
241
|
+
|
|
242
|
+
for (let i = 0; i < segments.length; i++) {
|
|
243
|
+
const segment = segments[i]
|
|
244
|
+
|
|
245
|
+
if (segment !== 0) {
|
|
246
|
+
const segmentWord = buildSegment(segment)
|
|
247
|
+
|
|
248
|
+
if (scaleIndex === 0) {
|
|
249
|
+
// Units segment - use masculine (feminine doesn't apply when n >= 1000)
|
|
250
|
+
parts.push(segmentWord)
|
|
251
|
+
} else {
|
|
252
|
+
// Segment with scale word
|
|
253
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
254
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
255
|
+
parts.push(segmentWord + ' ' + scaleWord)
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
scaleIndex--
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return parts.join(' ')
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Converts decimal digits to Lithuanian words.
|
|
267
|
+
*
|
|
268
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
269
|
+
* @param {Object} options - Conversion options
|
|
270
|
+
* @returns {string} Lithuanian words for decimal part
|
|
271
|
+
*/
|
|
272
|
+
function decimalPartToWords (decimalPart, gender) {
|
|
273
|
+
let result = ''
|
|
274
|
+
|
|
275
|
+
// Handle leading zeros
|
|
276
|
+
let i = 0
|
|
277
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
278
|
+
if (result) result += ' '
|
|
279
|
+
result += ZERO
|
|
280
|
+
i++
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Convert remainder as a single number
|
|
284
|
+
const remainder = decimalPart.slice(i)
|
|
285
|
+
if (remainder) {
|
|
286
|
+
if (result) result += ' '
|
|
287
|
+
result += integerToWords(BigInt(remainder), gender)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return result
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Converts a numeric value to Lithuanian words.
|
|
295
|
+
*
|
|
296
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
297
|
+
* @param {Object} [options] - Conversion options
|
|
298
|
+
* @param {string} [options.gender='masculine'] - Gender for numbers < 1000
|
|
299
|
+
* @returns {string} The number in Lithuanian words
|
|
300
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
301
|
+
* @throws {Error} If value is not a valid number format
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* toCardinal(42) // 'keturiasdešimt du'
|
|
305
|
+
* toCardinal(1, { gender: 'feminine' }) // 'viena'
|
|
306
|
+
* toCardinal(1000000) // 'vienas milijonas'
|
|
307
|
+
*/
|
|
308
|
+
function toCardinal (value, options) {
|
|
309
|
+
options = validateOptions(options)
|
|
310
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
311
|
+
|
|
312
|
+
// Apply option defaults
|
|
313
|
+
const { gender = 'masculine' } = options
|
|
314
|
+
|
|
315
|
+
let result = ''
|
|
316
|
+
|
|
317
|
+
if (isNegative) {
|
|
318
|
+
result = NEGATIVE + ' '
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
result += integerToWords(integerPart, gender)
|
|
322
|
+
|
|
323
|
+
if (decimalPart) {
|
|
324
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, gender)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return result
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// ORDINAL: toOrdinal(value)
|
|
332
|
+
// ============================================================================
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
|
|
336
|
+
*
|
|
337
|
+
* @param {number} n - Number 0-99
|
|
338
|
+
* @returns {string} Ordinal words
|
|
339
|
+
*/
|
|
340
|
+
function buildOrdinalTensOnes (n) {
|
|
341
|
+
if (n === 0) return ''
|
|
342
|
+
|
|
343
|
+
const onesDigit = n % 10
|
|
344
|
+
const tensDigit = Math.trunc(n / 10)
|
|
345
|
+
|
|
346
|
+
if (tensDigit === 0) {
|
|
347
|
+
return ORDINAL_ONES[onesDigit]
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (tensDigit === 1) {
|
|
351
|
+
return ORDINAL_TEENS[onesDigit]
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (onesDigit === 0) {
|
|
355
|
+
return ORDINAL_TENS[tensDigit]
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Converts a positive integer to Lithuanian ordinal words (masculine nominative).
|
|
363
|
+
*
|
|
364
|
+
* @param {bigint} n - Positive integer to convert
|
|
365
|
+
* @returns {string} Ordinal Lithuanian words
|
|
366
|
+
*/
|
|
367
|
+
function integerToOrdinal (n) {
|
|
368
|
+
if (n < 100n) {
|
|
369
|
+
return buildOrdinalTensOnes(Number(n))
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (n < 1000n) {
|
|
373
|
+
const num = Number(n)
|
|
374
|
+
const hundredsDigit = Math.trunc(num / 100)
|
|
375
|
+
const remainder = num % 100
|
|
376
|
+
|
|
377
|
+
if (remainder === 0) {
|
|
378
|
+
return ORDINAL_HUNDREDS[hundredsDigit]
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Cardinal hundreds + ordinal remainder
|
|
382
|
+
const hundredWord = ONES_MASC[hundredsDigit] + ' ' + (hundredsDigit === 1 ? HUNDRED_SINGULAR : HUNDRED_PLURAL)
|
|
383
|
+
return hundredWord + ' ' + buildOrdinalTensOnes(remainder)
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (n < 1_000_000n) {
|
|
387
|
+
const thousands = Number(n / 1000n)
|
|
388
|
+
const remainder = Number(n % 1000n)
|
|
389
|
+
|
|
390
|
+
if (remainder === 0) {
|
|
391
|
+
if (thousands === 1) {
|
|
392
|
+
return ORDINAL_SCALES[0]
|
|
393
|
+
}
|
|
394
|
+
// For 2000+, include cardinal scale word before ordinal
|
|
395
|
+
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
396
|
+
return buildSegment(thousands) + ' ' + scaleWord + ' ' + ORDINAL_SCALES[0]
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
400
|
+
const thousandsWord = buildSegment(thousands)
|
|
401
|
+
return thousandsWord + ' ' + scaleWord + ' ' + integerToOrdinal(BigInt(remainder))
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return buildLargeOrdinal(n)
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Builds ordinal words for numbers >= 1,000,000.
|
|
409
|
+
*
|
|
410
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
411
|
+
* @returns {string} Ordinal Lithuanian words
|
|
412
|
+
*/
|
|
413
|
+
function buildLargeOrdinal (n) {
|
|
414
|
+
const numStr = n.toString()
|
|
415
|
+
const len = numStr.length
|
|
416
|
+
|
|
417
|
+
const segments = []
|
|
418
|
+
const segmentSize = 3
|
|
419
|
+
|
|
420
|
+
const remainderLen = len % segmentSize
|
|
421
|
+
let pos = 0
|
|
422
|
+
if (remainderLen > 0) {
|
|
423
|
+
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
424
|
+
pos = remainderLen
|
|
425
|
+
}
|
|
426
|
+
while (pos < len) {
|
|
427
|
+
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
428
|
+
pos += segmentSize
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
let lastNonZeroIdx = segments.length - 1
|
|
432
|
+
while (lastNonZeroIdx >= 0 && segments[lastNonZeroIdx] === 0) {
|
|
433
|
+
lastNonZeroIdx--
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const parts = []
|
|
437
|
+
let scaleIndex = segments.length - 1
|
|
438
|
+
|
|
439
|
+
for (let i = 0; i < segments.length; i++) {
|
|
440
|
+
const segment = segments[i]
|
|
441
|
+
|
|
442
|
+
if (segment !== 0) {
|
|
443
|
+
const isLastNonZero = (i === lastNonZeroIdx)
|
|
444
|
+
|
|
445
|
+
if (scaleIndex === 0) {
|
|
446
|
+
if (isLastNonZero) {
|
|
447
|
+
parts.push(integerToOrdinal(BigInt(segment)))
|
|
448
|
+
} else {
|
|
449
|
+
parts.push(buildSegment(segment))
|
|
450
|
+
}
|
|
451
|
+
} else {
|
|
452
|
+
if (isLastNonZero) {
|
|
453
|
+
if (segment === 1) {
|
|
454
|
+
parts.push(ORDINAL_SCALES[scaleIndex - 1])
|
|
455
|
+
} else {
|
|
456
|
+
// For 2+, include cardinal scale word before ordinal
|
|
457
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
458
|
+
const cardinalScaleWord = pluralize(segment, scaleForms)
|
|
459
|
+
parts.push(buildSegment(segment) + ' ' + cardinalScaleWord + ' ' + ORDINAL_SCALES[scaleIndex - 1])
|
|
460
|
+
}
|
|
461
|
+
} else {
|
|
462
|
+
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
463
|
+
const scaleWord = pluralize(segment, scaleForms)
|
|
464
|
+
parts.push(buildSegment(segment) + ' ' + scaleWord)
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
scaleIndex--
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
return parts.join(' ')
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Converts a numeric value to Lithuanian ordinal words (masculine nominative).
|
|
477
|
+
*
|
|
478
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
479
|
+
* @returns {string} The number as ordinal words
|
|
480
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
481
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
482
|
+
*
|
|
483
|
+
* @example
|
|
484
|
+
* toOrdinal(1) // 'pirmas'
|
|
485
|
+
* toOrdinal(2) // 'antras'
|
|
486
|
+
* toOrdinal(21) // 'dvidešimt pirmas'
|
|
487
|
+
* toOrdinal(100) // 'šimtasis'
|
|
488
|
+
* toOrdinal(1000) // 'tūkstantasis'
|
|
489
|
+
*/
|
|
490
|
+
function toOrdinal (value) {
|
|
491
|
+
const integerPart = parseOrdinalValue(value)
|
|
492
|
+
return integerToOrdinal(integerPart)
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// ============================================================================
|
|
496
|
+
// CURRENCY: toCurrency(value)
|
|
497
|
+
// ============================================================================
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Converts a numeric value to Lithuanian currency words (Euro).
|
|
501
|
+
*
|
|
502
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
503
|
+
* @returns {string} The amount in Lithuanian currency words
|
|
504
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
505
|
+
* @throws {Error} If value is not a valid number format
|
|
506
|
+
*
|
|
507
|
+
* @example
|
|
508
|
+
* toCurrency(42) // 'keturiasdešimt du eurai'
|
|
509
|
+
* toCurrency(1) // 'vienas euras'
|
|
510
|
+
* toCurrency(1.50) // 'vienas euras penkiasdešimt centų'
|
|
511
|
+
* toCurrency(-5) // 'minus penki eurai'
|
|
512
|
+
*/
|
|
513
|
+
function toCurrency (value) {
|
|
514
|
+
const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
|
|
515
|
+
|
|
516
|
+
let result = ''
|
|
517
|
+
if (isNegative) {
|
|
518
|
+
result = NEGATIVE + ' '
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Euro part (masculine)
|
|
522
|
+
if (euros > 0n || cents === 0n) {
|
|
523
|
+
result += integerToWords(euros, 'masculine')
|
|
524
|
+
result += ' ' + pluralize(Number(euros), EURO_FORMS)
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Cent part (masculine)
|
|
528
|
+
if (cents > 0n) {
|
|
529
|
+
if (euros > 0n) {
|
|
530
|
+
result += ' '
|
|
531
|
+
}
|
|
532
|
+
result += integerToWords(cents, 'masculine')
|
|
533
|
+
result += ' ' + pluralize(Number(cents), CENT_FORMS)
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return result
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// ============================================================================
|
|
540
|
+
// Public API
|
|
541
|
+
// ============================================================================
|
|
542
|
+
|
|
543
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/lv-LV.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Latvian words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @param {Object} [options] - Conversion options
|
|
6
|
+
* @param {string} [options.gender='masculine'] - Gender for numbers < 1000
|
|
7
|
+
* @returns {string} The number in Latvian words
|
|
8
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
9
|
+
* @throws {Error} If value is not a valid number format
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* toCardinal(42) // 'četrdesmit divi'
|
|
13
|
+
* toCardinal(1, { gender: 'feminine' }) // 'viena'
|
|
14
|
+
* toCardinal(1000) // 'tūkstotis'
|
|
15
|
+
*/
|
|
16
|
+
export function toCardinal(value: number | string | bigint, options?: {
|
|
17
|
+
gender?: string | undefined;
|
|
18
|
+
}): string;
|
|
19
|
+
/**
|
|
20
|
+
* Converts a numeric value to Latvian ordinal words (masculine nominative).
|
|
21
|
+
*
|
|
22
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
23
|
+
* @returns {string} The number as ordinal words
|
|
24
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
25
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* toOrdinal(1) // 'pirmais'
|
|
29
|
+
* toOrdinal(2) // 'otrais'
|
|
30
|
+
* toOrdinal(21) // 'divdesmit pirmais'
|
|
31
|
+
* toOrdinal(100) // 'simtais'
|
|
32
|
+
* toOrdinal(1000) // 'tūkstošais'
|
|
33
|
+
*/
|
|
34
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
35
|
+
/**
|
|
36
|
+
* Converts a numeric value to Latvian currency words (Euro).
|
|
37
|
+
*
|
|
38
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
39
|
+
* @returns {string} The amount in Latvian currency words
|
|
40
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
41
|
+
* @throws {Error} If value is not a valid number format
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* toCurrency(42) // 'četrdesmit divi eiro'
|
|
45
|
+
* toCurrency(1) // 'viens eiro'
|
|
46
|
+
* toCurrency(1.50) // 'viens eiro piecdesmit centu'
|
|
47
|
+
* toCurrency(-5) // 'mīnus pieci eiro'
|
|
48
|
+
*/
|
|
49
|
+
export function toCurrency(value: number | string | bigint): string;
|