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
package/lib/languages/pl.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polish language converter - Functional Implementation
|
|
3
|
-
*
|
|
4
|
-
* Self-contained module with its own input validation, ready for subpath exports.
|
|
5
|
-
*
|
|
6
|
-
* Polish-specific rules:
|
|
7
|
-
* - Three-form pluralization: 1 = singular, 2-4 = few, 5+ = many
|
|
8
|
-
* - Gender agreement (masculine/feminine for numbers < 1000)
|
|
9
|
-
* - Omit "jeden" before scale words (tysiąc, milion, etc.)
|
|
10
|
-
* - Irregular hundreds: dwieście, trzysta, czterysta, pięćset...
|
|
11
|
-
* - Long scale with -ard forms: miliard, biliard, tryliard
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
15
|
-
import { validateOptions } from '../utils/validate-options.js'
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Vocabulary (module-level constants)
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
const ONES_MASC = ['', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć']
|
|
22
|
-
const ONES_FEM = ['', 'jedna', 'dwie', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć']
|
|
23
|
-
|
|
24
|
-
const TEENS = ['dziesięć', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście']
|
|
25
|
-
|
|
26
|
-
const TENS = ['', '', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt']
|
|
27
|
-
|
|
28
|
-
// Irregular hundreds
|
|
29
|
-
const HUNDREDS = ['', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset']
|
|
30
|
-
|
|
31
|
-
// Scale words: [singular, few (2-4), many (5+)]
|
|
32
|
-
const PLURAL_FORMS = {
|
|
33
|
-
1: ['tysiąc', 'tysiące', 'tysięcy'],
|
|
34
|
-
2: ['milion', 'miliony', 'milionów'],
|
|
35
|
-
3: ['miliard', 'miliardy', 'miliardów'],
|
|
36
|
-
4: ['bilion', 'biliony', 'bilionów'],
|
|
37
|
-
5: ['biliard', 'biliardy', 'biliardów'],
|
|
38
|
-
6: ['trylion', 'tryliony', 'trylionów'],
|
|
39
|
-
7: ['tryliard', 'tryliardy', 'tryliardów'],
|
|
40
|
-
8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'],
|
|
41
|
-
9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'],
|
|
42
|
-
10: ['kwintylion', 'kwintyliony', 'kwintylionów']
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const ZERO = 'zero'
|
|
46
|
-
const NEGATIVE = 'minus'
|
|
47
|
-
const DECIMAL_SEP = 'przecinek'
|
|
48
|
-
|
|
49
|
-
// ============================================================================
|
|
50
|
-
// Segment Building
|
|
51
|
-
// ============================================================================
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Builds segment word for 0-999 (masculine form).
|
|
55
|
-
* @param {number} n - Segment value
|
|
56
|
-
* @returns {string} Polish word
|
|
57
|
-
*/
|
|
58
|
-
function buildSegment (n) {
|
|
59
|
-
if (n === 0) return ''
|
|
60
|
-
|
|
61
|
-
const ones = n % 10
|
|
62
|
-
const tens = Math.floor(n / 10) % 10
|
|
63
|
-
const hundreds = Math.floor(n / 100)
|
|
64
|
-
|
|
65
|
-
const parts = []
|
|
66
|
-
|
|
67
|
-
// Hundreds
|
|
68
|
-
if (hundreds > 0) {
|
|
69
|
-
parts.push(HUNDREDS[hundreds])
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Tens and ones
|
|
73
|
-
if (tens === 1) {
|
|
74
|
-
// Teens (10-19)
|
|
75
|
-
parts.push(TEENS[ones])
|
|
76
|
-
} else {
|
|
77
|
-
if (tens >= 2) {
|
|
78
|
-
parts.push(TENS[tens])
|
|
79
|
-
}
|
|
80
|
-
if (ones > 0) {
|
|
81
|
-
parts.push(ONES_MASC[ones])
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return parts.join(' ')
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Builds segment word for 0-999 (feminine form - only differs in ones).
|
|
90
|
-
* @param {number} n - Segment value
|
|
91
|
-
* @returns {string} Polish word
|
|
92
|
-
*/
|
|
93
|
-
function buildSegmentFeminine (n) {
|
|
94
|
-
if (n === 0) return ''
|
|
95
|
-
|
|
96
|
-
const ones = n % 10
|
|
97
|
-
const tens = Math.floor(n / 10) % 10
|
|
98
|
-
const hundreds = Math.floor(n / 100)
|
|
99
|
-
|
|
100
|
-
const parts = []
|
|
101
|
-
|
|
102
|
-
// Hundreds
|
|
103
|
-
if (hundreds > 0) {
|
|
104
|
-
parts.push(HUNDREDS[hundreds])
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Tens and ones - feminine for ones only
|
|
108
|
-
if (tens === 1) {
|
|
109
|
-
parts.push(TEENS[ones])
|
|
110
|
-
} else {
|
|
111
|
-
if (tens >= 2) {
|
|
112
|
-
parts.push(TENS[tens])
|
|
113
|
-
}
|
|
114
|
-
if (ones > 0) {
|
|
115
|
-
parts.push(ONES_FEM[ones])
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return parts.join(' ')
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// ============================================================================
|
|
123
|
-
// Helper Functions
|
|
124
|
-
// ============================================================================
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Polish pluralization: 1 = singular, 2-4 = few, else = many.
|
|
128
|
-
* Special case: 11-19 always use many form.
|
|
129
|
-
*
|
|
130
|
-
* @param {bigint} n - Number to pluralize
|
|
131
|
-
* @param {string[]} forms - [singular, few, many]
|
|
132
|
-
* @returns {string} Correct plural form
|
|
133
|
-
*/
|
|
134
|
-
function pluralize (n, forms) {
|
|
135
|
-
if (n === 1n) {
|
|
136
|
-
return forms[0]
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const lastDigit = n % 10n
|
|
140
|
-
const lastTwoDigits = n % 100n
|
|
141
|
-
|
|
142
|
-
// Teens (11-19) always use many form
|
|
143
|
-
// 2-4 use few form (but not 12-14)
|
|
144
|
-
if (lastDigit >= 2n && lastDigit <= 4n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {
|
|
145
|
-
return forms[1]
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return forms[2]
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// ============================================================================
|
|
152
|
-
// Conversion Functions
|
|
153
|
-
// ============================================================================
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Converts a non-negative integer to Polish words.
|
|
157
|
-
*
|
|
158
|
-
* @param {bigint} n - Non-negative integer to convert
|
|
159
|
-
* @param {Object} options - Conversion options
|
|
160
|
-
* @returns {string} Polish words
|
|
161
|
-
*/
|
|
162
|
-
function integerToWords (n, options = {}) {
|
|
163
|
-
if (n === 0n) return ZERO
|
|
164
|
-
|
|
165
|
-
// Fast path: numbers < 1000
|
|
166
|
-
if (n < 1000n) {
|
|
167
|
-
return options.gender === 'feminine' ? buildSegmentFeminine(Number(n)) : buildSegment(Number(n))
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Fast path: numbers < 1,000,000 (thousands)
|
|
171
|
-
if (n < 1_000_000n) {
|
|
172
|
-
const thousands = Number(n / 1000n)
|
|
173
|
-
const remainder = Number(n % 1000n)
|
|
174
|
-
|
|
175
|
-
const scaleWord = pluralize(BigInt(thousands), PLURAL_FORMS[1])
|
|
176
|
-
|
|
177
|
-
let result
|
|
178
|
-
if (thousands === 1) {
|
|
179
|
-
// Omit "jeden" before tysiąc
|
|
180
|
-
result = scaleWord
|
|
181
|
-
} else {
|
|
182
|
-
result = buildSegment(thousands) + ' ' + scaleWord
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (remainder > 0) {
|
|
186
|
-
result += ' ' + buildSegment(remainder)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return result
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// For numbers >= 1,000,000, use scale decomposition
|
|
193
|
-
return buildLargeNumberWords(n, options)
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Builds words for numbers >= 1,000,000.
|
|
198
|
-
* Uses BigInt division for faster segment extraction.
|
|
199
|
-
*
|
|
200
|
-
* @param {bigint} n - Number >= 1,000,000
|
|
201
|
-
* @param {Object} options - Conversion options
|
|
202
|
-
* @returns {string} Polish words
|
|
203
|
-
*/
|
|
204
|
-
function buildLargeNumberWords (n, options) {
|
|
205
|
-
// Extract segments using BigInt division (faster than string slicing)
|
|
206
|
-
// Segments stored least-significant first (index 0 = ones, 1 = thousands, etc.)
|
|
207
|
-
const segmentValues = []
|
|
208
|
-
let temp = n
|
|
209
|
-
while (temp > 0n) {
|
|
210
|
-
segmentValues.push(temp % 1000n)
|
|
211
|
-
temp = temp / 1000n
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Build result string directly
|
|
215
|
-
let result = ''
|
|
216
|
-
|
|
217
|
-
for (let i = segmentValues.length - 1; i >= 0; i--) {
|
|
218
|
-
const segment = segmentValues[i]
|
|
219
|
-
if (segment === 0n) continue
|
|
220
|
-
|
|
221
|
-
const segmentWord = buildSegment(Number(segment))
|
|
222
|
-
|
|
223
|
-
if (result) result += ' '
|
|
224
|
-
|
|
225
|
-
if (i === 0) {
|
|
226
|
-
// Units segment
|
|
227
|
-
result += segmentWord
|
|
228
|
-
} else {
|
|
229
|
-
// Scale word needed
|
|
230
|
-
const forms = PLURAL_FORMS[i]
|
|
231
|
-
if (forms) {
|
|
232
|
-
const scaleWord = pluralize(segment, forms)
|
|
233
|
-
|
|
234
|
-
if (segment === 1n) {
|
|
235
|
-
// Omit "jeden" before scale words
|
|
236
|
-
result += scaleWord
|
|
237
|
-
} else {
|
|
238
|
-
result += segmentWord + ' ' + scaleWord
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return result
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Converts decimal digits to Polish words.
|
|
249
|
-
*
|
|
250
|
-
* @param {string} decimalPart - Decimal digits (without the point)
|
|
251
|
-
* @param {Object} options - Conversion options
|
|
252
|
-
* @returns {string} Polish words for decimal part
|
|
253
|
-
*/
|
|
254
|
-
function decimalPartToWords (decimalPart, options) {
|
|
255
|
-
let result = ''
|
|
256
|
-
|
|
257
|
-
// Handle leading zeros
|
|
258
|
-
let i = 0
|
|
259
|
-
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
260
|
-
if (result) result += ' '
|
|
261
|
-
result += ZERO
|
|
262
|
-
i++
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Convert remainder as a single number
|
|
266
|
-
const remainder = decimalPart.slice(i)
|
|
267
|
-
if (remainder) {
|
|
268
|
-
if (result) result += ' '
|
|
269
|
-
result += integerToWords(BigInt(remainder), options)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return result
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Converts a numeric value to Polish words.
|
|
277
|
-
*
|
|
278
|
-
* This is the main public API. It accepts any valid numeric input
|
|
279
|
-
* (number, string, or bigint) and handles parsing internally.
|
|
280
|
-
*
|
|
281
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
282
|
-
* @param {Object} [options] - Conversion options
|
|
283
|
-
* @param {string} [options.gender='masculine'] - Gender for numbers < 1000
|
|
284
|
-
* @returns {string} The number in Polish words
|
|
285
|
-
* @throws {TypeError} If value is not a valid numeric type
|
|
286
|
-
* @throws {Error} If value is not a valid number format
|
|
287
|
-
*
|
|
288
|
-
* @example
|
|
289
|
-
* toWords(1) // 'jeden'
|
|
290
|
-
* toWords(1, { gender: 'feminine' }) // 'jedna'
|
|
291
|
-
* toWords(1000) // 'tysiąc'
|
|
292
|
-
* toWords(2000) // 'dwa tysiące'
|
|
293
|
-
*/
|
|
294
|
-
function toWords (value, options) {
|
|
295
|
-
options = validateOptions(options)
|
|
296
|
-
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
297
|
-
|
|
298
|
-
let result = ''
|
|
299
|
-
|
|
300
|
-
if (isNegative) {
|
|
301
|
-
result = NEGATIVE + ' '
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
result += integerToWords(integerPart, options)
|
|
305
|
-
|
|
306
|
-
if (decimalPart) {
|
|
307
|
-
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
return result
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// ============================================================================
|
|
314
|
-
// Public API
|
|
315
|
-
// ============================================================================
|
|
316
|
-
|
|
317
|
-
export { toWords }
|
package/lib/languages/pt.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Portuguese 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 Portuguese 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) // 'vinte e um'
|
|
14
|
-
* toWords(100) // 'cem'
|
|
15
|
-
* toWords(1000000) // 'um milhão'
|
|
16
|
-
*/
|
|
17
|
-
export function toWords(value: number | string | bigint): string;
|
package/lib/languages/ro.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Romanian 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
|
|
7
|
-
* @returns {string} The number in Romanian 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(21) // 'douăzeci și unu'
|
|
13
|
-
* toWords(1, { gender: 'feminine' }) // 'una'
|
|
14
|
-
* toWords(1000) // 'o mie'
|
|
15
|
-
*/
|
|
16
|
-
export function toWords(value: number | string | bigint, options?: {
|
|
17
|
-
gender?: string | undefined;
|
|
18
|
-
}): string;
|
package/lib/languages/ru.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Russian words.
|
|
3
|
-
*
|
|
4
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
-
* @param {Object} [options] - Optional configuration
|
|
6
|
-
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
7
|
-
* @returns {string} The number in Russian words
|
|
8
|
-
*/
|
|
9
|
-
export function toWords(value: number | string | bigint, options?: {
|
|
10
|
-
gender?: "masculine" | "feminine" | undefined;
|
|
11
|
-
}): string;
|
package/lib/languages/ru.js
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Russian 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 (двести, триста, etc.)
|
|
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
|
|
18
|
-
// ============================================================================
|
|
19
|
-
|
|
20
|
-
const ONES_MASC = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять']
|
|
21
|
-
const ONES_FEM = ['', 'одна', 'две', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять']
|
|
22
|
-
|
|
23
|
-
const TEENS = ['десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
|
|
24
|
-
const TENS = ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
|
|
25
|
-
|
|
26
|
-
// Irregular hundreds
|
|
27
|
-
const HUNDREDS = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
|
|
28
|
-
|
|
29
|
-
const ZERO = 'ноль'
|
|
30
|
-
const NEGATIVE = 'минус'
|
|
31
|
-
const DECIMAL_SEP = 'запятая'
|
|
32
|
-
|
|
33
|
-
// Scale words: [singular, few, many]
|
|
34
|
-
// Thousands (index 0) are feminine, rest are masculine
|
|
35
|
-
const SCALE_FORMS = [
|
|
36
|
-
['тысяча', 'тысячи', 'тысяч'],
|
|
37
|
-
['миллион', 'миллиона', 'миллионов'],
|
|
38
|
-
['миллиард', 'миллиарда', 'миллиардов'],
|
|
39
|
-
['триллион', 'триллиона', 'триллионов'],
|
|
40
|
-
['квадриллион', 'квадриллиона', 'квадриллионов'],
|
|
41
|
-
['квинтиллион', 'квинтиллиона', 'квинтиллионов'],
|
|
42
|
-
['секстиллион', 'секстиллиона', 'секстиллионов'],
|
|
43
|
-
['септиллион', 'септиллиона', 'септиллионов'],
|
|
44
|
-
['октиллион', 'октиллиона', 'октиллионов'],
|
|
45
|
-
['нониллион', 'нониллиона', 'нониллионов']
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
// ============================================================================
|
|
49
|
-
// Segment Building
|
|
50
|
-
// ============================================================================
|
|
51
|
-
|
|
52
|
-
function pluralize (n, forms) {
|
|
53
|
-
const num = typeof n === 'bigint' ? Number(n) : n
|
|
54
|
-
const lastDigit = num % 10
|
|
55
|
-
const lastTwoDigits = num % 100
|
|
56
|
-
|
|
57
|
-
if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
|
|
58
|
-
return forms[2]
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (lastDigit === 1) return forms[0]
|
|
62
|
-
if (lastDigit >= 2 && lastDigit <= 4) return forms[1]
|
|
63
|
-
return forms[2]
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function buildSegmentMasc (n) {
|
|
67
|
-
if (n === 0) return ''
|
|
68
|
-
|
|
69
|
-
const onesDigit = n % 10
|
|
70
|
-
const tensDigit = Math.floor(n / 10) % 10
|
|
71
|
-
const hundredsDigit = Math.floor(n / 100)
|
|
72
|
-
|
|
73
|
-
const parts = []
|
|
74
|
-
|
|
75
|
-
if (hundredsDigit > 0) {
|
|
76
|
-
parts.push(HUNDREDS[hundredsDigit])
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (tensDigit > 1) {
|
|
80
|
-
parts.push(TENS[tensDigit])
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (tensDigit === 1) {
|
|
84
|
-
parts.push(TEENS[onesDigit])
|
|
85
|
-
} else if (onesDigit > 0) {
|
|
86
|
-
parts.push(ONES_MASC[onesDigit])
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return parts.join(' ')
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function buildSegmentFem (n) {
|
|
93
|
-
if (n === 0) return ''
|
|
94
|
-
|
|
95
|
-
const onesDigit = n % 10
|
|
96
|
-
const tensDigit = Math.floor(n / 10) % 10
|
|
97
|
-
const hundredsDigit = Math.floor(n / 100)
|
|
98
|
-
|
|
99
|
-
const parts = []
|
|
100
|
-
|
|
101
|
-
if (hundredsDigit > 0) {
|
|
102
|
-
parts.push(HUNDREDS[hundredsDigit])
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (tensDigit > 1) {
|
|
106
|
-
parts.push(TENS[tensDigit])
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (tensDigit === 1) {
|
|
110
|
-
parts.push(TEENS[onesDigit])
|
|
111
|
-
} else if (onesDigit > 0) {
|
|
112
|
-
parts.push(ONES_FEM[onesDigit])
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return parts.join(' ')
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// ============================================================================
|
|
119
|
-
// Conversion Functions
|
|
120
|
-
// ============================================================================
|
|
121
|
-
|
|
122
|
-
function integerToWords (n, options = {}) {
|
|
123
|
-
if (n === 0n) return ZERO
|
|
124
|
-
|
|
125
|
-
const feminine = options.gender === 'feminine'
|
|
126
|
-
|
|
127
|
-
if (n < 1000n) {
|
|
128
|
-
return feminine ? buildSegmentFem(Number(n)) : buildSegmentMasc(Number(n))
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (n < 1_000_000n) {
|
|
132
|
-
const thousands = Number(n / 1000n)
|
|
133
|
-
const remainder = Number(n % 1000n)
|
|
134
|
-
|
|
135
|
-
// Thousands are always feminine in Russian
|
|
136
|
-
const thousandsWord = buildSegmentFem(thousands)
|
|
137
|
-
const scaleWord = pluralize(thousands, SCALE_FORMS[0])
|
|
138
|
-
|
|
139
|
-
let result = thousandsWord + ' ' + scaleWord
|
|
140
|
-
|
|
141
|
-
if (remainder > 0) {
|
|
142
|
-
result += ' ' + (feminine ? buildSegmentFem(remainder) : buildSegmentMasc(remainder))
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return result
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return buildLargeNumberWords(n, options)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function buildLargeNumberWords (n, options) {
|
|
152
|
-
const feminine = options.gender === 'feminine'
|
|
153
|
-
const numStr = n.toString()
|
|
154
|
-
const len = numStr.length
|
|
155
|
-
|
|
156
|
-
const segments = []
|
|
157
|
-
const segmentSize = 3
|
|
158
|
-
|
|
159
|
-
const remainderLen = len % segmentSize
|
|
160
|
-
let pos = 0
|
|
161
|
-
if (remainderLen > 0) {
|
|
162
|
-
segments.push(Number(numStr.slice(0, remainderLen)))
|
|
163
|
-
pos = remainderLen
|
|
164
|
-
}
|
|
165
|
-
while (pos < len) {
|
|
166
|
-
segments.push(Number(numStr.slice(pos, pos + segmentSize)))
|
|
167
|
-
pos += segmentSize
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const parts = []
|
|
171
|
-
let scaleIndex = segments.length - 1
|
|
172
|
-
|
|
173
|
-
for (let i = 0; i < segments.length; i++) {
|
|
174
|
-
const segment = segments[i]
|
|
175
|
-
|
|
176
|
-
if (segment !== 0) {
|
|
177
|
-
if (scaleIndex === 0) {
|
|
178
|
-
parts.push(feminine ? buildSegmentFem(segment) : buildSegmentMasc(segment))
|
|
179
|
-
} else {
|
|
180
|
-
const scaleForms = SCALE_FORMS[scaleIndex - 1]
|
|
181
|
-
const scaleWord = pluralize(segment, scaleForms)
|
|
182
|
-
// Thousands (scaleIndex=1) are feminine, others masculine
|
|
183
|
-
const isFeminine = scaleIndex === 1
|
|
184
|
-
const segmentWord = isFeminine ? buildSegmentFem(segment) : buildSegmentMasc(segment)
|
|
185
|
-
parts.push(segmentWord + ' ' + scaleWord)
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
scaleIndex--
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return parts.join(' ')
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function decimalPartToWords (decimalPart, options) {
|
|
196
|
-
let result = ''
|
|
197
|
-
let i = 0
|
|
198
|
-
|
|
199
|
-
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
200
|
-
if (result) result += ' '
|
|
201
|
-
result += ZERO
|
|
202
|
-
i++
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
const remainder = decimalPart.slice(i)
|
|
206
|
-
if (remainder) {
|
|
207
|
-
if (result) result += ' '
|
|
208
|
-
result += integerToWords(BigInt(remainder), options)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return result
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Converts a numeric value to Russian words.
|
|
216
|
-
*
|
|
217
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
218
|
-
* @param {Object} [options] - Optional configuration
|
|
219
|
-
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
220
|
-
* @returns {string} The number in Russian words
|
|
221
|
-
*/
|
|
222
|
-
function toWords (value, options) {
|
|
223
|
-
options = validateOptions(options)
|
|
224
|
-
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
225
|
-
|
|
226
|
-
let result = ''
|
|
227
|
-
|
|
228
|
-
if (isNegative) {
|
|
229
|
-
result = NEGATIVE + ' '
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
result += integerToWords(integerPart, options)
|
|
233
|
-
|
|
234
|
-
if (decimalPart) {
|
|
235
|
-
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return result
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// ============================================================================
|
|
242
|
-
// Exports
|
|
243
|
-
// ============================================================================
|
|
244
|
-
|
|
245
|
-
export { toWords }
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a numeric value to Serbian (Cyrillic) words.
|
|
3
|
-
*
|
|
4
|
-
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
-
* @param {Object} [options] - Optional configuration
|
|
6
|
-
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
7
|
-
* @returns {string} The number in Serbian Cyrillic words
|
|
8
|
-
*/
|
|
9
|
-
export function toWords(value: number | string | bigint, options?: {
|
|
10
|
-
gender?: "masculine" | "feminine" | undefined;
|
|
11
|
-
}): string;
|