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
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Czech language converter
|
|
2
|
+
* Czech (Czechia) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Self-contained module with its own input validation, ready for subpath exports.
|
|
4
|
+
* CLDR: cs-CZ | Czech as used in Czechia
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
* This eliminates all per-call string manipulation for segment conversion.
|
|
9
|
-
*
|
|
10
|
-
* Czech-specific rules (handled in precomputation):
|
|
6
|
+
* Czech-specific rules:
|
|
11
7
|
* - Three-form pluralization: 1 = singular, 2-4 = few, 5+ = many
|
|
12
8
|
* - Irregular hundreds: sto, dvě stě, tři sta, čtyři sta, pět set...
|
|
13
9
|
* - Gender: dva (masc) vs dvě (fem) for 2
|
|
@@ -15,7 +11,9 @@
|
|
|
15
11
|
* - Dynamic decimal separator: celá/celé/celých based on integer
|
|
16
12
|
*/
|
|
17
13
|
|
|
18
|
-
import {
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
19
17
|
|
|
20
18
|
// ============================================================================
|
|
21
19
|
// Vocabulary (module-level constants)
|
|
@@ -50,19 +48,46 @@ const ZERO = 'nula'
|
|
|
50
48
|
const NEGATIVE = 'mínus'
|
|
51
49
|
|
|
52
50
|
// ============================================================================
|
|
53
|
-
//
|
|
51
|
+
// Ordinal Vocabulary
|
|
52
|
+
// ============================================================================
|
|
53
|
+
|
|
54
|
+
// Czech ordinals (masculine nominative singular)
|
|
55
|
+
const ORDINAL_ONES = ['', 'první', 'druhý', 'třetí', 'čtvrtý', 'pátý', 'šestý', 'sedmý', 'osmý', 'devátý']
|
|
56
|
+
|
|
57
|
+
// Ordinal teens
|
|
58
|
+
const ORDINAL_TEENS = ['desátý', 'jedenáctý', 'dvanáctý', 'třináctý', 'čtrnáctý', 'patnáctý', 'šestnáctý', 'sedmnáctý', 'osmnáctý', 'devatenáctý']
|
|
59
|
+
|
|
60
|
+
// Ordinal tens (for exact tens)
|
|
61
|
+
const ORDINAL_TENS = ['', '', 'dvacátý', 'třicátý', 'čtyřicátý', 'padesátý', 'šedesátý', 'sedmdesátý', 'osmdesátý', 'devadesátý']
|
|
62
|
+
|
|
63
|
+
// Ordinal hundreds (for exact hundreds)
|
|
64
|
+
const ORDINAL_HUNDREDS = ['', 'stý', 'dvoustý', 'třístý', 'čtyřstý', 'pětistý', 'šestistý', 'sedmistý', 'osmistý', 'devítistý']
|
|
65
|
+
|
|
66
|
+
// Scale ordinals
|
|
67
|
+
const ORDINAL_SCALES = ['tisící', 'miliontý', 'miliardtý', 'biliontý']
|
|
68
|
+
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Currency Vocabulary (Czech Koruna)
|
|
71
|
+
// ============================================================================
|
|
72
|
+
|
|
73
|
+
// Koruna forms: [singular, few (2-4), many (5+)]
|
|
74
|
+
const KORUNA_FORMS = ['koruna', 'koruny', 'korun']
|
|
75
|
+
// Haléř forms: [singular, few (2-4), many (5+)]
|
|
76
|
+
const HALER_FORMS = ['haléř', 'haléře', 'haléřů']
|
|
77
|
+
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Segment Building
|
|
54
80
|
// ============================================================================
|
|
55
81
|
|
|
56
82
|
/**
|
|
57
83
|
* Builds segment word for 0-999 (masculine, default form).
|
|
58
|
-
* Only used during table construction.
|
|
59
84
|
*/
|
|
60
85
|
function buildSegment (n) {
|
|
61
86
|
if (n === 0) return ''
|
|
62
87
|
|
|
63
88
|
const ones = n % 10
|
|
64
|
-
const tens = Math.
|
|
65
|
-
const hundreds = Math.
|
|
89
|
+
const tens = Math.trunc(n / 10) % 10
|
|
90
|
+
const hundreds = Math.trunc(n / 100)
|
|
66
91
|
|
|
67
92
|
const parts = []
|
|
68
93
|
|
|
@@ -95,8 +120,8 @@ function buildSegmentWithHundreds (n) {
|
|
|
95
120
|
if (n === 0) return ''
|
|
96
121
|
|
|
97
122
|
const ones = n % 10
|
|
98
|
-
const tens = Math.
|
|
99
|
-
const hundreds = Math.
|
|
123
|
+
const tens = Math.trunc(n / 10) % 10
|
|
124
|
+
const hundreds = Math.trunc(n / 100)
|
|
100
125
|
|
|
101
126
|
const parts = []
|
|
102
127
|
|
|
@@ -120,18 +145,6 @@ function buildSegmentWithHundreds (n) {
|
|
|
120
145
|
return parts.join(' ')
|
|
121
146
|
}
|
|
122
147
|
|
|
123
|
-
// Precompute all 1000 segment words (0-999) - masculine form
|
|
124
|
-
const SEGMENTS = new Array(1000)
|
|
125
|
-
for (let i = 0; i < 1000; i++) {
|
|
126
|
-
SEGMENTS[i] = buildSegment(i)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Precompute all 1000 segment words with hundreds (irregular hundreds forms)
|
|
130
|
-
const SEGMENTS_WITH_HUNDREDS = new Array(1000)
|
|
131
|
-
for (let i = 0; i < 1000; i++) {
|
|
132
|
-
SEGMENTS_WITH_HUNDREDS[i] = buildSegmentWithHundreds(i)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
148
|
// ============================================================================
|
|
136
149
|
// Helper Functions
|
|
137
150
|
// ============================================================================
|
|
@@ -185,9 +198,9 @@ function getDecimalSeparator (integerPart) {
|
|
|
185
198
|
function integerToWords (n) {
|
|
186
199
|
if (n === 0n) return ZERO
|
|
187
200
|
|
|
188
|
-
// Fast path: numbers < 1000
|
|
201
|
+
// Fast path: numbers < 1000
|
|
189
202
|
if (n < 1000n) {
|
|
190
|
-
return
|
|
203
|
+
return buildSegment(Number(n))
|
|
191
204
|
}
|
|
192
205
|
|
|
193
206
|
// Fast path: numbers < 1,000,000 (thousands)
|
|
@@ -202,12 +215,12 @@ function integerToWords (n) {
|
|
|
202
215
|
// Omit "one" before tisíc
|
|
203
216
|
result = scaleWord
|
|
204
217
|
} else {
|
|
205
|
-
result =
|
|
218
|
+
result = buildSegment(Number(thousands)) + ' ' + scaleWord
|
|
206
219
|
}
|
|
207
220
|
|
|
208
221
|
if (remainder > 0) {
|
|
209
222
|
// Use form with irregular hundreds (for "dvě stě" etc.)
|
|
210
|
-
result += ' ' +
|
|
223
|
+
result += ' ' + buildSegmentWithHundreds(remainder)
|
|
211
224
|
}
|
|
212
225
|
|
|
213
226
|
return result
|
|
@@ -245,7 +258,7 @@ function buildLargeNumberWords (n) {
|
|
|
245
258
|
|
|
246
259
|
if (i === 0) {
|
|
247
260
|
// Units segment (no scale word) - use form with irregular hundreds
|
|
248
|
-
result +=
|
|
261
|
+
result += buildSegmentWithHundreds(Number(segment))
|
|
249
262
|
} else {
|
|
250
263
|
// Scale word needed
|
|
251
264
|
const forms = PLURAL_FORMS[i]
|
|
@@ -257,11 +270,11 @@ function buildLargeNumberWords (n) {
|
|
|
257
270
|
result += scaleWord
|
|
258
271
|
} else {
|
|
259
272
|
// Use masculine form for multiplier before scale words
|
|
260
|
-
result +=
|
|
273
|
+
result += buildSegment(Number(segment)) + ' ' + scaleWord
|
|
261
274
|
}
|
|
262
275
|
} else {
|
|
263
276
|
// Fallback for very large scales without defined forms
|
|
264
|
-
result +=
|
|
277
|
+
result += buildSegment(Number(segment))
|
|
265
278
|
}
|
|
266
279
|
}
|
|
267
280
|
}
|
|
@@ -308,13 +321,13 @@ function decimalPartToWords (decimalPart) {
|
|
|
308
321
|
* @throws {Error} If value is not a valid number format
|
|
309
322
|
*
|
|
310
323
|
* @example
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
324
|
+
* toCardinal(21) // 'dvacet jedna'
|
|
325
|
+
* toCardinal(1000) // 'tisíc'
|
|
326
|
+
* toCardinal(2000) // 'dva tisíce'
|
|
327
|
+
* toCardinal(5000) // 'pět tisíc'
|
|
315
328
|
*/
|
|
316
|
-
function
|
|
317
|
-
const { isNegative, integerPart, decimalPart } =
|
|
329
|
+
function toCardinal (value) {
|
|
330
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
318
331
|
|
|
319
332
|
let result = ''
|
|
320
333
|
|
|
@@ -332,8 +345,204 @@ function toWords (value) {
|
|
|
332
345
|
return result
|
|
333
346
|
}
|
|
334
347
|
|
|
348
|
+
// ============================================================================
|
|
349
|
+
// ORDINAL: toOrdinal(value)
|
|
350
|
+
// ============================================================================
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Builds ordinal for a 0-99 segment when it's the final (ordinal) part.
|
|
354
|
+
*
|
|
355
|
+
* @param {number} n - Number 0-99
|
|
356
|
+
* @returns {string} Ordinal words
|
|
357
|
+
*/
|
|
358
|
+
function buildOrdinalTensOnes (n) {
|
|
359
|
+
if (n === 0) return ''
|
|
360
|
+
|
|
361
|
+
const onesDigit = n % 10
|
|
362
|
+
const tensDigit = Math.trunc(n / 10)
|
|
363
|
+
|
|
364
|
+
if (tensDigit === 0) {
|
|
365
|
+
return ORDINAL_ONES[onesDigit]
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (tensDigit === 1) {
|
|
369
|
+
return ORDINAL_TEENS[onesDigit]
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (onesDigit === 0) {
|
|
373
|
+
return ORDINAL_TENS[tensDigit]
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return TENS[tensDigit] + ' ' + ORDINAL_ONES[onesDigit]
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Converts a positive integer to Czech ordinal words (masculine nominative).
|
|
381
|
+
*
|
|
382
|
+
* @param {bigint} n - Positive integer to convert
|
|
383
|
+
* @returns {string} Ordinal Czech words
|
|
384
|
+
*/
|
|
385
|
+
function integerToOrdinal (n) {
|
|
386
|
+
if (n < 100n) {
|
|
387
|
+
return buildOrdinalTensOnes(Number(n))
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (n < 1000n) {
|
|
391
|
+
const num = Number(n)
|
|
392
|
+
const hundredsDigit = Math.trunc(num / 100)
|
|
393
|
+
const remainder = num % 100
|
|
394
|
+
|
|
395
|
+
if (remainder === 0) {
|
|
396
|
+
return ORDINAL_HUNDREDS[hundredsDigit]
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return HUNDREDS[hundredsDigit] + ' ' + buildOrdinalTensOnes(remainder)
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (n < 1_000_000n) {
|
|
403
|
+
const thousands = Number(n / 1000n)
|
|
404
|
+
const remainder = Number(n % 1000n)
|
|
405
|
+
|
|
406
|
+
if (remainder === 0) {
|
|
407
|
+
if (thousands === 1) {
|
|
408
|
+
return ORDINAL_SCALES[0]
|
|
409
|
+
}
|
|
410
|
+
return buildSegment(thousands) + ' ' + ORDINAL_SCALES[0]
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
const scaleWord = pluralize(BigInt(thousands), PLURAL_FORMS[1])
|
|
414
|
+
const thousandsWord = thousands === 1 ? '' : buildSegment(thousands) + ' '
|
|
415
|
+
return (thousands === 1 ? 'tisíc' : thousandsWord + scaleWord) + ' ' + integerToOrdinal(BigInt(remainder))
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return buildLargeOrdinal(n)
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Builds ordinal words for numbers >= 1,000,000.
|
|
423
|
+
*
|
|
424
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
425
|
+
* @returns {string} Ordinal Czech words
|
|
426
|
+
*/
|
|
427
|
+
function buildLargeOrdinal (n) {
|
|
428
|
+
const segmentValues = []
|
|
429
|
+
let temp = n
|
|
430
|
+
while (temp > 0n) {
|
|
431
|
+
segmentValues.push(temp % 1000n)
|
|
432
|
+
temp = temp / 1000n
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
let lastNonZeroIdx = 0
|
|
436
|
+
for (let i = 0; i < segmentValues.length; i++) {
|
|
437
|
+
if (segmentValues[i] !== 0n) {
|
|
438
|
+
lastNonZeroIdx = i
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const parts = []
|
|
443
|
+
|
|
444
|
+
for (let i = segmentValues.length - 1; i >= 0; i--) {
|
|
445
|
+
const segment = segmentValues[i]
|
|
446
|
+
if (segment === 0n) continue
|
|
447
|
+
|
|
448
|
+
const isLastNonZero = (i === lastNonZeroIdx)
|
|
449
|
+
|
|
450
|
+
if (i === 0) {
|
|
451
|
+
if (isLastNonZero) {
|
|
452
|
+
parts.push(integerToOrdinal(segment))
|
|
453
|
+
} else {
|
|
454
|
+
parts.push(buildSegmentWithHundreds(Number(segment)))
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
if (isLastNonZero) {
|
|
458
|
+
if (segment === 1n) {
|
|
459
|
+
parts.push(ORDINAL_SCALES[i - 1] || PLURAL_FORMS[i][0])
|
|
460
|
+
} else {
|
|
461
|
+
parts.push(buildSegment(Number(segment)) + ' ' + (ORDINAL_SCALES[i - 1] || PLURAL_FORMS[i][0]))
|
|
462
|
+
}
|
|
463
|
+
} else {
|
|
464
|
+
const forms = PLURAL_FORMS[i]
|
|
465
|
+
if (forms) {
|
|
466
|
+
const scaleWord = pluralize(segment, forms)
|
|
467
|
+
if (segment === 1n) {
|
|
468
|
+
parts.push(scaleWord)
|
|
469
|
+
} else {
|
|
470
|
+
parts.push(buildSegment(Number(segment)) + ' ' + scaleWord)
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return parts.join(' ')
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Converts a numeric value to Czech ordinal words (masculine nominative).
|
|
482
|
+
*
|
|
483
|
+
* @param {number | string | bigint} value - The numeric value to convert (must be a positive integer)
|
|
484
|
+
* @returns {string} The number as ordinal words
|
|
485
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
486
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
487
|
+
*
|
|
488
|
+
* @example
|
|
489
|
+
* toOrdinal(1) // 'první'
|
|
490
|
+
* toOrdinal(2) // 'druhý'
|
|
491
|
+
* toOrdinal(21) // 'dvacet první'
|
|
492
|
+
* toOrdinal(100) // 'stý'
|
|
493
|
+
* toOrdinal(1000) // 'tisící'
|
|
494
|
+
*/
|
|
495
|
+
function toOrdinal (value) {
|
|
496
|
+
const integerPart = parseOrdinalValue(value)
|
|
497
|
+
return integerToOrdinal(integerPart)
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// ============================================================================
|
|
501
|
+
// CURRENCY: toCurrency(value)
|
|
502
|
+
// ============================================================================
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Converts a numeric value to Czech currency words (Koruna).
|
|
506
|
+
*
|
|
507
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
508
|
+
* @returns {string} The amount in Czech currency words
|
|
509
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
510
|
+
* @throws {Error} If value is not a valid number format
|
|
511
|
+
*
|
|
512
|
+
* @example
|
|
513
|
+
* toCurrency(42) // 'čtyřicet dva koruny'
|
|
514
|
+
* toCurrency(1) // 'jedna koruna'
|
|
515
|
+
* toCurrency(1.50) // 'jedna koruna padesát haléřů'
|
|
516
|
+
* toCurrency(-5) // 'mínus pět korun'
|
|
517
|
+
*/
|
|
518
|
+
function toCurrency (value) {
|
|
519
|
+
const { isNegative, dollars: koruny, cents: halere } = parseCurrencyValue(value)
|
|
520
|
+
|
|
521
|
+
let result = ''
|
|
522
|
+
if (isNegative) {
|
|
523
|
+
result = NEGATIVE + ' '
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Koruna part
|
|
527
|
+
if (koruny > 0n || halere === 0n) {
|
|
528
|
+
result += integerToWords(koruny)
|
|
529
|
+
result += ' ' + pluralize(koruny, KORUNA_FORMS)
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Haléř part
|
|
533
|
+
if (halere > 0n) {
|
|
534
|
+
if (koruny > 0n) {
|
|
535
|
+
result += ' '
|
|
536
|
+
}
|
|
537
|
+
result += integerToWords(halere)
|
|
538
|
+
result += ' ' + pluralize(halere, HALER_FORMS)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return result
|
|
542
|
+
}
|
|
543
|
+
|
|
335
544
|
// ============================================================================
|
|
336
545
|
// Public API
|
|
337
546
|
// ============================================================================
|
|
338
547
|
|
|
339
|
-
export {
|
|
548
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/da-DK.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Danish words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Danish 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
|
+
* toCardinal(21) // 'enogtyve'
|
|
11
|
+
* toCardinal(1000) // 'ettusind'
|
|
12
|
+
* toCardinal(1000000) // 'en millioner'
|
|
13
|
+
*/
|
|
14
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
15
|
+
/**
|
|
16
|
+
* Converts a numeric value to Danish ordinal words.
|
|
17
|
+
*
|
|
18
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
19
|
+
* @returns {string} The number as ordinal words
|
|
20
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
21
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* toOrdinal(1) // 'første'
|
|
25
|
+
* toOrdinal(2) // 'anden'
|
|
26
|
+
* toOrdinal(21) // 'enogtyvede'
|
|
27
|
+
*/
|
|
28
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
29
|
+
/**
|
|
30
|
+
* Converts a numeric value to Danish currency words (Danish Krone).
|
|
31
|
+
*
|
|
32
|
+
* Uses krone/kroner and øre (100 øre = 1 krone).
|
|
33
|
+
*
|
|
34
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
35
|
+
* @returns {string} The amount in Danish currency words
|
|
36
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
37
|
+
* @throws {Error} If value is not a valid number format
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* toCurrency(1) // 'en krone'
|
|
41
|
+
* toCurrency(42) // 'toogfyrre kroner'
|
|
42
|
+
* toCurrency(1.50) // 'en krone og halvtreds øre'
|
|
43
|
+
*/
|
|
44
|
+
export function toCurrency(value: number | string | bigint): string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Danish language converter
|
|
2
|
+
* Danish (Denmark) language converter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* CLDR: da-DK | Danish as used in Denmark
|
|
5
5
|
*
|
|
6
6
|
* Key features:
|
|
7
7
|
* - Vigesimal (base-20) tens naming: halvtreds (50), treds (60), etc.
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* - Long scale for millions+
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
15
17
|
|
|
16
18
|
// ============================================================================
|
|
17
19
|
// Vocabulary (module-level constants)
|
|
@@ -37,7 +39,36 @@ const DECIMAL_SEP = 'komma'
|
|
|
37
39
|
const SCALES = ['millioner', 'millarder', 'billioner', 'billarder', 'trillioner', 'trillarder', 'quadrillioner', 'quadrillarder']
|
|
38
40
|
|
|
39
41
|
// ============================================================================
|
|
40
|
-
//
|
|
42
|
+
// Ordinal Vocabulary
|
|
43
|
+
// ============================================================================
|
|
44
|
+
|
|
45
|
+
// Danish ordinals: 1st-2nd special, others use -te/-nde suffix
|
|
46
|
+
// "anden/andet" for 2nd (common/neuter), we use common form
|
|
47
|
+
const ORDINAL_SPECIAL = {
|
|
48
|
+
1: 'første',
|
|
49
|
+
2: 'anden',
|
|
50
|
+
3: 'tredje',
|
|
51
|
+
4: 'fjerde',
|
|
52
|
+
5: 'femte',
|
|
53
|
+
6: 'sjette',
|
|
54
|
+
7: 'syvende',
|
|
55
|
+
8: 'ottende',
|
|
56
|
+
9: 'niende',
|
|
57
|
+
10: 'tiende',
|
|
58
|
+
11: 'ellevte',
|
|
59
|
+
12: 'tolvte'
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// Currency Vocabulary (Danish Krone)
|
|
64
|
+
// ============================================================================
|
|
65
|
+
|
|
66
|
+
const KRONE = 'krone'
|
|
67
|
+
const KRONER = 'kroner' // plural
|
|
68
|
+
const ORE = 'øre' // same singular and plural
|
|
69
|
+
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Segment Building
|
|
41
72
|
// ============================================================================
|
|
42
73
|
|
|
43
74
|
/**
|
|
@@ -47,8 +78,8 @@ function buildSegment (n) {
|
|
|
47
78
|
if (n === 0) return ''
|
|
48
79
|
|
|
49
80
|
const ones = n % 10
|
|
50
|
-
const tens = Math.
|
|
51
|
-
const hundreds = Math.
|
|
81
|
+
const tens = Math.trunc(n / 10) % 10
|
|
82
|
+
const hundreds = Math.trunc(n / 100)
|
|
52
83
|
|
|
53
84
|
const parts = []
|
|
54
85
|
|
|
@@ -83,13 +114,6 @@ function buildSegment (n) {
|
|
|
83
114
|
return parts[0] || ''
|
|
84
115
|
}
|
|
85
116
|
|
|
86
|
-
// Precompute all 1000 segment words (0-999)
|
|
87
|
-
const SEGMENTS = new Array(1000)
|
|
88
|
-
|
|
89
|
-
for (let i = 0; i < 1000; i++) {
|
|
90
|
-
SEGMENTS[i] = buildSegment(i)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
117
|
// ============================================================================
|
|
94
118
|
// Conversion Functions
|
|
95
119
|
// ============================================================================
|
|
@@ -105,7 +129,7 @@ function integerToWords (n) {
|
|
|
105
129
|
|
|
106
130
|
// Fast path: numbers < 1000 (direct lookup)
|
|
107
131
|
if (n < 1000n) {
|
|
108
|
-
return
|
|
132
|
+
return buildSegment(Number(n))
|
|
109
133
|
}
|
|
110
134
|
|
|
111
135
|
// Fast path: numbers < 1,000,000 (thousands)
|
|
@@ -114,11 +138,11 @@ function integerToWords (n) {
|
|
|
114
138
|
const remainder = Number(n % 1000n)
|
|
115
139
|
|
|
116
140
|
// Compound thousands: "ettusind", "firetusind"
|
|
117
|
-
let result =
|
|
141
|
+
let result = buildSegment(thousands) + THOUSAND
|
|
118
142
|
|
|
119
143
|
if (remainder > 0) {
|
|
120
144
|
// Add 'e' suffix and " og " for remainder: "firetusinde og ..."
|
|
121
|
-
result += 'e og ' +
|
|
145
|
+
result += 'e og ' + buildSegment(remainder)
|
|
122
146
|
}
|
|
123
147
|
|
|
124
148
|
return result
|
|
@@ -162,7 +186,7 @@ function buildLargeNumberWords (n) {
|
|
|
162
186
|
const segment = segments[i]
|
|
163
187
|
|
|
164
188
|
if (segment !== 0) {
|
|
165
|
-
const segmentWord =
|
|
189
|
+
const segmentWord = buildSegment(segment)
|
|
166
190
|
|
|
167
191
|
if (scaleIndex === 0) {
|
|
168
192
|
// Units segment
|
|
@@ -266,12 +290,12 @@ function decimalPartToWords (decimalPart) {
|
|
|
266
290
|
* @throws {Error} If value is not a valid number format
|
|
267
291
|
*
|
|
268
292
|
* @example
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
293
|
+
* toCardinal(21) // 'enogtyve'
|
|
294
|
+
* toCardinal(1000) // 'ettusind'
|
|
295
|
+
* toCardinal(1000000) // 'en millioner'
|
|
272
296
|
*/
|
|
273
|
-
function
|
|
274
|
-
const { isNegative, integerPart, decimalPart } =
|
|
297
|
+
function toCardinal (value) {
|
|
298
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
275
299
|
|
|
276
300
|
let result = ''
|
|
277
301
|
|
|
@@ -288,8 +312,97 @@ function toWords (value) {
|
|
|
288
312
|
return result
|
|
289
313
|
}
|
|
290
314
|
|
|
315
|
+
// ============================================================================
|
|
316
|
+
// ORDINAL: toOrdinal(value)
|
|
317
|
+
// ============================================================================
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Converts a non-negative integer to Danish ordinal words.
|
|
321
|
+
*
|
|
322
|
+
* Danish ordinals: første (1st), anden (2nd), tredje (3rd), etc.
|
|
323
|
+
* 1-12 have special forms, others use cardinal + -de/-nde suffix.
|
|
324
|
+
*
|
|
325
|
+
* @param {bigint} n - Positive integer to convert
|
|
326
|
+
* @returns {string} Danish ordinal words
|
|
327
|
+
*/
|
|
328
|
+
function integerToOrdinal (n) {
|
|
329
|
+
// Special forms for 1-12
|
|
330
|
+
if (n >= 1n && n <= 12n) {
|
|
331
|
+
return ORDINAL_SPECIAL[Number(n)]
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// For numbers > 12, add -de suffix to cardinal
|
|
335
|
+
const cardinal = integerToWords(n)
|
|
336
|
+
return cardinal + 'de'
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Converts a numeric value to Danish ordinal words.
|
|
341
|
+
*
|
|
342
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
343
|
+
* @returns {string} The number as ordinal words
|
|
344
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
345
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* toOrdinal(1) // 'første'
|
|
349
|
+
* toOrdinal(2) // 'anden'
|
|
350
|
+
* toOrdinal(21) // 'enogtyvede'
|
|
351
|
+
*/
|
|
352
|
+
function toOrdinal (value) {
|
|
353
|
+
const integerPart = parseOrdinalValue(value)
|
|
354
|
+
return integerToOrdinal(integerPart)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// ============================================================================
|
|
358
|
+
// CURRENCY: toCurrency(value)
|
|
359
|
+
// ============================================================================
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Converts a numeric value to Danish currency words (Danish Krone).
|
|
363
|
+
*
|
|
364
|
+
* Uses krone/kroner and øre (100 øre = 1 krone).
|
|
365
|
+
*
|
|
366
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
367
|
+
* @returns {string} The amount in Danish currency words
|
|
368
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
369
|
+
* @throws {Error} If value is not a valid number format
|
|
370
|
+
*
|
|
371
|
+
* @example
|
|
372
|
+
* toCurrency(1) // 'en krone'
|
|
373
|
+
* toCurrency(42) // 'toogfyrre kroner'
|
|
374
|
+
* toCurrency(1.50) // 'en krone og halvtreds øre'
|
|
375
|
+
*/
|
|
376
|
+
function toCurrency (value) {
|
|
377
|
+
const { isNegative, dollars: kroner, cents: ore } = parseCurrencyValue(value)
|
|
378
|
+
|
|
379
|
+
let result = ''
|
|
380
|
+
if (isNegative) {
|
|
381
|
+
result = NEGATIVE + ' '
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Kroner part - use "en" for 1 krone
|
|
385
|
+
if (kroner > 0n || ore === 0n) {
|
|
386
|
+
if (kroner === 1n) {
|
|
387
|
+
result += 'en ' + KRONE
|
|
388
|
+
} else {
|
|
389
|
+
result += integerToWords(kroner) + ' ' + KRONER
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Øre part
|
|
394
|
+
if (ore > 0n) {
|
|
395
|
+
if (kroner > 0n) {
|
|
396
|
+
result += ' og '
|
|
397
|
+
}
|
|
398
|
+
result += integerToWords(ore) + ' ' + ORE
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return result
|
|
402
|
+
}
|
|
403
|
+
|
|
291
404
|
// ============================================================================
|
|
292
405
|
// Public API
|
|
293
406
|
// ============================================================================
|
|
294
407
|
|
|
295
|
-
export {
|
|
408
|
+
export { toCardinal, toOrdinal, toCurrency }
|