n2words 3.1.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 +44 -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/{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-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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Italian language converter
|
|
2
|
+
* Italian (Italy) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: it-IT | Italian as used in Italy
|
|
5
5
|
*
|
|
6
6
|
* Italian-specific rules:
|
|
7
7
|
* - Concatenation without spaces within segments ("ventotto" not "venti otto")
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
* - "e" connector before simple final remainder
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
16
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
17
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
18
|
+
import { validateOptions } from './utils/validate-options.js'
|
|
16
19
|
|
|
17
20
|
// ============================================================================
|
|
18
21
|
// Vocabulary (module-level constants)
|
|
@@ -39,6 +42,24 @@ const THOUSAND_PLURAL_SUFFIX = 'mila'
|
|
|
39
42
|
// Scale word generation
|
|
40
43
|
const SCALE_PREFIXES = ['m', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec']
|
|
41
44
|
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Ordinal Vocabulary
|
|
47
|
+
// ============================================================================
|
|
48
|
+
|
|
49
|
+
// Irregular ordinals 1-10 (masculine form)
|
|
50
|
+
const ORDINAL_ONES = ['', 'primo', 'secondo', 'terzo', 'quarto', 'quinto', 'sesto', 'settimo', 'ottavo', 'nono', 'decimo']
|
|
51
|
+
|
|
52
|
+
// Ordinal suffix for 11+
|
|
53
|
+
const ORDINAL_SUFFIX = 'esimo'
|
|
54
|
+
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Currency Vocabulary (Euro)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
|
|
59
|
+
const EURO = 'euro'
|
|
60
|
+
const CENTESIMO = 'centesimo'
|
|
61
|
+
const CENTESIMI = 'centesimi'
|
|
62
|
+
|
|
42
63
|
// ============================================================================
|
|
43
64
|
// Segment Building
|
|
44
65
|
// ============================================================================
|
|
@@ -56,8 +77,8 @@ function buildSegment (n) {
|
|
|
56
77
|
if (n === 0) return ''
|
|
57
78
|
|
|
58
79
|
const ones = n % 10
|
|
59
|
-
const tens = Math.
|
|
60
|
-
const hundreds = Math.
|
|
80
|
+
const tens = Math.trunc(n / 10) % 10
|
|
81
|
+
const hundreds = Math.trunc(n / 100)
|
|
61
82
|
|
|
62
83
|
let result = ''
|
|
63
84
|
|
|
@@ -139,7 +160,7 @@ function buildThousands (n) {
|
|
|
139
160
|
*/
|
|
140
161
|
function getScaleWordSingular (scaleIndex) {
|
|
141
162
|
if (scaleIndex < 2) return ''
|
|
142
|
-
const prefixIndex = Math.
|
|
163
|
+
const prefixIndex = Math.trunc((scaleIndex - 2) / 2)
|
|
143
164
|
const isIardo = (scaleIndex - 2) % 2 === 1
|
|
144
165
|
const prefix = SCALE_PREFIXES[prefixIndex]
|
|
145
166
|
if (!prefix) return ''
|
|
@@ -152,7 +173,7 @@ function getScaleWordSingular (scaleIndex) {
|
|
|
152
173
|
*/
|
|
153
174
|
function getScaleWordPlural (scaleIndex) {
|
|
154
175
|
if (scaleIndex < 2) return ''
|
|
155
|
-
const prefixIndex = Math.
|
|
176
|
+
const prefixIndex = Math.trunc((scaleIndex - 2) / 2)
|
|
156
177
|
const isIardo = (scaleIndex - 2) % 2 === 1
|
|
157
178
|
const prefix = SCALE_PREFIXES[prefixIndex]
|
|
158
179
|
if (!prefix) return ''
|
|
@@ -311,14 +332,14 @@ function decimalPartToWords (decimalPart) {
|
|
|
311
332
|
* @throws {Error} If value is not a valid number format
|
|
312
333
|
*
|
|
313
334
|
* @example
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
335
|
+
* toCardinal(28) // 'ventotto'
|
|
336
|
+
* toCardinal(23) // 'ventitré'
|
|
337
|
+
* toCardinal(1000) // 'mille'
|
|
338
|
+
* toCardinal(2000) // 'duemila'
|
|
339
|
+
* toCardinal(1000000) // 'un milione'
|
|
319
340
|
*/
|
|
320
|
-
function
|
|
321
|
-
const { isNegative, integerPart, decimalPart } =
|
|
341
|
+
function toCardinal (value) {
|
|
342
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
322
343
|
|
|
323
344
|
let result = ''
|
|
324
345
|
|
|
@@ -335,8 +356,151 @@ function toWords (value) {
|
|
|
335
356
|
return result
|
|
336
357
|
}
|
|
337
358
|
|
|
359
|
+
// ============================================================================
|
|
360
|
+
// ORDINAL: toOrdinal(value)
|
|
361
|
+
// ============================================================================
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Converts a cardinal word to ordinal form by dropping final vowel and adding -esimo.
|
|
365
|
+
*
|
|
366
|
+
* @param {string} cardinalWord - Cardinal word to convert
|
|
367
|
+
* @returns {string} Ordinal form
|
|
368
|
+
*/
|
|
369
|
+
function cardinalToOrdinal (cardinalWord) {
|
|
370
|
+
// Handle accented 'é' at end (tré → tre + esimo = treesimo)
|
|
371
|
+
if (cardinalWord.endsWith('é')) {
|
|
372
|
+
return cardinalWord.slice(0, -1) + 'e' + ORDINAL_SUFFIX
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Handle "mila" ending (duemila → duemillesimo, not duemilesimo)
|
|
376
|
+
// The ordinal of thousand is "millesimo" (from mille), not "milesimo"
|
|
377
|
+
if (cardinalWord.endsWith('mila')) {
|
|
378
|
+
return cardinalWord.slice(0, -4) + 'mill' + ORDINAL_SUFFIX
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Handle "mille" ending (mille → millesimo)
|
|
382
|
+
if (cardinalWord.endsWith('mille')) {
|
|
383
|
+
return cardinalWord.slice(0, -1) + ORDINAL_SUFFIX
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Handle -ardo/-ardi endings (miliardo → miliardiesimo)
|
|
387
|
+
// These scale words get -iesimo not -esimo
|
|
388
|
+
if (cardinalWord.endsWith('ardo') || cardinalWord.endsWith('ardi')) {
|
|
389
|
+
return cardinalWord.slice(0, -1) + 'i' + ORDINAL_SUFFIX
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Drop final regular vowel before adding -esimo
|
|
393
|
+
const lastChar = cardinalWord.slice(-1)
|
|
394
|
+
if ('aeiouàèìòù'.includes(lastChar)) {
|
|
395
|
+
return cardinalWord.slice(0, -1) + ORDINAL_SUFFIX
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// If doesn't end in vowel, just add suffix
|
|
399
|
+
return cardinalWord + ORDINAL_SUFFIX
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Converts a positive integer to Italian ordinal words.
|
|
404
|
+
*
|
|
405
|
+
* @param {bigint} n - Positive integer
|
|
406
|
+
* @returns {string} Italian ordinal words (masculine form)
|
|
407
|
+
*/
|
|
408
|
+
function integerToOrdinal (n) {
|
|
409
|
+
// Special cases: 1-10 have irregular forms
|
|
410
|
+
if (n <= 10n) {
|
|
411
|
+
return ORDINAL_ONES[Number(n)]
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// For 11+, convert cardinal and apply -esimo
|
|
415
|
+
const cardinalWord = integerToWords(n)
|
|
416
|
+
return cardinalToOrdinal(cardinalWord)
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Converts a numeric value to Italian ordinal words.
|
|
421
|
+
*
|
|
422
|
+
* Italian ordinals: primo, secondo, terzo... (1-10 irregular)
|
|
423
|
+
* For 11+: cardinal word (drop final vowel) + -esimo
|
|
424
|
+
*
|
|
425
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
426
|
+
* @returns {string} The number as ordinal words (masculine form)
|
|
427
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
428
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
429
|
+
*
|
|
430
|
+
* @example
|
|
431
|
+
* toOrdinal(1) // 'primo'
|
|
432
|
+
* toOrdinal(2) // 'secondo'
|
|
433
|
+
* toOrdinal(11) // 'undicesimo'
|
|
434
|
+
* toOrdinal(21) // 'ventunesimo'
|
|
435
|
+
* toOrdinal(100) // 'centesimo'
|
|
436
|
+
* toOrdinal(1000) // 'millesimo'
|
|
437
|
+
*/
|
|
438
|
+
function toOrdinal (value) {
|
|
439
|
+
const integerPart = parseOrdinalValue(value)
|
|
440
|
+
return integerToOrdinal(integerPart)
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ============================================================================
|
|
444
|
+
// CURRENCY: toCurrency(value, options?)
|
|
445
|
+
// ============================================================================
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Converts a numeric value to Italian currency words (Euro).
|
|
449
|
+
*
|
|
450
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
451
|
+
* @param {Object} [options] - Optional configuration
|
|
452
|
+
* @param {boolean} [options.and=true] - Use "e" between euros and centesimi
|
|
453
|
+
* @returns {string} The amount in Italian currency words
|
|
454
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
455
|
+
* @throws {Error} If value is not a valid number format
|
|
456
|
+
*
|
|
457
|
+
* @example
|
|
458
|
+
* toCurrency(42.50) // 'quarantadue euro e cinquanta centesimi'
|
|
459
|
+
* toCurrency(1) // 'un euro'
|
|
460
|
+
* toCurrency(0.99) // 'novantanove centesimi'
|
|
461
|
+
* toCurrency(0.01) // 'un centesimo'
|
|
462
|
+
* toCurrency(42.50, { and: false }) // 'quarantadue euro cinquanta centesimi'
|
|
463
|
+
*/
|
|
464
|
+
function toCurrency (value, options) {
|
|
465
|
+
options = validateOptions(options)
|
|
466
|
+
const { isNegative, dollars: euros, cents: centesimi } = parseCurrencyValue(value)
|
|
467
|
+
const { and: useAnd = true } = options
|
|
468
|
+
|
|
469
|
+
// Build result
|
|
470
|
+
let result = ''
|
|
471
|
+
if (isNegative) result = NEGATIVE + ' '
|
|
472
|
+
|
|
473
|
+
// Euros part
|
|
474
|
+
if (euros > 0n || centesimi === 0n) {
|
|
475
|
+
// Use "un" for 1 euro instead of "uno"
|
|
476
|
+
if (euros === 1n) {
|
|
477
|
+
result += 'un'
|
|
478
|
+
} else {
|
|
479
|
+
result += integerToWords(euros)
|
|
480
|
+
}
|
|
481
|
+
// Euro is invariable (doesn't change for plural in Italian)
|
|
482
|
+
result += ' ' + EURO
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Centesimi part
|
|
486
|
+
if (centesimi > 0n) {
|
|
487
|
+
if (euros > 0n) {
|
|
488
|
+
result += useAnd ? ' e ' : ' '
|
|
489
|
+
}
|
|
490
|
+
// Use "un" for 1 centesimo instead of "uno"
|
|
491
|
+
if (centesimi === 1n) {
|
|
492
|
+
result += 'un'
|
|
493
|
+
} else {
|
|
494
|
+
result += integerToWords(centesimi)
|
|
495
|
+
}
|
|
496
|
+
result += ' ' + (centesimi === 1n ? CENTESIMO : CENTESIMI)
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return result
|
|
500
|
+
}
|
|
501
|
+
|
|
338
502
|
// ============================================================================
|
|
339
503
|
// Public API
|
|
340
504
|
// ============================================================================
|
|
341
505
|
|
|
342
|
-
export {
|
|
506
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/ja-JP.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
* toCardinal(42) // '四十二'
|
|
14
|
+
* toCardinal(10000) // '一万'
|
|
15
|
+
* toCardinal(100000000) // '一億'
|
|
16
|
+
*/
|
|
17
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
18
|
+
/**
|
|
19
|
+
* Converts a numeric value to Japanese ordinal words.
|
|
20
|
+
*
|
|
21
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
22
|
+
* @returns {string} The number as ordinal words
|
|
23
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
24
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* toOrdinal(1) // '第一'
|
|
28
|
+
* toOrdinal(10) // '第十'
|
|
29
|
+
* toOrdinal(100) // '第百'
|
|
30
|
+
*/
|
|
31
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
32
|
+
/**
|
|
33
|
+
* Converts a numeric value to Japanese currency words (Yen).
|
|
34
|
+
*
|
|
35
|
+
* Note: Sen (銭, 1/100 yen) is included for completeness but is rarely used
|
|
36
|
+
* in modern Japan. Most transactions are in whole yen.
|
|
37
|
+
*
|
|
38
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
39
|
+
* @returns {string} The amount in Japanese 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) // '四十二円'
|
|
45
|
+
* toCurrency(1) // '一円'
|
|
46
|
+
* toCurrency(0.50) // '五十銭'
|
|
47
|
+
* toCurrency(42.50) // '四十二円五十銭'
|
|
48
|
+
*/
|
|
49
|
+
export function toCurrency(value: number | string | bigint): string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Japanese language converter
|
|
2
|
+
* Japanese (Japan) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: ja-JP | Japanese as used in Japan
|
|
5
5
|
*
|
|
6
6
|
* Japanese-specific rules:
|
|
7
7
|
* - Myriad (万-based) grouping: 4 digits per segment instead of 3
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* - No spaces between characters
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
14
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
15
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
14
16
|
|
|
15
17
|
// ============================================================================
|
|
16
18
|
// Vocabulary (module-level constants)
|
|
@@ -45,6 +47,23 @@ const ZERO = '零'
|
|
|
45
47
|
const NEGATIVE = 'マイナス'
|
|
46
48
|
const DECIMAL_SEP = '点'
|
|
47
49
|
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Ordinal Vocabulary
|
|
52
|
+
// ============================================================================
|
|
53
|
+
|
|
54
|
+
// Ordinal prefix
|
|
55
|
+
const ORDINAL_PREFIX = '第'
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Currency Vocabulary (Japanese Yen)
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
// Yen (main unit)
|
|
62
|
+
const YEN = '円'
|
|
63
|
+
|
|
64
|
+
// Sen (1/100 yen) - historically used, now rare
|
|
65
|
+
const SEN = '銭'
|
|
66
|
+
|
|
48
67
|
// Internal scale words (within 4-digit segments)
|
|
49
68
|
const TEN = '十'
|
|
50
69
|
const HUNDRED = '百'
|
|
@@ -62,9 +81,9 @@ function buildSegment (n) {
|
|
|
62
81
|
if (n === 0) return ''
|
|
63
82
|
|
|
64
83
|
const ones = n % 10
|
|
65
|
-
const tens = Math.
|
|
66
|
-
const hundreds = Math.
|
|
67
|
-
const thousands = Math.
|
|
84
|
+
const tens = Math.trunc(n / 10) % 10
|
|
85
|
+
const hundreds = Math.trunc(n / 100) % 10
|
|
86
|
+
const thousands = Math.trunc(n / 1000)
|
|
68
87
|
|
|
69
88
|
let result = ''
|
|
70
89
|
|
|
@@ -218,12 +237,12 @@ function decimalPartToWords (decimalPart) {
|
|
|
218
237
|
* @throws {Error} If value is not a valid number format
|
|
219
238
|
*
|
|
220
239
|
* @example
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
240
|
+
* toCardinal(42) // '四十二'
|
|
241
|
+
* toCardinal(10000) // '一万'
|
|
242
|
+
* toCardinal(100000000) // '一億'
|
|
224
243
|
*/
|
|
225
|
-
function
|
|
226
|
-
const { isNegative, integerPart, decimalPart } =
|
|
244
|
+
function toCardinal (value) {
|
|
245
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
227
246
|
|
|
228
247
|
let result = ''
|
|
229
248
|
|
|
@@ -240,8 +259,88 @@ function toWords (value) {
|
|
|
240
259
|
return result
|
|
241
260
|
}
|
|
242
261
|
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// ORDINAL: toOrdinal(value)
|
|
264
|
+
// ============================================================================
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Converts a positive integer to Japanese ordinal words.
|
|
268
|
+
*
|
|
269
|
+
* Japanese ordinals: 第 prefix + cardinal number.
|
|
270
|
+
*
|
|
271
|
+
* @param {bigint} n - Positive integer to convert
|
|
272
|
+
* @returns {string} Japanese ordinal words
|
|
273
|
+
*/
|
|
274
|
+
function integerToOrdinal (n) {
|
|
275
|
+
return ORDINAL_PREFIX + integerToWords(n)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Converts a numeric value to Japanese ordinal words.
|
|
280
|
+
*
|
|
281
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
282
|
+
* @returns {string} The number as ordinal words
|
|
283
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
284
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* toOrdinal(1) // '第一'
|
|
288
|
+
* toOrdinal(10) // '第十'
|
|
289
|
+
* toOrdinal(100) // '第百'
|
|
290
|
+
*/
|
|
291
|
+
function toOrdinal (value) {
|
|
292
|
+
const integerPart = parseOrdinalValue(value)
|
|
293
|
+
return integerToOrdinal(integerPart)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ============================================================================
|
|
297
|
+
// CURRENCY: toCurrency(value, options?)
|
|
298
|
+
// ============================================================================
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Converts a numeric value to Japanese currency words (Yen).
|
|
302
|
+
*
|
|
303
|
+
* Note: Sen (銭, 1/100 yen) is included for completeness but is rarely used
|
|
304
|
+
* in modern Japan. Most transactions are in whole yen.
|
|
305
|
+
*
|
|
306
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
307
|
+
* @returns {string} The amount in Japanese currency words
|
|
308
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
309
|
+
* @throws {Error} If value is not a valid number format
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* toCurrency(42) // '四十二円'
|
|
313
|
+
* toCurrency(1) // '一円'
|
|
314
|
+
* toCurrency(0.50) // '五十銭'
|
|
315
|
+
* toCurrency(42.50) // '四十二円五十銭'
|
|
316
|
+
*/
|
|
317
|
+
function toCurrency (value) {
|
|
318
|
+
const { isNegative, dollars: yen, cents: sen } = parseCurrencyValue(value)
|
|
319
|
+
|
|
320
|
+
// Build result
|
|
321
|
+
let result = ''
|
|
322
|
+
if (isNegative) result = NEGATIVE
|
|
323
|
+
|
|
324
|
+
// Yen part
|
|
325
|
+
if (yen > 0n) {
|
|
326
|
+
result += integerToWords(yen) + YEN
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Sen part (1/100 yen)
|
|
330
|
+
if (sen > 0n) {
|
|
331
|
+
result += integerToWords(sen) + SEN
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Handle zero case
|
|
335
|
+
if (yen === 0n && sen === 0n) {
|
|
336
|
+
result += ZERO + YEN
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return result
|
|
340
|
+
}
|
|
341
|
+
|
|
243
342
|
// ============================================================================
|
|
244
343
|
// Public API
|
|
245
344
|
// ============================================================================
|
|
246
345
|
|
|
247
|
-
export {
|
|
346
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/ka-GE.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
* toCardinal(21) // 'ოცდაერთი'
|
|
14
|
+
* toCardinal(100) // 'ასი'
|
|
15
|
+
* toCardinal(1000) // 'ათასი'
|
|
16
|
+
*/
|
|
17
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
18
|
+
/**
|
|
19
|
+
* Converts a numeric value to Georgian ordinal words.
|
|
20
|
+
*
|
|
21
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
22
|
+
* @returns {string} The ordinal in Georgian words
|
|
23
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
24
|
+
* @throws {Error} If value is not a positive integer
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* toOrdinal(1) // 'პირველი'
|
|
28
|
+
* toOrdinal(10) // 'მეათე'
|
|
29
|
+
* toOrdinal(21) // 'მეოცდაერთე'
|
|
30
|
+
*/
|
|
31
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
32
|
+
/**
|
|
33
|
+
* Converts a numeric value to Georgian Lari currency words.
|
|
34
|
+
*
|
|
35
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
36
|
+
* @returns {string} The currency in Georgian words
|
|
37
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
38
|
+
* @throws {Error} If value is not a valid number format
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* toCurrency(1) // 'ერთი ლარი'
|
|
42
|
+
* toCurrency(2.50) // 'ორი ლარი ორმოცდაათი თეთრი'
|
|
43
|
+
*/
|
|
44
|
+
export function toCurrency(value: number | string | bigint): string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Georgian language converter
|
|
2
|
+
* Georgian (Georgia) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: ka-GE | Georgian as used in Georgia
|
|
5
5
|
*
|
|
6
6
|
* Georgian-specific rules:
|
|
7
7
|
* - Vigesimal (base-20) system for 20-99
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* - Short scale for large numbers (მილიონი, მილიარდი, ტრილიონი)
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
16
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
17
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
16
18
|
|
|
17
19
|
// ============================================================================
|
|
18
20
|
// Vocabulary (module-level constants)
|
|
@@ -43,6 +45,16 @@ const ZERO = 'ნული'
|
|
|
43
45
|
const NEGATIVE = 'მინუს'
|
|
44
46
|
const DECIMAL_SEP = 'მთელი'
|
|
45
47
|
|
|
48
|
+
// Ordinal suffix (Georgian adds -ე to form ordinals)
|
|
49
|
+
const ORDINAL_SUFFIX = 'ე'
|
|
50
|
+
|
|
51
|
+
// Ordinal forms for 1-9 (these are special)
|
|
52
|
+
const ORDINAL_ONES = ['', 'პირველი', 'მეორე', 'მესამე', 'მეოთხე', 'მეხუთე', 'მეექვსე', 'მეშვიდე', 'მერვე', 'მეცხრე']
|
|
53
|
+
|
|
54
|
+
// Currency (Georgian Lari)
|
|
55
|
+
const LARI = 'ლარი'
|
|
56
|
+
const TETRI = 'თეთრი'
|
|
57
|
+
|
|
46
58
|
// ============================================================================
|
|
47
59
|
// Segment Building
|
|
48
60
|
// ============================================================================
|
|
@@ -56,7 +68,7 @@ function buildTens (n) {
|
|
|
56
68
|
if (n < 10) return ONES[n]
|
|
57
69
|
if (n < 20) return TEENS[n - 10]
|
|
58
70
|
|
|
59
|
-
const vigesimalGroup = Math.
|
|
71
|
+
const vigesimalGroup = Math.trunc(n / 20)
|
|
60
72
|
const remainder = n % 20
|
|
61
73
|
|
|
62
74
|
if (remainder === 0) {
|
|
@@ -87,7 +99,7 @@ function buildSegment (n) {
|
|
|
87
99
|
return { full: word, stem }
|
|
88
100
|
}
|
|
89
101
|
|
|
90
|
-
const hundreds = Math.
|
|
102
|
+
const hundreds = Math.trunc(n / 100)
|
|
91
103
|
const remainder = n % 100
|
|
92
104
|
|
|
93
105
|
// Build hundreds: ასი (100), ორასი (200), etc.
|
|
@@ -262,12 +274,12 @@ function decimalPartToWords (decimalPart) {
|
|
|
262
274
|
* @throws {Error} If value is not a valid number format
|
|
263
275
|
*
|
|
264
276
|
* @example
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
277
|
+
* toCardinal(21) // 'ოცდაერთი'
|
|
278
|
+
* toCardinal(100) // 'ასი'
|
|
279
|
+
* toCardinal(1000) // 'ათასი'
|
|
268
280
|
*/
|
|
269
|
-
function
|
|
270
|
-
const { isNegative, integerPart, decimalPart } =
|
|
281
|
+
function toCardinal (value) {
|
|
282
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
271
283
|
|
|
272
284
|
let result = ''
|
|
273
285
|
|
|
@@ -284,8 +296,98 @@ function toWords (value) {
|
|
|
284
296
|
return result
|
|
285
297
|
}
|
|
286
298
|
|
|
299
|
+
// ============================================================================
|
|
300
|
+
// Ordinal Functions
|
|
301
|
+
// ============================================================================
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Converts a non-negative integer to Georgian ordinal words.
|
|
305
|
+
* Georgian ordinals are formed by:
|
|
306
|
+
* - 1-9: special forms (პირველი, მეორე, მესამე, etc.)
|
|
307
|
+
* - 10+: მე- prefix + cardinal + -ე suffix
|
|
308
|
+
*
|
|
309
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
310
|
+
* @returns {string} Georgian ordinal words
|
|
311
|
+
*/
|
|
312
|
+
function integerToOrdinal (n) {
|
|
313
|
+
if (n === 0n) return ''
|
|
314
|
+
if (n <= 9n) return ORDINAL_ONES[Number(n)]
|
|
315
|
+
|
|
316
|
+
// For 10+, use მე- + cardinal stem + -ე
|
|
317
|
+
const cardinal = integerToWords(n)
|
|
318
|
+
|
|
319
|
+
// Remove final vowel and add -ე suffix
|
|
320
|
+
const lastChar = cardinal.slice(-1)
|
|
321
|
+
let stem
|
|
322
|
+
if (lastChar === 'ი' || lastChar === 'ა') {
|
|
323
|
+
stem = cardinal.slice(0, -1)
|
|
324
|
+
} else {
|
|
325
|
+
stem = cardinal
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return 'მე' + stem + ORDINAL_SUFFIX
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Converts a numeric value to Georgian ordinal words.
|
|
333
|
+
*
|
|
334
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
335
|
+
* @returns {string} The ordinal in Georgian words
|
|
336
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
337
|
+
* @throws {Error} If value is not a positive integer
|
|
338
|
+
*
|
|
339
|
+
* @example
|
|
340
|
+
* toOrdinal(1) // 'პირველი'
|
|
341
|
+
* toOrdinal(10) // 'მეათე'
|
|
342
|
+
* toOrdinal(21) // 'მეოცდაერთე'
|
|
343
|
+
*/
|
|
344
|
+
function toOrdinal (value) {
|
|
345
|
+
const n = parseOrdinalValue(value)
|
|
346
|
+
return integerToOrdinal(n)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// ============================================================================
|
|
350
|
+
// Currency Functions
|
|
351
|
+
// ============================================================================
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Converts a numeric value to Georgian Lari currency words.
|
|
355
|
+
*
|
|
356
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
357
|
+
* @returns {string} The currency in Georgian words
|
|
358
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
359
|
+
* @throws {Error} If value is not a valid number format
|
|
360
|
+
*
|
|
361
|
+
* @example
|
|
362
|
+
* toCurrency(1) // 'ერთი ლარი'
|
|
363
|
+
* toCurrency(2.50) // 'ორი ლარი ორმოცდაათი თეთრი'
|
|
364
|
+
*/
|
|
365
|
+
function toCurrency (value) {
|
|
366
|
+
const { isNegative, dollars, cents } = parseCurrencyValue(value)
|
|
367
|
+
|
|
368
|
+
const parts = []
|
|
369
|
+
|
|
370
|
+
if (isNegative) {
|
|
371
|
+
parts.push(NEGATIVE)
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Lari
|
|
375
|
+
if (dollars > 0n || cents === 0n) {
|
|
376
|
+
const lariWord = integerToWords(dollars)
|
|
377
|
+
parts.push(lariWord + ' ' + LARI)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Tetri
|
|
381
|
+
if (cents > 0n) {
|
|
382
|
+
const tetriWord = integerToWords(cents)
|
|
383
|
+
parts.push(tetriWord + ' ' + TETRI)
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return parts.join(' ')
|
|
387
|
+
}
|
|
388
|
+
|
|
287
389
|
// ============================================================================
|
|
288
390
|
// Public API
|
|
289
391
|
// ============================================================================
|
|
290
392
|
|
|
291
|
-
export {
|
|
393
|
+
export { toCardinal, toOrdinal, toCurrency }
|