n2words 3.1.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -40
- package/LICENSE +1 -1
- package/README.md +64 -184
- package/dist/am-ET.js +2 -0
- package/dist/am-ET.umd.js +2 -0
- package/dist/am-Latn-ET.js +2 -0
- package/dist/am-Latn-ET.umd.js +2 -0
- package/dist/ar-SA.js +2 -0
- package/dist/ar-SA.umd.js +2 -0
- package/dist/az-AZ.js +2 -0
- package/dist/az-AZ.umd.js +2 -0
- package/dist/bn-BD.js +2 -0
- package/dist/bn-BD.umd.js +2 -0
- package/dist/cs-CZ.js +2 -0
- package/dist/cs-CZ.umd.js +2 -0
- package/dist/da-DK.js +2 -0
- package/dist/da-DK.umd.js +2 -0
- package/dist/de-DE.js +2 -0
- package/dist/de-DE.umd.js +2 -0
- package/dist/el-GR.js +2 -0
- package/dist/el-GR.umd.js +2 -0
- package/dist/en-AU.js +2 -0
- package/dist/en-AU.umd.js +2 -0
- package/dist/en-BD.js +2 -0
- package/dist/en-BD.umd.js +2 -0
- package/dist/en-CA.js +2 -0
- package/dist/en-CA.umd.js +2 -0
- package/dist/en-GB.js +2 -0
- package/dist/en-GB.umd.js +2 -0
- package/dist/en-GH.js +2 -0
- package/dist/en-GH.umd.js +2 -0
- package/dist/en-IE.js +2 -0
- package/dist/en-IE.umd.js +2 -0
- package/dist/en-IN.js +2 -0
- package/dist/en-IN.umd.js +2 -0
- package/dist/en-KE.js +2 -0
- package/dist/en-KE.umd.js +2 -0
- package/dist/en-MY.js +2 -0
- package/dist/en-MY.umd.js +2 -0
- package/dist/en-NG.js +2 -0
- package/dist/en-NG.umd.js +2 -0
- package/dist/en-NZ.js +2 -0
- package/dist/en-NZ.umd.js +2 -0
- package/dist/en-PH.js +2 -0
- package/dist/en-PH.umd.js +2 -0
- package/dist/en-PK.js +2 -0
- package/dist/en-PK.umd.js +2 -0
- package/dist/en-SG.js +2 -0
- package/dist/en-SG.umd.js +2 -0
- package/dist/en-US.js +2 -0
- package/dist/en-US.umd.js +2 -0
- package/dist/en-ZA.js +2 -0
- package/dist/en-ZA.umd.js +2 -0
- package/dist/es-ES.js +2 -0
- package/dist/es-ES.umd.js +2 -0
- package/dist/es-MX.js +2 -0
- package/dist/es-MX.umd.js +2 -0
- package/dist/es-US.js +2 -0
- package/dist/es-US.umd.js +2 -0
- package/dist/fa-IR.js +2 -0
- package/dist/fa-IR.umd.js +2 -0
- package/dist/fi-FI.js +2 -0
- package/dist/fi-FI.umd.js +2 -0
- package/dist/fil-PH.js +2 -0
- package/dist/fil-PH.umd.js +2 -0
- package/dist/fr-BE.js +2 -0
- package/dist/fr-BE.umd.js +2 -0
- package/dist/fr-FR.js +2 -0
- package/dist/fr-FR.umd.js +2 -0
- package/dist/gu-IN.js +2 -0
- package/dist/gu-IN.umd.js +2 -0
- package/dist/ha-NG.js +2 -0
- package/dist/ha-NG.umd.js +2 -0
- package/dist/hbo-IL.js +2 -0
- package/dist/hbo-IL.umd.js +2 -0
- package/dist/he-IL.js +2 -0
- package/dist/he-IL.umd.js +2 -0
- package/dist/hi-IN.js +2 -0
- package/dist/hi-IN.umd.js +2 -0
- package/dist/hr-HR.js +2 -0
- package/dist/hr-HR.umd.js +2 -0
- package/dist/hu-HU.js +2 -0
- package/dist/hu-HU.umd.js +2 -0
- package/dist/id-ID.js +2 -0
- package/dist/id-ID.umd.js +2 -0
- package/dist/it-IT.js +2 -0
- package/dist/it-IT.umd.js +2 -0
- package/dist/ja-JP.js +2 -0
- package/dist/ja-JP.umd.js +2 -0
- package/dist/ka-GE.js +2 -0
- package/dist/ka-GE.umd.js +2 -0
- package/dist/kn-IN.js +2 -0
- package/dist/kn-IN.umd.js +2 -0
- package/dist/ko-KR.js +2 -0
- package/dist/ko-KR.umd.js +2 -0
- package/dist/lt-LT.js +2 -0
- package/dist/lt-LT.umd.js +2 -0
- package/dist/lv-LV.js +2 -0
- package/dist/lv-LV.umd.js +2 -0
- package/dist/mr-IN.js +2 -0
- package/dist/mr-IN.umd.js +2 -0
- package/dist/ms-MY.js +2 -0
- package/dist/ms-MY.umd.js +2 -0
- package/dist/nb-NO.js +2 -0
- package/dist/nb-NO.umd.js +2 -0
- package/dist/nl-NL.js +2 -0
- package/dist/nl-NL.umd.js +2 -0
- package/dist/pa-IN.js +2 -0
- package/dist/pa-IN.umd.js +2 -0
- package/dist/pl-PL.js +2 -0
- package/dist/pl-PL.umd.js +2 -0
- package/dist/pt-BR.js +2 -0
- package/dist/pt-BR.umd.js +2 -0
- package/dist/pt-PT.js +2 -0
- package/dist/pt-PT.umd.js +2 -0
- package/dist/ro-RO.js +2 -0
- package/dist/ro-RO.umd.js +2 -0
- package/dist/ru-RU.js +2 -0
- package/dist/ru-RU.umd.js +2 -0
- package/dist/sr-Cyrl-RS.js +2 -0
- package/dist/sr-Cyrl-RS.umd.js +2 -0
- package/dist/sr-Latn-RS.js +2 -0
- package/dist/sr-Latn-RS.umd.js +2 -0
- package/dist/sv-SE.js +2 -0
- package/dist/sv-SE.umd.js +2 -0
- package/dist/sw-KE.js +2 -0
- package/dist/sw-KE.umd.js +2 -0
- package/dist/ta-IN.js +2 -0
- package/dist/ta-IN.umd.js +2 -0
- package/dist/te-IN.js +2 -0
- package/dist/te-IN.umd.js +2 -0
- package/dist/th-TH.js +2 -0
- package/dist/th-TH.umd.js +2 -0
- package/dist/tr-TR.js +2 -0
- package/dist/tr-TR.umd.js +2 -0
- package/dist/uk-UA.js +2 -0
- package/dist/uk-UA.umd.js +2 -0
- package/dist/ur-PK.js +2 -0
- package/dist/ur-PK.umd.js +2 -0
- package/dist/vi-VN.js +2 -0
- package/dist/vi-VN.umd.js +2 -0
- package/dist/yo-NG.js +2 -0
- package/dist/yo-NG.umd.js +2 -0
- package/dist/zh-Hans-CN.js +2 -0
- package/dist/zh-Hans-CN.umd.js +2 -0
- package/dist/zh-Hant-TW.js +2 -0
- package/dist/zh-Hant-TW.umd.js +2 -0
- package/package.json +61 -88
- package/src/am-ET.d.ts +40 -0
- package/src/am-ET.js +269 -0
- package/src/am-Latn-ET.d.ts +35 -0
- package/src/am-Latn-ET.js +264 -0
- package/src/ar-SA.d.ts +49 -0
- package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
- package/src/az-AZ.d.ts +37 -0
- package/src/az-AZ.js +312 -0
- package/src/bn-BD.d.ts +36 -0
- package/{lib/languages/bn.js → src/bn-BD.js} +110 -6
- package/src/cs-CZ.d.ts +49 -0
- package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
- package/src/da-DK.d.ts +44 -0
- package/{lib/languages/da.js → src/da-DK.js} +131 -11
- package/src/de-DE.d.ts +57 -0
- package/src/de-DE.js +603 -0
- package/src/el-GR.d.ts +40 -0
- package/src/el-GR.js +418 -0
- package/src/en-AU.d.ts +47 -0
- package/src/en-AU.js +423 -0
- package/src/en-BD.d.ts +49 -0
- package/src/en-BD.js +415 -0
- package/src/en-CA.d.ts +63 -0
- package/src/en-CA.js +518 -0
- package/src/en-GB.d.ts +56 -0
- package/src/en-GB.js +469 -0
- package/src/en-GH.d.ts +11 -0
- package/src/en-GH.js +345 -0
- package/src/en-IE.d.ts +56 -0
- package/src/en-IE.js +479 -0
- package/src/en-IN.d.ts +49 -0
- package/src/en-IN.js +415 -0
- package/src/en-KE.d.ts +11 -0
- package/src/en-KE.js +345 -0
- package/src/en-MY.d.ts +11 -0
- package/src/en-MY.js +347 -0
- package/src/en-NG.d.ts +56 -0
- package/src/en-NG.js +479 -0
- package/src/en-NZ.d.ts +11 -0
- package/{lib/languages/en.js → src/en-NZ.js} +164 -31
- package/src/en-PH.d.ts +11 -0
- package/src/en-PH.js +345 -0
- package/src/en-PK.d.ts +49 -0
- package/src/en-PK.js +415 -0
- package/src/en-SG.d.ts +11 -0
- package/src/en-SG.js +345 -0
- package/src/en-US.d.ts +63 -0
- package/src/en-US.js +516 -0
- package/src/en-ZA.d.ts +56 -0
- package/src/en-ZA.js +478 -0
- package/src/es-ES.d.ts +65 -0
- package/src/es-ES.js +541 -0
- package/src/es-MX.d.ts +58 -0
- package/{lib/languages/es.js → src/es-MX.js} +228 -18
- package/src/es-US.d.ts +58 -0
- package/src/es-US.js +446 -0
- package/src/fa-IR.d.ts +38 -0
- package/src/fa-IR.js +246 -0
- package/src/fi-FI.d.ts +46 -0
- package/{lib/languages/fi.js → src/fi-FI.js} +152 -11
- package/src/fil-PH.d.ts +37 -0
- package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
- package/src/fr-BE.d.ts +49 -0
- package/{lib/languages → src}/fr-BE.js +175 -13
- package/src/fr-FR.d.ts +63 -0
- package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
- package/src/gu-IN.d.ts +35 -0
- package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
- package/src/ha-NG.d.ts +37 -0
- package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
- package/src/hbo-IL.d.ts +39 -0
- package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
- package/src/he-IL.d.ts +37 -0
- package/src/he-IL.js +537 -0
- package/src/hi-IN.d.ts +36 -0
- package/{lib/languages/hi.js → src/hi-IN.js} +116 -6
- package/src/hr-HR.d.ts +42 -0
- package/src/hr-HR.js +463 -0
- package/src/hu-HU.d.ts +38 -0
- package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
- package/src/id-ID.d.ts +38 -0
- package/{lib/languages/id.js → src/id-ID.js} +99 -8
- package/src/it-IT.d.ts +59 -0
- package/{lib/languages/it.js → src/it-IT.js} +179 -15
- package/src/ja-JP.d.ts +49 -0
- package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
- package/src/ka-GE.d.ts +44 -0
- package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
- package/src/kn-IN.d.ts +35 -0
- package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
- package/src/ko-KR.d.ts +45 -0
- package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
- package/src/lt-LT.d.ts +49 -0
- package/src/lt-LT.js +543 -0
- package/src/lv-LV.d.ts +49 -0
- package/src/lv-LV.js +595 -0
- package/src/mr-IN.d.ts +36 -0
- package/{lib/languages/mr.js → src/mr-IN.js} +116 -6
- package/src/ms-MY.d.ts +37 -0
- package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
- package/src/nb-NO.d.ts +44 -0
- package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
- package/src/nl-NL.d.ts +54 -0
- package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
- package/src/pa-IN.d.ts +36 -0
- package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
- package/src/pl-PL.d.ts +55 -0
- package/src/pl-PL.js +585 -0
- package/src/pt-BR.d.ts +31 -0
- package/src/pt-BR.js +534 -0
- package/src/pt-PT.d.ts +45 -0
- package/{lib/languages/pt.js → src/pt-PT.js} +234 -12
- package/src/ro-RO.d.ts +44 -0
- package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
- package/src/ru-RU.d.ts +50 -0
- package/src/ru-RU.js +535 -0
- package/src/sr-Cyrl-RS.d.ts +49 -0
- package/src/sr-Cyrl-RS.js +503 -0
- package/src/sr-Latn-RS.d.ts +49 -0
- package/src/sr-Latn-RS.js +503 -0
- package/src/sv-SE.d.ts +44 -0
- package/{lib/languages/sv.js → src/sv-SE.js} +136 -11
- package/src/sw-KE.d.ts +37 -0
- package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
- package/src/ta-IN.d.ts +35 -0
- package/{lib/languages/ta.js → src/ta-IN.js} +109 -6
- package/src/te-IN.d.ts +35 -0
- package/{lib/languages/te.js → src/te-IN.js} +115 -6
- package/src/th-TH.d.ts +38 -0
- package/{lib/languages/th.js → src/th-TH.js} +99 -6
- package/src/tr-TR.d.ts +48 -0
- package/{lib/languages/tr.js → src/tr-TR.js} +168 -23
- package/src/uk-UA.d.ts +42 -0
- package/src/uk-UA.js +463 -0
- package/src/ur-PK.d.ts +36 -0
- package/{lib/languages/ur.js → src/ur-PK.js} +116 -6
- package/src/utils/expand-scientific.d.ts +32 -0
- package/src/utils/expand-scientific.js +65 -0
- package/src/utils/parse-cardinal.d.ts +14 -0
- package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
- package/src/utils/parse-currency.d.ts +14 -0
- package/src/utils/parse-currency.js +91 -0
- package/src/utils/parse-ordinal.d.ts +10 -0
- package/src/utils/parse-ordinal.js +103 -0
- package/src/vi-VN.d.ts +48 -0
- package/{lib/languages/vi.js → src/vi-VN.js} +102 -11
- package/src/yo-NG.d.ts +37 -0
- package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
- package/src/zh-Hans-CN.d.ts +48 -0
- package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
- package/src/zh-Hant-TW.d.ts +50 -0
- package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
- package/dist/languages/am-Latn.js +0 -3
- package/dist/languages/am-Latn.js.map +0 -1
- package/dist/languages/am.js +0 -3
- package/dist/languages/am.js.map +0 -1
- package/dist/languages/ar.js +0 -3
- package/dist/languages/ar.js.map +0 -1
- package/dist/languages/az.js +0 -3
- package/dist/languages/az.js.map +0 -1
- package/dist/languages/bn.js +0 -3
- package/dist/languages/bn.js.map +0 -1
- package/dist/languages/cs.js +0 -3
- package/dist/languages/cs.js.map +0 -1
- package/dist/languages/da.js +0 -3
- package/dist/languages/da.js.map +0 -1
- package/dist/languages/de.js +0 -3
- package/dist/languages/de.js.map +0 -1
- package/dist/languages/el.js +0 -3
- package/dist/languages/el.js.map +0 -1
- package/dist/languages/en.js +0 -3
- package/dist/languages/en.js.map +0 -1
- package/dist/languages/es.js +0 -3
- package/dist/languages/es.js.map +0 -1
- package/dist/languages/fa.js +0 -3
- package/dist/languages/fa.js.map +0 -1
- package/dist/languages/fi.js +0 -3
- package/dist/languages/fi.js.map +0 -1
- package/dist/languages/fil.js +0 -3
- package/dist/languages/fil.js.map +0 -1
- package/dist/languages/fr-BE.js +0 -3
- package/dist/languages/fr-BE.js.map +0 -1
- package/dist/languages/fr.js +0 -3
- package/dist/languages/fr.js.map +0 -1
- package/dist/languages/gu.js +0 -3
- package/dist/languages/gu.js.map +0 -1
- package/dist/languages/ha.js +0 -3
- package/dist/languages/ha.js.map +0 -1
- package/dist/languages/hbo.js +0 -3
- package/dist/languages/hbo.js.map +0 -1
- package/dist/languages/he.js +0 -3
- package/dist/languages/he.js.map +0 -1
- package/dist/languages/hi.js +0 -3
- package/dist/languages/hi.js.map +0 -1
- package/dist/languages/hr.js +0 -3
- package/dist/languages/hr.js.map +0 -1
- package/dist/languages/hu.js +0 -3
- package/dist/languages/hu.js.map +0 -1
- package/dist/languages/id.js +0 -3
- package/dist/languages/id.js.map +0 -1
- package/dist/languages/it.js +0 -3
- package/dist/languages/it.js.map +0 -1
- package/dist/languages/ja.js +0 -3
- package/dist/languages/ja.js.map +0 -1
- package/dist/languages/ka.js +0 -3
- package/dist/languages/ka.js.map +0 -1
- package/dist/languages/kn.js +0 -3
- package/dist/languages/kn.js.map +0 -1
- package/dist/languages/ko.js +0 -3
- package/dist/languages/ko.js.map +0 -1
- package/dist/languages/lt.js +0 -3
- package/dist/languages/lt.js.map +0 -1
- package/dist/languages/lv.js +0 -3
- package/dist/languages/lv.js.map +0 -1
- package/dist/languages/mr.js +0 -3
- package/dist/languages/mr.js.map +0 -1
- package/dist/languages/ms.js +0 -3
- package/dist/languages/ms.js.map +0 -1
- package/dist/languages/nb.js +0 -3
- package/dist/languages/nb.js.map +0 -1
- package/dist/languages/nl.js +0 -3
- package/dist/languages/nl.js.map +0 -1
- package/dist/languages/pa.js +0 -3
- package/dist/languages/pa.js.map +0 -1
- package/dist/languages/pl.js +0 -3
- package/dist/languages/pl.js.map +0 -1
- package/dist/languages/pt.js +0 -3
- package/dist/languages/pt.js.map +0 -1
- package/dist/languages/ro.js +0 -3
- package/dist/languages/ro.js.map +0 -1
- package/dist/languages/ru.js +0 -3
- package/dist/languages/ru.js.map +0 -1
- package/dist/languages/sr-Cyrl.js +0 -3
- package/dist/languages/sr-Cyrl.js.map +0 -1
- package/dist/languages/sr-Latn.js +0 -3
- package/dist/languages/sr-Latn.js.map +0 -1
- package/dist/languages/sv.js +0 -3
- package/dist/languages/sv.js.map +0 -1
- package/dist/languages/sw.js +0 -3
- package/dist/languages/sw.js.map +0 -1
- package/dist/languages/ta.js +0 -3
- package/dist/languages/ta.js.map +0 -1
- package/dist/languages/te.js +0 -3
- package/dist/languages/te.js.map +0 -1
- package/dist/languages/th.js +0 -3
- package/dist/languages/th.js.map +0 -1
- package/dist/languages/tr.js +0 -3
- package/dist/languages/tr.js.map +0 -1
- package/dist/languages/uk.js +0 -3
- package/dist/languages/uk.js.map +0 -1
- package/dist/languages/ur.js +0 -3
- package/dist/languages/ur.js.map +0 -1
- package/dist/languages/vi.js +0 -3
- package/dist/languages/vi.js.map +0 -1
- package/dist/languages/yo.js +0 -3
- package/dist/languages/yo.js.map +0 -1
- package/dist/languages/zh-Hans.js +0 -3
- package/dist/languages/zh-Hans.js.map +0 -1
- package/dist/languages/zh-Hant.js +0 -3
- package/dist/languages/zh-Hant.js.map +0 -1
- package/dist/n2words.js +0 -3
- package/dist/n2words.js.map +0 -1
- package/lib/languages/am-Latn.d.ts +0 -7
- package/lib/languages/am-Latn.js +0 -159
- package/lib/languages/am.d.ts +0 -7
- package/lib/languages/am.js +0 -159
- package/lib/languages/ar.d.ts +0 -17
- package/lib/languages/az.d.ts +0 -7
- package/lib/languages/az.js +0 -171
- package/lib/languages/bn.d.ts +0 -7
- package/lib/languages/cs.d.ts +0 -18
- package/lib/languages/da.d.ts +0 -14
- package/lib/languages/de.d.ts +0 -17
- package/lib/languages/de.js +0 -320
- package/lib/languages/el.d.ts +0 -14
- package/lib/languages/el.js +0 -236
- package/lib/languages/en.d.ts +0 -17
- package/lib/languages/es.d.ts +0 -21
- package/lib/languages/fa.d.ts +0 -7
- package/lib/languages/fa.js +0 -134
- package/lib/languages/fi.d.ts +0 -14
- package/lib/languages/fil.d.ts +0 -7
- package/lib/languages/fr-BE.d.ts +0 -11
- package/lib/languages/fr.d.ts +0 -21
- package/lib/languages/gu.d.ts +0 -7
- package/lib/languages/ha.d.ts +0 -7
- package/lib/languages/hbo.d.ts +0 -13
- package/lib/languages/he.d.ts +0 -13
- package/lib/languages/he.js +0 -265
- package/lib/languages/hi.d.ts +0 -7
- package/lib/languages/hr.d.ts +0 -11
- package/lib/languages/hr.js +0 -224
- package/lib/languages/hu.d.ts +0 -7
- package/lib/languages/id.d.ts +0 -7
- package/lib/languages/it.d.ts +0 -19
- package/lib/languages/ja.d.ts +0 -17
- package/lib/languages/ka.d.ts +0 -17
- package/lib/languages/kn.d.ts +0 -7
- package/lib/languages/ko.d.ts +0 -14
- package/lib/languages/lt.d.ts +0 -18
- package/lib/languages/lt.js +0 -301
- package/lib/languages/lv.d.ts +0 -18
- package/lib/languages/lv.js +0 -312
- package/lib/languages/mr.d.ts +0 -7
- package/lib/languages/ms.d.ts +0 -7
- package/lib/languages/nb.d.ts +0 -14
- package/lib/languages/nl.d.ts +0 -26
- package/lib/languages/pa.d.ts +0 -7
- package/lib/languages/pl.d.ts +0 -22
- package/lib/languages/pl.js +0 -317
- package/lib/languages/pt.d.ts +0 -17
- package/lib/languages/ro.d.ts +0 -18
- package/lib/languages/ru.d.ts +0 -11
- package/lib/languages/ru.js +0 -245
- package/lib/languages/sr-Cyrl.d.ts +0 -11
- package/lib/languages/sr-Cyrl.js +0 -221
- package/lib/languages/sr-Latn.d.ts +0 -11
- package/lib/languages/sr-Latn.js +0 -221
- package/lib/languages/sv.d.ts +0 -14
- package/lib/languages/sw.d.ts +0 -7
- package/lib/languages/ta.d.ts +0 -7
- package/lib/languages/te.d.ts +0 -7
- package/lib/languages/th.d.ts +0 -7
- package/lib/languages/tr.d.ts +0 -18
- package/lib/languages/uk.d.ts +0 -11
- package/lib/languages/uk.js +0 -224
- package/lib/languages/ur.d.ts +0 -7
- package/lib/languages/vi.d.ts +0 -17
- package/lib/languages/yo.d.ts +0 -7
- package/lib/languages/zh-Hans.d.ts +0 -11
- package/lib/languages/zh-Hant.d.ts +0 -11
- package/lib/n2words.d.ts +0 -55
- package/lib/n2words.js +0 -126
- package/lib/utils/parse-numeric.d.ts +0 -17
- /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
- /package/{lib → src}/utils/is-plain-object.js +0 -0
- /package/{lib → src}/utils/validate-options.d.ts +0 -0
- /package/{lib → src}/utils/validate-options.js +0 -0
package/lib/languages/hr.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Croatian language converter - Functional Implementation
|
|
3
|
-
*
|
|
4
|
-
* Self-contained module with its own input validation, ready for subpath exports.
|
|
5
|
-
*
|
|
6
|
-
* Key features:
|
|
7
|
-
* - Three-form pluralization (one/few/many)
|
|
8
|
-
* - Gender: thousands are feminine, millions+ are masculine
|
|
9
|
-
* - Irregular hundreds (dvjesto, tristo, etc.)
|
|
10
|
-
* - Long scale naming with -ard forms
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
14
|
-
import { validateOptions } from '../utils/validate-options.js'
|
|
15
|
-
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// Vocabulary
|
|
18
|
-
// ============================================================================
|
|
19
|
-
|
|
20
|
-
const ONES_MASC = ['', 'jedan', 'dva', 'tri', 'četiri', 'pet', 'šest', 'sedam', 'osam', 'devet']
|
|
21
|
-
const ONES_FEM = ['', 'jedna', 'dvije', 'tri', 'četiri', 'pet', 'šest', 'sedam', 'osam', 'devet']
|
|
22
|
-
|
|
23
|
-
const TEENS = ['deset', 'jedanaest', 'dvanaest', 'trinaest', 'četrnaest', 'petnaest', 'šesnaest', 'sedamnaest', 'osamnaest', 'devetnaest']
|
|
24
|
-
const TENS = ['', '', 'dvadeset', 'trideset', 'četrdeset', 'pedeset', 'šezdeset', 'sedamdeset', 'osamdeset', 'devedeset']
|
|
25
|
-
|
|
26
|
-
// Croatian has irregular hundreds
|
|
27
|
-
const HUNDREDS = ['', 'sto', 'dvjesto', 'tristo', 'četiristo', 'petsto', 'šesto', 'sedamsto', 'osamsto', 'devetsto']
|
|
28
|
-
|
|
29
|
-
const ZERO = 'nula'
|
|
30
|
-
const NEGATIVE = 'minus'
|
|
31
|
-
const DECIMAL_SEP = 'zarez'
|
|
32
|
-
|
|
33
|
-
// Scale words: [singular, few, many]
|
|
34
|
-
// Thousands (index 0) are feminine, rest are masculine
|
|
35
|
-
const SCALE_FORMS = [
|
|
36
|
-
['tisuća', 'tisuće', 'tisuća'],
|
|
37
|
-
['milijun', 'milijuna', 'milijuna'],
|
|
38
|
-
['milijarda', 'milijarde', 'milijarda'],
|
|
39
|
-
['bilijun', 'bilijuna', 'bilijuna'],
|
|
40
|
-
['bilijarda', 'bilijarde', 'bilijarda'],
|
|
41
|
-
['trilijun', 'trilijuna', 'trilijuna'],
|
|
42
|
-
['trilijarda', 'trilijarde', 'trilijarda'],
|
|
43
|
-
['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna'],
|
|
44
|
-
['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda']
|
|
45
|
-
]
|
|
46
|
-
|
|
47
|
-
// ============================================================================
|
|
48
|
-
// Segment Building
|
|
49
|
-
// ============================================================================
|
|
50
|
-
|
|
51
|
-
function pluralize (n, forms) {
|
|
52
|
-
const num = typeof n === 'bigint' ? Number(n) : n
|
|
53
|
-
const lastDigit = num % 10
|
|
54
|
-
const lastTwoDigits = num % 100
|
|
55
|
-
|
|
56
|
-
if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
|
|
57
|
-
return forms[2]
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (lastDigit === 1) return forms[0]
|
|
61
|
-
if (lastDigit >= 2 && lastDigit <= 4) return forms[1]
|
|
62
|
-
return forms[2]
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function buildSegmentMasc (n) {
|
|
66
|
-
if (n === 0) return ''
|
|
67
|
-
|
|
68
|
-
const onesDigit = n % 10
|
|
69
|
-
const tensDigit = Math.floor(n / 10) % 10
|
|
70
|
-
const hundredsDigit = Math.floor(n / 100)
|
|
71
|
-
|
|
72
|
-
const parts = []
|
|
73
|
-
|
|
74
|
-
if (hundredsDigit > 0) {
|
|
75
|
-
parts.push(HUNDREDS[hundredsDigit])
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (tensDigit > 1) {
|
|
79
|
-
parts.push(TENS[tensDigit])
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (tensDigit === 1) {
|
|
83
|
-
parts.push(TEENS[onesDigit])
|
|
84
|
-
} else if (onesDigit > 0) {
|
|
85
|
-
parts.push(ONES_MASC[onesDigit])
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return parts.join(' ')
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function buildSegmentFem (n) {
|
|
92
|
-
if (n === 0) return ''
|
|
93
|
-
|
|
94
|
-
const onesDigit = n % 10
|
|
95
|
-
const tensDigit = Math.floor(n / 10) % 10
|
|
96
|
-
const hundredsDigit = Math.floor(n / 100)
|
|
97
|
-
|
|
98
|
-
const parts = []
|
|
99
|
-
|
|
100
|
-
if (hundredsDigit > 0) {
|
|
101
|
-
parts.push(HUNDREDS[hundredsDigit])
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (tensDigit > 1) {
|
|
105
|
-
parts.push(TENS[tensDigit])
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (tensDigit === 1) {
|
|
109
|
-
parts.push(TEENS[onesDigit])
|
|
110
|
-
} else if (onesDigit > 0) {
|
|
111
|
-
parts.push(ONES_FEM[onesDigit])
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return parts.join(' ')
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// ============================================================================
|
|
118
|
-
// Conversion Functions
|
|
119
|
-
// ============================================================================
|
|
120
|
-
|
|
121
|
-
function integerToWords (n, options = {}) {
|
|
122
|
-
if (n === 0n) return ZERO
|
|
123
|
-
|
|
124
|
-
if (n < 1000n) {
|
|
125
|
-
return options.gender === 'feminine' ? buildSegmentFem(Number(n)) : buildSegmentMasc(Number(n))
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return buildLargeNumberWords(n, options)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function buildLargeNumberWords (n, options) {
|
|
132
|
-
const numStr = n.toString()
|
|
133
|
-
const len = numStr.length
|
|
134
|
-
|
|
135
|
-
const segments = []
|
|
136
|
-
const segmentSize = 3
|
|
137
|
-
|
|
138
|
-
const remainderLen = len % segmentSize
|
|
139
|
-
let pos = 0
|
|
140
|
-
if (remainderLen > 0) {
|
|
141
|
-
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
142
|
-
pos = remainderLen
|
|
143
|
-
}
|
|
144
|
-
while (pos < len) {
|
|
145
|
-
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
146
|
-
pos += segmentSize
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const parts = []
|
|
150
|
-
let scaleIndex = segments.length - 1
|
|
151
|
-
|
|
152
|
-
for (let i = 0; i < segments.length; i++) {
|
|
153
|
-
const segment = segments[i]
|
|
154
|
-
|
|
155
|
-
if (segment !== 0) {
|
|
156
|
-
if (scaleIndex === 0) {
|
|
157
|
-
parts.push(options.gender === 'feminine' ? buildSegmentFem(segment) : buildSegmentMasc(segment))
|
|
158
|
-
} else {
|
|
159
|
-
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
160
|
-
const scaleWord = pluralize(segment, scaleForms)
|
|
161
|
-
// Thousands (scaleIndex=1) are feminine, others masculine
|
|
162
|
-
const isFeminine = scaleIndex === 1
|
|
163
|
-
const segmentWord = isFeminine ? buildSegmentFem(segment) : buildSegmentMasc(segment)
|
|
164
|
-
parts.push(segmentWord + ' ' + scaleWord)
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
scaleIndex--
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return parts.join(' ')
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function decimalPartToWords (decimalPart, options) {
|
|
175
|
-
let result = ''
|
|
176
|
-
let i = 0
|
|
177
|
-
|
|
178
|
-
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
179
|
-
if (result) result += ' '
|
|
180
|
-
result += ZERO
|
|
181
|
-
i++
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const remainder = decimalPart.slice(i)
|
|
185
|
-
if (remainder) {
|
|
186
|
-
if (result) result += ' '
|
|
187
|
-
result += integerToWords(BigInt(remainder), options)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return result
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Converts a numeric value to Croatian words.
|
|
195
|
-
*
|
|
196
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
197
|
-
* @param {Object} [options] - Optional configuration
|
|
198
|
-
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
199
|
-
* @returns {string} The number in Croatian words
|
|
200
|
-
*/
|
|
201
|
-
function toWords (value, options) {
|
|
202
|
-
options = validateOptions(options)
|
|
203
|
-
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
204
|
-
|
|
205
|
-
let result = ''
|
|
206
|
-
|
|
207
|
-
if (isNegative) {
|
|
208
|
-
result = NEGATIVE + ' '
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
result += integerToWords(integerPart, options)
|
|
212
|
-
|
|
213
|
-
if (decimalPart) {
|
|
214
|
-
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return result
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// ============================================================================
|
|
221
|
-
// Exports
|
|
222
|
-
// ============================================================================
|
|
223
|
-
|
|
224
|
-
export { toWords }
|
package/lib/languages/hu.d.ts
DELETED
package/lib/languages/id.d.ts
DELETED
package/lib/languages/it.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Italian words.
|
|
3
|
-
*
|
|
4
|
-
* This is the main public API. It accepts any valid numeric input
|
|
5
|
-
* (number, string, or bigint) and handles parsing internally.
|
|
6
|
-
*
|
|
7
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
8
|
-
* @returns {string} The number in Italian words
|
|
9
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
10
|
-
* @throws {Error} If value is not a valid number format
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* toWords(28) // 'ventotto'
|
|
14
|
-
* toWords(23) // 'ventitré'
|
|
15
|
-
* toWords(1000) // 'mille'
|
|
16
|
-
* toWords(2000) // 'duemila'
|
|
17
|
-
* toWords(1000000) // 'un milione'
|
|
18
|
-
*/
|
|
19
|
-
export function toWords(value: number | string | bigint): string;
|
package/lib/languages/ja.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Japanese words.
|
|
3
|
-
*
|
|
4
|
-
* This is the main public API. It accepts any valid numeric input
|
|
5
|
-
* (number, string, or bigint) and handles parsing internally.
|
|
6
|
-
*
|
|
7
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
8
|
-
* @returns {string} The number in Japanese kanji words
|
|
9
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
10
|
-
* @throws {Error} If value is not a valid number format
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* toWords(42) // '四十二'
|
|
14
|
-
* toWords(10000) // '一万'
|
|
15
|
-
* toWords(100000000) // '一億'
|
|
16
|
-
*/
|
|
17
|
-
export function toWords(value: number | string | bigint): string;
|
package/lib/languages/ka.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Georgian words.
|
|
3
|
-
*
|
|
4
|
-
* This is the main public API. It accepts any valid numeric input
|
|
5
|
-
* (number, string, or bigint) and handles parsing internally.
|
|
6
|
-
*
|
|
7
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
8
|
-
* @returns {string} The number in Georgian words
|
|
9
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
10
|
-
* @throws {Error} If value is not a valid number format
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* toWords(21) // 'ოცდაერთი'
|
|
14
|
-
* toWords(100) // 'ასი'
|
|
15
|
-
* toWords(1000) // 'ათასი'
|
|
16
|
-
*/
|
|
17
|
-
export function toWords(value: number | string | bigint): string;
|
package/lib/languages/kn.d.ts
DELETED
package/lib/languages/ko.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Korean words.
|
|
3
|
-
*
|
|
4
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
-
* @returns {string} The number in Korean words
|
|
6
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
7
|
-
* @throws {Error} If value is not a valid number format
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* toWords(21) // '이십일'
|
|
11
|
-
* toWords(10000) // '만'
|
|
12
|
-
* toWords(1000000) // '백만'
|
|
13
|
-
*/
|
|
14
|
-
export function toWords(value: number | string | bigint): string;
|
package/lib/languages/lt.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Lithuanian 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 Lithuanian 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
|
-
* toWords(42) // 'keturiasdešimt du'
|
|
13
|
-
* toWords(1, { gender: 'feminine' }) // 'viena'
|
|
14
|
-
* toWords(1000000) // 'vienas milijonas'
|
|
15
|
-
*/
|
|
16
|
-
export function toWords(value: number | string | bigint, options?: {
|
|
17
|
-
gender?: string | undefined;
|
|
18
|
-
}): string;
|
package/lib/languages/lt.js
DELETED
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lithuanian language converter - Functional Implementation
|
|
3
|
-
*
|
|
4
|
-
* Self-contained module with its own input validation, ready for subpath exports.
|
|
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 { parseNumericValue } from '../utils/parse-numeric.js'
|
|
14
|
-
import { validateOptions } from '../utils/validate-options.js'
|
|
15
|
-
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// Vocabulary (module-level constants)
|
|
18
|
-
// ============================================================================
|
|
19
|
-
|
|
20
|
-
const ONES_MASC = ['', 'vienas', 'du', 'trys', 'keturi', 'penki', 'šeši', 'septyni', 'aštuoni', 'devyni']
|
|
21
|
-
const ONES_FEM = ['', 'viena', 'dvi', 'trys', 'keturios', 'penkios', 'šešios', 'septynios', 'aštuonios', 'devynios']
|
|
22
|
-
|
|
23
|
-
const TEENS = ['dešimt', 'vienuolika', 'dvylika', 'trylika', 'keturiolika', 'penkiolika', 'šešiolika', 'septyniolika', 'aštuoniolika', 'devyniolika']
|
|
24
|
-
const TENS = ['', '', 'dvidešimt', 'trisdešimt', 'keturiasdešimt', 'penkiasdešimt', 'šešiasdešimt', 'septyniasdešimt', 'aštuoniasdešimt', 'devyniasdešimt']
|
|
25
|
-
|
|
26
|
-
// Hundreds: šimtas (singular), šimtai (plural)
|
|
27
|
-
const HUNDRED_SINGULAR = 'šimtas'
|
|
28
|
-
const HUNDRED_PLURAL = 'šimtai'
|
|
29
|
-
|
|
30
|
-
const ZERO = 'nulis'
|
|
31
|
-
const NEGATIVE = 'minus'
|
|
32
|
-
const DECIMAL_SEP = 'kablelis'
|
|
33
|
-
|
|
34
|
-
// Scale words: [singular, plural, genitive]
|
|
35
|
-
const SCALE_FORMS = [
|
|
36
|
-
['tūkstantis', 'tūkstančiai', 'tūkstančių'],
|
|
37
|
-
['milijonas', 'milijonai', 'milijonų'],
|
|
38
|
-
['milijardas', 'milijardai', 'milijardų'],
|
|
39
|
-
['trilijonas', 'trilijonai', 'trilijonų'],
|
|
40
|
-
['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],
|
|
41
|
-
['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],
|
|
42
|
-
['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],
|
|
43
|
-
['septilijonas', 'septilijonai', 'septilijonų'],
|
|
44
|
-
['oktilijonas', 'oktilijonai', 'oktilijonų']
|
|
45
|
-
]
|
|
46
|
-
|
|
47
|
-
// ============================================================================
|
|
48
|
-
// Segment Building
|
|
49
|
-
// ============================================================================
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Builds segment word for 0-999 (masculine form).
|
|
53
|
-
*/
|
|
54
|
-
function buildSegment (n) {
|
|
55
|
-
if (n === 0) return ''
|
|
56
|
-
|
|
57
|
-
const ones = n % 10
|
|
58
|
-
const tens = Math.floor(n / 10) % 10
|
|
59
|
-
const hundreds = Math.floor(n / 100)
|
|
60
|
-
|
|
61
|
-
const parts = []
|
|
62
|
-
|
|
63
|
-
// Hundreds - Lithuanian always includes the numeral
|
|
64
|
-
if (hundreds > 0) {
|
|
65
|
-
parts.push(ONES_MASC[hundreds])
|
|
66
|
-
parts.push(hundreds === 1 ? HUNDRED_SINGULAR : HUNDRED_PLURAL)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Tens
|
|
70
|
-
if (tens > 1) {
|
|
71
|
-
parts.push(TENS[tens])
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Teens or ones
|
|
75
|
-
if (tens === 1) {
|
|
76
|
-
parts.push(TEENS[ones])
|
|
77
|
-
} else if (ones > 0) {
|
|
78
|
-
parts.push(ONES_MASC[ones])
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return parts.join(' ')
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Builds segment word for 0-999 (feminine form - only differs in ones).
|
|
86
|
-
*/
|
|
87
|
-
function buildSegmentFeminine (n) {
|
|
88
|
-
if (n === 0) return ''
|
|
89
|
-
|
|
90
|
-
const ones = n % 10
|
|
91
|
-
const tens = Math.floor(n / 10) % 10
|
|
92
|
-
const hundreds = Math.floor(n / 100)
|
|
93
|
-
|
|
94
|
-
const parts = []
|
|
95
|
-
|
|
96
|
-
// Hundreds - always masculine
|
|
97
|
-
if (hundreds > 0) {
|
|
98
|
-
parts.push(ONES_MASC[hundreds])
|
|
99
|
-
parts.push(hundreds === 1 ? HUNDRED_SINGULAR : HUNDRED_PLURAL)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Tens
|
|
103
|
-
if (tens > 1) {
|
|
104
|
-
parts.push(TENS[tens])
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Teens or ones - feminine for ones only
|
|
108
|
-
if (tens === 1) {
|
|
109
|
-
parts.push(TEENS[ones])
|
|
110
|
-
} else if (ones > 0) {
|
|
111
|
-
parts.push(ONES_FEM[ones])
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return parts.join(' ')
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// ============================================================================
|
|
118
|
-
// Pluralization
|
|
119
|
-
// ============================================================================
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Lithuanian pluralization rules.
|
|
123
|
-
* - Singular: ends in 1 (except 11)
|
|
124
|
-
* - Plural: ends in 2-9 (except 12-19)
|
|
125
|
-
* - Genitive: 0, 10-19, or ends in 0
|
|
126
|
-
*
|
|
127
|
-
* @param {number} n - The segment value
|
|
128
|
-
* @param {string[]} forms - [singular, plural, genitive]
|
|
129
|
-
* @returns {string} The appropriate form
|
|
130
|
-
*/
|
|
131
|
-
function pluralize (n, forms) {
|
|
132
|
-
if (n === 0) return forms[2]
|
|
133
|
-
|
|
134
|
-
const lastDigit = n % 10
|
|
135
|
-
const lastTwoDigits = n % 100
|
|
136
|
-
|
|
137
|
-
// 10-19 always use genitive
|
|
138
|
-
if (lastTwoDigits >= 10 && lastTwoDigits <= 19) {
|
|
139
|
-
return forms[2]
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Ends in 0 → genitive
|
|
143
|
-
if (lastDigit === 0) {
|
|
144
|
-
return forms[2]
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Ends in 1 → singular
|
|
148
|
-
if (lastDigit === 1) {
|
|
149
|
-
return forms[0]
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Ends in 2-9 → plural
|
|
153
|
-
return forms[1]
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// ============================================================================
|
|
157
|
-
// Conversion Functions
|
|
158
|
-
// ============================================================================
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Converts a non-negative integer to Lithuanian words.
|
|
162
|
-
*
|
|
163
|
-
* @param {bigint} n - Non-negative integer to convert
|
|
164
|
-
* @param {Object} options - Conversion options
|
|
165
|
-
* @returns {string} Lithuanian words
|
|
166
|
-
*/
|
|
167
|
-
function integerToWords (n, options = {}) {
|
|
168
|
-
if (n === 0n) return ZERO
|
|
169
|
-
|
|
170
|
-
// Fast path: numbers < 1000
|
|
171
|
-
if (n < 1000n) {
|
|
172
|
-
const num = Number(n)
|
|
173
|
-
return options.gender === 'feminine' ? buildSegmentFeminine(num) : buildSegment(num)
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// For numbers >= 1000, feminine only applies to final segment if < 1000
|
|
177
|
-
// But the fixture shows feminine NOT applying for n >= 1000
|
|
178
|
-
// So we use masculine for all segments when n >= 1000
|
|
179
|
-
return buildLargeNumberWords(n, options)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Builds words for numbers >= 1000.
|
|
184
|
-
*
|
|
185
|
-
* @param {bigint} n - Number >= 1000
|
|
186
|
-
* @param {Object} options - Conversion options
|
|
187
|
-
* @returns {string} Lithuanian words
|
|
188
|
-
*/
|
|
189
|
-
function buildLargeNumberWords (n, options) {
|
|
190
|
-
const numStr = n.toString()
|
|
191
|
-
const len = numStr.length
|
|
192
|
-
|
|
193
|
-
// Build segments of 3 digits from right to left
|
|
194
|
-
const segments = []
|
|
195
|
-
const segmentSize = 3
|
|
196
|
-
|
|
197
|
-
const remainderLen = len % segmentSize
|
|
198
|
-
let pos = 0
|
|
199
|
-
if (remainderLen > 0) {
|
|
200
|
-
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
201
|
-
pos = remainderLen
|
|
202
|
-
}
|
|
203
|
-
while (pos < len) {
|
|
204
|
-
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
205
|
-
pos += segmentSize
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Convert segments to words
|
|
209
|
-
const parts = []
|
|
210
|
-
let scaleIndex = segments.length - 1
|
|
211
|
-
|
|
212
|
-
for (let i = 0; i < segments.length; i++) {
|
|
213
|
-
const segment = segments[i]
|
|
214
|
-
|
|
215
|
-
if (segment !== 0) {
|
|
216
|
-
const segmentWord = buildSegment(segment)
|
|
217
|
-
|
|
218
|
-
if (scaleIndex === 0) {
|
|
219
|
-
// Units segment - use masculine (feminine doesn't apply when n >= 1000)
|
|
220
|
-
parts.push(segmentWord)
|
|
221
|
-
} else {
|
|
222
|
-
// Segment with scale word
|
|
223
|
-
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
224
|
-
const scaleWord = pluralize(segment, scaleForms)
|
|
225
|
-
parts.push(segmentWord + ' ' + scaleWord)
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
scaleIndex--
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return parts.join(' ')
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Converts decimal digits to Lithuanian words.
|
|
237
|
-
*
|
|
238
|
-
* @param {string} decimalPart - Decimal digits (without the point)
|
|
239
|
-
* @param {Object} options - Conversion options
|
|
240
|
-
* @returns {string} Lithuanian words for decimal part
|
|
241
|
-
*/
|
|
242
|
-
function decimalPartToWords (decimalPart, options) {
|
|
243
|
-
let result = ''
|
|
244
|
-
|
|
245
|
-
// Handle leading zeros
|
|
246
|
-
let i = 0
|
|
247
|
-
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
248
|
-
if (result) result += ' '
|
|
249
|
-
result += ZERO
|
|
250
|
-
i++
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Convert remainder as a single number
|
|
254
|
-
const remainder = decimalPart.slice(i)
|
|
255
|
-
if (remainder) {
|
|
256
|
-
if (result) result += ' '
|
|
257
|
-
result += integerToWords(BigInt(remainder), options)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return result
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Converts a numeric value to Lithuanian words.
|
|
265
|
-
*
|
|
266
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
267
|
-
* @param {Object} [options] - Conversion options
|
|
268
|
-
* @param {string} [options.gender='masculine'] - Gender for numbers < 1000
|
|
269
|
-
* @returns {string} The number in Lithuanian words
|
|
270
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
271
|
-
* @throws {Error} If value is not a valid number format
|
|
272
|
-
*
|
|
273
|
-
* @example
|
|
274
|
-
* toWords(42) // 'keturiasdešimt du'
|
|
275
|
-
* toWords(1, { gender: 'feminine' }) // 'viena'
|
|
276
|
-
* toWords(1000000) // 'vienas milijonas'
|
|
277
|
-
*/
|
|
278
|
-
function toWords (value, options) {
|
|
279
|
-
options = validateOptions(options)
|
|
280
|
-
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
281
|
-
|
|
282
|
-
let result = ''
|
|
283
|
-
|
|
284
|
-
if (isNegative) {
|
|
285
|
-
result = NEGATIVE + ' '
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
result += integerToWords(integerPart, options)
|
|
289
|
-
|
|
290
|
-
if (decimalPart) {
|
|
291
|
-
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
return result
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// ============================================================================
|
|
298
|
-
// Public API
|
|
299
|
-
// ============================================================================
|
|
300
|
-
|
|
301
|
-
export { toWords }
|
package/lib/languages/lv.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
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
|
-
* toWords(42) // 'četrdesmit divi'
|
|
13
|
-
* toWords(1, { gender: 'feminine' }) // 'viena'
|
|
14
|
-
* toWords(1000) // 'tūkstotis'
|
|
15
|
-
*/
|
|
16
|
-
export function toWords(value: number | string | bigint, options?: {
|
|
17
|
-
gender?: string | undefined;
|
|
18
|
-
}): string;
|