n2words 3.1.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -40
- package/LICENSE +1 -1
- package/README.md +64 -184
- package/dist/am-ET.js +2 -0
- package/dist/am-ET.umd.js +2 -0
- package/dist/am-Latn-ET.js +2 -0
- package/dist/am-Latn-ET.umd.js +2 -0
- package/dist/ar-SA.js +2 -0
- package/dist/ar-SA.umd.js +2 -0
- package/dist/az-AZ.js +2 -0
- package/dist/az-AZ.umd.js +2 -0
- package/dist/bn-BD.js +2 -0
- package/dist/bn-BD.umd.js +2 -0
- package/dist/cs-CZ.js +2 -0
- package/dist/cs-CZ.umd.js +2 -0
- package/dist/da-DK.js +2 -0
- package/dist/da-DK.umd.js +2 -0
- package/dist/de-DE.js +2 -0
- package/dist/de-DE.umd.js +2 -0
- package/dist/el-GR.js +2 -0
- package/dist/el-GR.umd.js +2 -0
- package/dist/en-AU.js +2 -0
- package/dist/en-AU.umd.js +2 -0
- package/dist/en-BD.js +2 -0
- package/dist/en-BD.umd.js +2 -0
- package/dist/en-CA.js +2 -0
- package/dist/en-CA.umd.js +2 -0
- package/dist/en-GB.js +2 -0
- package/dist/en-GB.umd.js +2 -0
- package/dist/en-GH.js +2 -0
- package/dist/en-GH.umd.js +2 -0
- package/dist/en-IE.js +2 -0
- package/dist/en-IE.umd.js +2 -0
- package/dist/en-IN.js +2 -0
- package/dist/en-IN.umd.js +2 -0
- package/dist/en-KE.js +2 -0
- package/dist/en-KE.umd.js +2 -0
- package/dist/en-MY.js +2 -0
- package/dist/en-MY.umd.js +2 -0
- package/dist/en-NG.js +2 -0
- package/dist/en-NG.umd.js +2 -0
- package/dist/en-NZ.js +2 -0
- package/dist/en-NZ.umd.js +2 -0
- package/dist/en-PH.js +2 -0
- package/dist/en-PH.umd.js +2 -0
- package/dist/en-PK.js +2 -0
- package/dist/en-PK.umd.js +2 -0
- package/dist/en-SG.js +2 -0
- package/dist/en-SG.umd.js +2 -0
- package/dist/en-US.js +2 -0
- package/dist/en-US.umd.js +2 -0
- package/dist/en-ZA.js +2 -0
- package/dist/en-ZA.umd.js +2 -0
- package/dist/es-ES.js +2 -0
- package/dist/es-ES.umd.js +2 -0
- package/dist/es-MX.js +2 -0
- package/dist/es-MX.umd.js +2 -0
- package/dist/es-US.js +2 -0
- package/dist/es-US.umd.js +2 -0
- package/dist/fa-IR.js +2 -0
- package/dist/fa-IR.umd.js +2 -0
- package/dist/fi-FI.js +2 -0
- package/dist/fi-FI.umd.js +2 -0
- package/dist/fil-PH.js +2 -0
- package/dist/fil-PH.umd.js +2 -0
- package/dist/fr-BE.js +2 -0
- package/dist/fr-BE.umd.js +2 -0
- package/dist/fr-FR.js +2 -0
- package/dist/fr-FR.umd.js +2 -0
- package/dist/gu-IN.js +2 -0
- package/dist/gu-IN.umd.js +2 -0
- package/dist/ha-NG.js +2 -0
- package/dist/ha-NG.umd.js +2 -0
- package/dist/hbo-IL.js +2 -0
- package/dist/hbo-IL.umd.js +2 -0
- package/dist/he-IL.js +2 -0
- package/dist/he-IL.umd.js +2 -0
- package/dist/hi-IN.js +2 -0
- package/dist/hi-IN.umd.js +2 -0
- package/dist/hr-HR.js +2 -0
- package/dist/hr-HR.umd.js +2 -0
- package/dist/hu-HU.js +2 -0
- package/dist/hu-HU.umd.js +2 -0
- package/dist/id-ID.js +2 -0
- package/dist/id-ID.umd.js +2 -0
- package/dist/it-IT.js +2 -0
- package/dist/it-IT.umd.js +2 -0
- package/dist/ja-JP.js +2 -0
- package/dist/ja-JP.umd.js +2 -0
- package/dist/ka-GE.js +2 -0
- package/dist/ka-GE.umd.js +2 -0
- package/dist/kn-IN.js +2 -0
- package/dist/kn-IN.umd.js +2 -0
- package/dist/ko-KR.js +2 -0
- package/dist/ko-KR.umd.js +2 -0
- package/dist/lt-LT.js +2 -0
- package/dist/lt-LT.umd.js +2 -0
- package/dist/lv-LV.js +2 -0
- package/dist/lv-LV.umd.js +2 -0
- package/dist/mr-IN.js +2 -0
- package/dist/mr-IN.umd.js +2 -0
- package/dist/ms-MY.js +2 -0
- package/dist/ms-MY.umd.js +2 -0
- package/dist/nb-NO.js +2 -0
- package/dist/nb-NO.umd.js +2 -0
- package/dist/nl-NL.js +2 -0
- package/dist/nl-NL.umd.js +2 -0
- package/dist/pa-IN.js +2 -0
- package/dist/pa-IN.umd.js +2 -0
- package/dist/pl-PL.js +2 -0
- package/dist/pl-PL.umd.js +2 -0
- package/dist/pt-BR.js +2 -0
- package/dist/pt-BR.umd.js +2 -0
- package/dist/pt-PT.js +2 -0
- package/dist/pt-PT.umd.js +2 -0
- package/dist/ro-RO.js +2 -0
- package/dist/ro-RO.umd.js +2 -0
- package/dist/ru-RU.js +2 -0
- package/dist/ru-RU.umd.js +2 -0
- package/dist/sr-Cyrl-RS.js +2 -0
- package/dist/sr-Cyrl-RS.umd.js +2 -0
- package/dist/sr-Latn-RS.js +2 -0
- package/dist/sr-Latn-RS.umd.js +2 -0
- package/dist/sv-SE.js +2 -0
- package/dist/sv-SE.umd.js +2 -0
- package/dist/sw-KE.js +2 -0
- package/dist/sw-KE.umd.js +2 -0
- package/dist/ta-IN.js +2 -0
- package/dist/ta-IN.umd.js +2 -0
- package/dist/te-IN.js +2 -0
- package/dist/te-IN.umd.js +2 -0
- package/dist/th-TH.js +2 -0
- package/dist/th-TH.umd.js +2 -0
- package/dist/tr-TR.js +2 -0
- package/dist/tr-TR.umd.js +2 -0
- package/dist/uk-UA.js +2 -0
- package/dist/uk-UA.umd.js +2 -0
- package/dist/ur-PK.js +2 -0
- package/dist/ur-PK.umd.js +2 -0
- package/dist/vi-VN.js +2 -0
- package/dist/vi-VN.umd.js +2 -0
- package/dist/yo-NG.js +2 -0
- package/dist/yo-NG.umd.js +2 -0
- package/dist/zh-Hans-CN.js +2 -0
- package/dist/zh-Hans-CN.umd.js +2 -0
- package/dist/zh-Hant-TW.js +2 -0
- package/dist/zh-Hant-TW.umd.js +2 -0
- package/package.json +61 -88
- package/src/am-ET.d.ts +40 -0
- package/src/am-ET.js +269 -0
- package/src/am-Latn-ET.d.ts +35 -0
- package/src/am-Latn-ET.js +264 -0
- package/src/ar-SA.d.ts +49 -0
- package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
- package/src/az-AZ.d.ts +37 -0
- package/src/az-AZ.js +312 -0
- package/src/bn-BD.d.ts +36 -0
- package/{lib/languages/bn.js → src/bn-BD.js} +110 -6
- package/src/cs-CZ.d.ts +49 -0
- package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
- package/src/da-DK.d.ts +44 -0
- package/{lib/languages/da.js → src/da-DK.js} +131 -11
- package/src/de-DE.d.ts +57 -0
- package/src/de-DE.js +603 -0
- package/src/el-GR.d.ts +40 -0
- package/src/el-GR.js +418 -0
- package/src/en-AU.d.ts +47 -0
- package/src/en-AU.js +423 -0
- package/src/en-BD.d.ts +49 -0
- package/src/en-BD.js +415 -0
- package/src/en-CA.d.ts +63 -0
- package/src/en-CA.js +518 -0
- package/src/en-GB.d.ts +56 -0
- package/src/en-GB.js +469 -0
- package/src/en-GH.d.ts +11 -0
- package/src/en-GH.js +345 -0
- package/src/en-IE.d.ts +56 -0
- package/src/en-IE.js +479 -0
- package/src/en-IN.d.ts +49 -0
- package/src/en-IN.js +415 -0
- package/src/en-KE.d.ts +11 -0
- package/src/en-KE.js +345 -0
- package/src/en-MY.d.ts +11 -0
- package/src/en-MY.js +347 -0
- package/src/en-NG.d.ts +56 -0
- package/src/en-NG.js +479 -0
- package/src/en-NZ.d.ts +11 -0
- package/{lib/languages/en.js → src/en-NZ.js} +164 -31
- package/src/en-PH.d.ts +11 -0
- package/src/en-PH.js +345 -0
- package/src/en-PK.d.ts +49 -0
- package/src/en-PK.js +415 -0
- package/src/en-SG.d.ts +11 -0
- package/src/en-SG.js +345 -0
- package/src/en-US.d.ts +63 -0
- package/src/en-US.js +516 -0
- package/src/en-ZA.d.ts +56 -0
- package/src/en-ZA.js +478 -0
- package/src/es-ES.d.ts +65 -0
- package/src/es-ES.js +541 -0
- package/src/es-MX.d.ts +58 -0
- package/{lib/languages/es.js → src/es-MX.js} +228 -18
- package/src/es-US.d.ts +58 -0
- package/src/es-US.js +446 -0
- package/src/fa-IR.d.ts +38 -0
- package/src/fa-IR.js +246 -0
- package/src/fi-FI.d.ts +46 -0
- package/{lib/languages/fi.js → src/fi-FI.js} +152 -11
- package/src/fil-PH.d.ts +37 -0
- package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
- package/src/fr-BE.d.ts +49 -0
- package/{lib/languages → src}/fr-BE.js +175 -13
- package/src/fr-FR.d.ts +63 -0
- package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
- package/src/gu-IN.d.ts +35 -0
- package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
- package/src/ha-NG.d.ts +37 -0
- package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
- package/src/hbo-IL.d.ts +39 -0
- package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
- package/src/he-IL.d.ts +37 -0
- package/src/he-IL.js +537 -0
- package/src/hi-IN.d.ts +36 -0
- package/{lib/languages/hi.js → src/hi-IN.js} +116 -6
- package/src/hr-HR.d.ts +42 -0
- package/src/hr-HR.js +463 -0
- package/src/hu-HU.d.ts +38 -0
- package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
- package/src/id-ID.d.ts +38 -0
- package/{lib/languages/id.js → src/id-ID.js} +99 -8
- package/src/it-IT.d.ts +59 -0
- package/{lib/languages/it.js → src/it-IT.js} +179 -15
- package/src/ja-JP.d.ts +49 -0
- package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
- package/src/ka-GE.d.ts +44 -0
- package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
- package/src/kn-IN.d.ts +35 -0
- package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
- package/src/ko-KR.d.ts +45 -0
- package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
- package/src/lt-LT.d.ts +49 -0
- package/src/lt-LT.js +543 -0
- package/src/lv-LV.d.ts +49 -0
- package/src/lv-LV.js +595 -0
- package/src/mr-IN.d.ts +36 -0
- package/{lib/languages/mr.js → src/mr-IN.js} +116 -6
- package/src/ms-MY.d.ts +37 -0
- package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
- package/src/nb-NO.d.ts +44 -0
- package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
- package/src/nl-NL.d.ts +54 -0
- package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
- package/src/pa-IN.d.ts +36 -0
- package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
- package/src/pl-PL.d.ts +55 -0
- package/src/pl-PL.js +585 -0
- package/src/pt-BR.d.ts +31 -0
- package/src/pt-BR.js +534 -0
- package/src/pt-PT.d.ts +45 -0
- package/{lib/languages/pt.js → src/pt-PT.js} +234 -12
- package/src/ro-RO.d.ts +44 -0
- package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
- package/src/ru-RU.d.ts +50 -0
- package/src/ru-RU.js +535 -0
- package/src/sr-Cyrl-RS.d.ts +49 -0
- package/src/sr-Cyrl-RS.js +503 -0
- package/src/sr-Latn-RS.d.ts +49 -0
- package/src/sr-Latn-RS.js +503 -0
- package/src/sv-SE.d.ts +44 -0
- package/{lib/languages/sv.js → src/sv-SE.js} +136 -11
- package/src/sw-KE.d.ts +37 -0
- package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
- package/src/ta-IN.d.ts +35 -0
- package/{lib/languages/ta.js → src/ta-IN.js} +109 -6
- package/src/te-IN.d.ts +35 -0
- package/{lib/languages/te.js → src/te-IN.js} +115 -6
- package/src/th-TH.d.ts +38 -0
- package/{lib/languages/th.js → src/th-TH.js} +99 -6
- package/src/tr-TR.d.ts +48 -0
- package/{lib/languages/tr.js → src/tr-TR.js} +168 -23
- package/src/uk-UA.d.ts +42 -0
- package/src/uk-UA.js +463 -0
- package/src/ur-PK.d.ts +36 -0
- package/{lib/languages/ur.js → src/ur-PK.js} +116 -6
- package/src/utils/expand-scientific.d.ts +32 -0
- package/src/utils/expand-scientific.js +65 -0
- package/src/utils/parse-cardinal.d.ts +14 -0
- package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
- package/src/utils/parse-currency.d.ts +14 -0
- package/src/utils/parse-currency.js +91 -0
- package/src/utils/parse-ordinal.d.ts +10 -0
- package/src/utils/parse-ordinal.js +103 -0
- package/src/vi-VN.d.ts +48 -0
- package/{lib/languages/vi.js → src/vi-VN.js} +102 -11
- package/src/yo-NG.d.ts +37 -0
- package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
- package/src/zh-Hans-CN.d.ts +48 -0
- package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
- package/src/zh-Hant-TW.d.ts +50 -0
- package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
- package/dist/languages/am-Latn.js +0 -3
- package/dist/languages/am-Latn.js.map +0 -1
- package/dist/languages/am.js +0 -3
- package/dist/languages/am.js.map +0 -1
- package/dist/languages/ar.js +0 -3
- package/dist/languages/ar.js.map +0 -1
- package/dist/languages/az.js +0 -3
- package/dist/languages/az.js.map +0 -1
- package/dist/languages/bn.js +0 -3
- package/dist/languages/bn.js.map +0 -1
- package/dist/languages/cs.js +0 -3
- package/dist/languages/cs.js.map +0 -1
- package/dist/languages/da.js +0 -3
- package/dist/languages/da.js.map +0 -1
- package/dist/languages/de.js +0 -3
- package/dist/languages/de.js.map +0 -1
- package/dist/languages/el.js +0 -3
- package/dist/languages/el.js.map +0 -1
- package/dist/languages/en.js +0 -3
- package/dist/languages/en.js.map +0 -1
- package/dist/languages/es.js +0 -3
- package/dist/languages/es.js.map +0 -1
- package/dist/languages/fa.js +0 -3
- package/dist/languages/fa.js.map +0 -1
- package/dist/languages/fi.js +0 -3
- package/dist/languages/fi.js.map +0 -1
- package/dist/languages/fil.js +0 -3
- package/dist/languages/fil.js.map +0 -1
- package/dist/languages/fr-BE.js +0 -3
- package/dist/languages/fr-BE.js.map +0 -1
- package/dist/languages/fr.js +0 -3
- package/dist/languages/fr.js.map +0 -1
- package/dist/languages/gu.js +0 -3
- package/dist/languages/gu.js.map +0 -1
- package/dist/languages/ha.js +0 -3
- package/dist/languages/ha.js.map +0 -1
- package/dist/languages/hbo.js +0 -3
- package/dist/languages/hbo.js.map +0 -1
- package/dist/languages/he.js +0 -3
- package/dist/languages/he.js.map +0 -1
- package/dist/languages/hi.js +0 -3
- package/dist/languages/hi.js.map +0 -1
- package/dist/languages/hr.js +0 -3
- package/dist/languages/hr.js.map +0 -1
- package/dist/languages/hu.js +0 -3
- package/dist/languages/hu.js.map +0 -1
- package/dist/languages/id.js +0 -3
- package/dist/languages/id.js.map +0 -1
- package/dist/languages/it.js +0 -3
- package/dist/languages/it.js.map +0 -1
- package/dist/languages/ja.js +0 -3
- package/dist/languages/ja.js.map +0 -1
- package/dist/languages/ka.js +0 -3
- package/dist/languages/ka.js.map +0 -1
- package/dist/languages/kn.js +0 -3
- package/dist/languages/kn.js.map +0 -1
- package/dist/languages/ko.js +0 -3
- package/dist/languages/ko.js.map +0 -1
- package/dist/languages/lt.js +0 -3
- package/dist/languages/lt.js.map +0 -1
- package/dist/languages/lv.js +0 -3
- package/dist/languages/lv.js.map +0 -1
- package/dist/languages/mr.js +0 -3
- package/dist/languages/mr.js.map +0 -1
- package/dist/languages/ms.js +0 -3
- package/dist/languages/ms.js.map +0 -1
- package/dist/languages/nb.js +0 -3
- package/dist/languages/nb.js.map +0 -1
- package/dist/languages/nl.js +0 -3
- package/dist/languages/nl.js.map +0 -1
- package/dist/languages/pa.js +0 -3
- package/dist/languages/pa.js.map +0 -1
- package/dist/languages/pl.js +0 -3
- package/dist/languages/pl.js.map +0 -1
- package/dist/languages/pt.js +0 -3
- package/dist/languages/pt.js.map +0 -1
- package/dist/languages/ro.js +0 -3
- package/dist/languages/ro.js.map +0 -1
- package/dist/languages/ru.js +0 -3
- package/dist/languages/ru.js.map +0 -1
- package/dist/languages/sr-Cyrl.js +0 -3
- package/dist/languages/sr-Cyrl.js.map +0 -1
- package/dist/languages/sr-Latn.js +0 -3
- package/dist/languages/sr-Latn.js.map +0 -1
- package/dist/languages/sv.js +0 -3
- package/dist/languages/sv.js.map +0 -1
- package/dist/languages/sw.js +0 -3
- package/dist/languages/sw.js.map +0 -1
- package/dist/languages/ta.js +0 -3
- package/dist/languages/ta.js.map +0 -1
- package/dist/languages/te.js +0 -3
- package/dist/languages/te.js.map +0 -1
- package/dist/languages/th.js +0 -3
- package/dist/languages/th.js.map +0 -1
- package/dist/languages/tr.js +0 -3
- package/dist/languages/tr.js.map +0 -1
- package/dist/languages/uk.js +0 -3
- package/dist/languages/uk.js.map +0 -1
- package/dist/languages/ur.js +0 -3
- package/dist/languages/ur.js.map +0 -1
- package/dist/languages/vi.js +0 -3
- package/dist/languages/vi.js.map +0 -1
- package/dist/languages/yo.js +0 -3
- package/dist/languages/yo.js.map +0 -1
- package/dist/languages/zh-Hans.js +0 -3
- package/dist/languages/zh-Hans.js.map +0 -1
- package/dist/languages/zh-Hant.js +0 -3
- package/dist/languages/zh-Hant.js.map +0 -1
- package/dist/n2words.js +0 -3
- package/dist/n2words.js.map +0 -1
- package/lib/languages/am-Latn.d.ts +0 -7
- package/lib/languages/am-Latn.js +0 -159
- package/lib/languages/am.d.ts +0 -7
- package/lib/languages/am.js +0 -159
- package/lib/languages/ar.d.ts +0 -17
- package/lib/languages/az.d.ts +0 -7
- package/lib/languages/az.js +0 -171
- package/lib/languages/bn.d.ts +0 -7
- package/lib/languages/cs.d.ts +0 -18
- package/lib/languages/da.d.ts +0 -14
- package/lib/languages/de.d.ts +0 -17
- package/lib/languages/de.js +0 -320
- package/lib/languages/el.d.ts +0 -14
- package/lib/languages/el.js +0 -236
- package/lib/languages/en.d.ts +0 -17
- package/lib/languages/es.d.ts +0 -21
- package/lib/languages/fa.d.ts +0 -7
- package/lib/languages/fa.js +0 -134
- package/lib/languages/fi.d.ts +0 -14
- package/lib/languages/fil.d.ts +0 -7
- package/lib/languages/fr-BE.d.ts +0 -11
- package/lib/languages/fr.d.ts +0 -21
- package/lib/languages/gu.d.ts +0 -7
- package/lib/languages/ha.d.ts +0 -7
- package/lib/languages/hbo.d.ts +0 -13
- package/lib/languages/he.d.ts +0 -13
- package/lib/languages/he.js +0 -265
- package/lib/languages/hi.d.ts +0 -7
- package/lib/languages/hr.d.ts +0 -11
- package/lib/languages/hr.js +0 -224
- package/lib/languages/hu.d.ts +0 -7
- package/lib/languages/id.d.ts +0 -7
- package/lib/languages/it.d.ts +0 -19
- package/lib/languages/ja.d.ts +0 -17
- package/lib/languages/ka.d.ts +0 -17
- package/lib/languages/kn.d.ts +0 -7
- package/lib/languages/ko.d.ts +0 -14
- package/lib/languages/lt.d.ts +0 -18
- package/lib/languages/lt.js +0 -301
- package/lib/languages/lv.d.ts +0 -18
- package/lib/languages/lv.js +0 -312
- package/lib/languages/mr.d.ts +0 -7
- package/lib/languages/ms.d.ts +0 -7
- package/lib/languages/nb.d.ts +0 -14
- package/lib/languages/nl.d.ts +0 -26
- package/lib/languages/pa.d.ts +0 -7
- package/lib/languages/pl.d.ts +0 -22
- package/lib/languages/pl.js +0 -317
- package/lib/languages/pt.d.ts +0 -17
- package/lib/languages/ro.d.ts +0 -18
- package/lib/languages/ru.d.ts +0 -11
- package/lib/languages/ru.js +0 -245
- package/lib/languages/sr-Cyrl.d.ts +0 -11
- package/lib/languages/sr-Cyrl.js +0 -221
- package/lib/languages/sr-Latn.d.ts +0 -11
- package/lib/languages/sr-Latn.js +0 -221
- package/lib/languages/sv.d.ts +0 -14
- package/lib/languages/sw.d.ts +0 -7
- package/lib/languages/ta.d.ts +0 -7
- package/lib/languages/te.d.ts +0 -7
- package/lib/languages/th.d.ts +0 -7
- package/lib/languages/tr.d.ts +0 -18
- package/lib/languages/uk.d.ts +0 -11
- package/lib/languages/uk.js +0 -224
- package/lib/languages/ur.d.ts +0 -7
- package/lib/languages/vi.d.ts +0 -17
- package/lib/languages/yo.d.ts +0 -7
- package/lib/languages/zh-Hans.d.ts +0 -11
- package/lib/languages/zh-Hant.d.ts +0 -11
- package/lib/n2words.d.ts +0 -55
- package/lib/n2words.js +0 -126
- package/lib/utils/parse-numeric.d.ts +0 -17
- /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
- /package/{lib → src}/utils/is-plain-object.js +0 -0
- /package/{lib → src}/utils/validate-options.d.ts +0 -0
- /package/{lib → src}/utils/validate-options.js +0 -0
package/src/es-US.js
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spanish (United States) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: es-US | Spanish as used in the United States
|
|
5
|
+
*
|
|
6
|
+
* Uses the short scale numbering system (like US English):
|
|
7
|
+
* - 10⁶ = millón
|
|
8
|
+
* - 10⁹ = billón (billion)
|
|
9
|
+
* - 10¹² = trillón (trillion)
|
|
10
|
+
*
|
|
11
|
+
* Spanish-specific rules:
|
|
12
|
+
* - Gender agreement: uno/una, veintiuno/veintiuna, hundreds
|
|
13
|
+
* - Special twenties: veinte, veintiuno, veintidós, ... veintinueve
|
|
14
|
+
* - "y" conjunction: treinta y uno (only 30-99 with ones)
|
|
15
|
+
* - "cien" for exact 100, "ciento/cienta" otherwise
|
|
16
|
+
* - Irregular hundreds: quinientos, setecientos, novecientos
|
|
17
|
+
* - "un" before millón (not "uno"), omit before mil
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
21
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
22
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
23
|
+
import { validateOptions } from './utils/validate-options.js'
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Vocabulary (module-level constants)
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
const ONES_MASC = ['', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve']
|
|
30
|
+
const ONES_FEM = ['', 'una', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve']
|
|
31
|
+
|
|
32
|
+
const TEENS = ['diez', 'once', 'doce', 'trece', 'catorce', 'quince', 'dieciseis', 'diecisiete', 'dieciocho', 'diecinueve']
|
|
33
|
+
|
|
34
|
+
// 20-29 have special compound forms
|
|
35
|
+
const TWENTIES_MASC = ['veinte', 'veintiuno', 'veintidós', 'veintitrés', 'veinticuatro', 'veinticinco', 'veintiséis', 'veintisiete', 'veintiocho', 'veintinueve']
|
|
36
|
+
const TWENTIES_FEM = ['veinte', 'veintiuna', 'veintidós', 'veintitrés', 'veinticuatro', 'veinticinco', 'veintiséis', 'veintisiete', 'veintiocho', 'veintinueve']
|
|
37
|
+
|
|
38
|
+
const TENS = ['', '', '', 'treinta', 'cuarenta', 'cincuenta', 'sesenta', 'setenta', 'ochenta', 'noventa']
|
|
39
|
+
|
|
40
|
+
// Irregular hundreds
|
|
41
|
+
const HUNDREDS_MASC = ['', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos', 'quinientos', 'seiscientos', 'setecientos', 'ochocientos', 'novecientos']
|
|
42
|
+
const HUNDREDS_FEM = ['', 'cienta', 'doscientas', 'trescientas', 'cuatrocientas', 'quinientas', 'seiscientas', 'setecientas', 'ochocientas', 'novecientas']
|
|
43
|
+
|
|
44
|
+
// Scale words (short scale - each scale is 10^3 apart)
|
|
45
|
+
const SCALES = ['mil', 'millón', 'billón', 'trillón', 'cuatrillón', 'quintillón']
|
|
46
|
+
const SCALES_PLURAL = ['mil', 'millones', 'billones', 'trillones', 'cuatrillones', 'quintillones']
|
|
47
|
+
|
|
48
|
+
const ZERO = 'cero'
|
|
49
|
+
const NEGATIVE = 'menos'
|
|
50
|
+
const DECIMAL_SEP = 'punto'
|
|
51
|
+
|
|
52
|
+
// Ordinal vocabulary (identical across Spanish regions)
|
|
53
|
+
const ORDINAL_ONES_MASC = ['', 'primero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto', 'séptimo', 'octavo', 'noveno']
|
|
54
|
+
const ORDINAL_ONES_FEM = ['', 'primera', 'segunda', 'tercera', 'cuarta', 'quinta', 'sexta', 'séptima', 'octava', 'novena']
|
|
55
|
+
const ORDINAL_TENS_MASC = ['', 'décimo', 'vigésimo', 'trigésimo', 'cuadragésimo', 'quincuagésimo', 'sexagésimo', 'septuagésimo', 'octogésimo', 'nonagésimo']
|
|
56
|
+
const ORDINAL_TENS_FEM = ['', 'décima', 'vigésima', 'trigésima', 'cuadragésima', 'quincuagésima', 'sexagésima', 'septuagésima', 'octogésima', 'nonagésima']
|
|
57
|
+
const ORDINAL_HUNDRED_MASC = 'centésimo'
|
|
58
|
+
const ORDINAL_HUNDRED_FEM = 'centésima'
|
|
59
|
+
const ORDINAL_THOUSAND_MASC = 'milésimo'
|
|
60
|
+
const ORDINAL_THOUSAND_FEM = 'milésima'
|
|
61
|
+
const ORDINAL_MILLION_MASC = 'millonésimo'
|
|
62
|
+
const ORDINAL_MILLION_FEM = 'millonésima'
|
|
63
|
+
|
|
64
|
+
// Currency vocabulary (US Dollar - USD)
|
|
65
|
+
const DOLAR = 'dólar'
|
|
66
|
+
const DOLARES = 'dólares'
|
|
67
|
+
const CENTAVO = 'centavo'
|
|
68
|
+
const CENTAVOS = 'centavos'
|
|
69
|
+
const CURRENCY_CONNECTOR = 'con'
|
|
70
|
+
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Segment Building
|
|
73
|
+
// ============================================================================
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Builds segment word for 0-999.
|
|
77
|
+
* @param {number} n - Segment value
|
|
78
|
+
* @param {boolean} feminine - Use feminine forms
|
|
79
|
+
* @returns {string} Spanish word
|
|
80
|
+
*/
|
|
81
|
+
function buildSegment (n, feminine) {
|
|
82
|
+
if (n === 0) return ''
|
|
83
|
+
|
|
84
|
+
// Special case: exact 100 is "cien" (no gender)
|
|
85
|
+
if (n === 100) return 'cien'
|
|
86
|
+
|
|
87
|
+
const ones = n % 10
|
|
88
|
+
const tens = Math.trunc(n / 10) % 10
|
|
89
|
+
const hundreds = Math.trunc(n / 100)
|
|
90
|
+
const tensOnes = n % 100
|
|
91
|
+
|
|
92
|
+
const parts = []
|
|
93
|
+
|
|
94
|
+
// Hundreds
|
|
95
|
+
if (hundreds > 0) {
|
|
96
|
+
const hundredsArr = feminine ? HUNDREDS_FEM : HUNDREDS_MASC
|
|
97
|
+
parts.push(hundredsArr[hundreds])
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Tens and ones
|
|
101
|
+
if (tensOnes === 0) {
|
|
102
|
+
// Just hundreds
|
|
103
|
+
} else if (tensOnes < 10) {
|
|
104
|
+
// Single digit
|
|
105
|
+
const onesArr = feminine ? ONES_FEM : ONES_MASC
|
|
106
|
+
parts.push(onesArr[tensOnes])
|
|
107
|
+
} else if (tensOnes < 20) {
|
|
108
|
+
// 10-19: teens
|
|
109
|
+
parts.push(TEENS[ones])
|
|
110
|
+
} else if (tensOnes < 30) {
|
|
111
|
+
// 20-29: special twenties
|
|
112
|
+
const twentiesArr = feminine ? TWENTIES_FEM : TWENTIES_MASC
|
|
113
|
+
parts.push(twentiesArr[ones])
|
|
114
|
+
} else {
|
|
115
|
+
// 30-99: tens y ones
|
|
116
|
+
if (ones === 0) {
|
|
117
|
+
parts.push(TENS[tens])
|
|
118
|
+
} else {
|
|
119
|
+
const onesArr = feminine ? ONES_FEM : ONES_MASC
|
|
120
|
+
parts.push(TENS[tens] + ' y ' + onesArr[ones])
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return parts.join(' ')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// Conversion Functions
|
|
129
|
+
// ============================================================================
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Converts a non-negative integer to Spanish words (short scale).
|
|
133
|
+
*
|
|
134
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
135
|
+
* @param {boolean} feminine - Use feminine forms
|
|
136
|
+
* @returns {string} Spanish words
|
|
137
|
+
*/
|
|
138
|
+
function integerToWords (n, feminine) {
|
|
139
|
+
if (n === 0n) return ZERO
|
|
140
|
+
|
|
141
|
+
// Fast path: numbers < 1000
|
|
142
|
+
if (n < 1000n) {
|
|
143
|
+
return buildSegment(Number(n), feminine)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Extract segments using BigInt division
|
|
147
|
+
// Each segment is 3 digits, short scale increments by 10^3
|
|
148
|
+
const segmentValues = []
|
|
149
|
+
let temp = n
|
|
150
|
+
while (temp > 0n) {
|
|
151
|
+
segmentValues.push(temp % 1000n)
|
|
152
|
+
temp = temp / 1000n
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Build result string
|
|
156
|
+
let result = ''
|
|
157
|
+
|
|
158
|
+
for (let i = segmentValues.length - 1; i >= 0; i--) {
|
|
159
|
+
const segment = segmentValues[i]
|
|
160
|
+
if (segment === 0n) continue
|
|
161
|
+
|
|
162
|
+
if (result) result += ' '
|
|
163
|
+
|
|
164
|
+
if (i === 0) {
|
|
165
|
+
// Units segment - use requested gender
|
|
166
|
+
result += buildSegment(Number(segment), feminine)
|
|
167
|
+
} else if (i === 1) {
|
|
168
|
+
// Thousands: "mil" not "uno mil"
|
|
169
|
+
if (segment === 1n) {
|
|
170
|
+
result += SCALES[0]
|
|
171
|
+
} else {
|
|
172
|
+
result += buildSegment(Number(segment), false) + ' ' + SCALES[0]
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
// Millions and above: "un millón", "dos millones", etc.
|
|
176
|
+
const scaleIndex = i - 1 // SCALES[1] = millón, SCALES[2] = billón, etc.
|
|
177
|
+
if (scaleIndex >= SCALES.length) {
|
|
178
|
+
// Beyond our scale vocabulary
|
|
179
|
+
result += buildSegment(Number(segment), false)
|
|
180
|
+
} else if (segment === 1n) {
|
|
181
|
+
// "un millón" not "uno millón"
|
|
182
|
+
result += 'un ' + SCALES[scaleIndex]
|
|
183
|
+
} else {
|
|
184
|
+
result += buildSegment(Number(segment), false) + ' ' + SCALES_PLURAL[scaleIndex]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return result
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Converts decimal digits to Spanish words.
|
|
194
|
+
*
|
|
195
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
196
|
+
* @param {boolean} feminine - Use feminine forms
|
|
197
|
+
* @returns {string} Spanish words for decimal part
|
|
198
|
+
*/
|
|
199
|
+
function decimalPartToWords (decimalPart, feminine) {
|
|
200
|
+
let result = ''
|
|
201
|
+
|
|
202
|
+
// Handle leading zeros
|
|
203
|
+
let i = 0
|
|
204
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
205
|
+
if (result) result += ' '
|
|
206
|
+
result += ZERO
|
|
207
|
+
i++
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Convert remainder as a single number
|
|
211
|
+
const remainder = decimalPart.slice(i)
|
|
212
|
+
if (remainder) {
|
|
213
|
+
if (result) result += ' '
|
|
214
|
+
result += integerToWords(BigInt(remainder), feminine)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return result
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Converts a numeric value to Spanish words (US short scale).
|
|
222
|
+
*
|
|
223
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
224
|
+
* @param {Object} [options] - Optional configuration
|
|
225
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
226
|
+
* @returns {string} The number in Spanish words
|
|
227
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
228
|
+
* @throws {Error} If value is not a valid number format
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* toCardinal(21) // 'veintiuno'
|
|
232
|
+
* toCardinal(21, {gender: 'feminine'}) // 'veintiuna'
|
|
233
|
+
* toCardinal(1000000000) // 'un billón'
|
|
234
|
+
*/
|
|
235
|
+
function toCardinal (value, options) {
|
|
236
|
+
options = validateOptions(options)
|
|
237
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
238
|
+
|
|
239
|
+
// Apply option defaults
|
|
240
|
+
const { gender = 'masculine' } = options
|
|
241
|
+
const feminine = gender === 'feminine'
|
|
242
|
+
|
|
243
|
+
let result = ''
|
|
244
|
+
|
|
245
|
+
if (isNegative) {
|
|
246
|
+
result = NEGATIVE + ' '
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
result += integerToWords(integerPart, feminine)
|
|
250
|
+
|
|
251
|
+
if (decimalPart) {
|
|
252
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, feminine)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return result
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// ORDINAL: toOrdinal(value, options?)
|
|
260
|
+
// ============================================================================
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Builds ordinal word for a 0-999 segment.
|
|
264
|
+
*
|
|
265
|
+
* @param {number} n - Segment value 0-999
|
|
266
|
+
* @param {boolean} feminine - Use feminine forms
|
|
267
|
+
* @returns {string} Spanish ordinal word
|
|
268
|
+
*/
|
|
269
|
+
function buildOrdinalSegment (n, feminine) {
|
|
270
|
+
if (n === 0) return ''
|
|
271
|
+
|
|
272
|
+
const ones = n % 10
|
|
273
|
+
const tens = Math.trunc(n / 10) % 10
|
|
274
|
+
const hundreds = Math.trunc(n / 100)
|
|
275
|
+
|
|
276
|
+
const onesArr = feminine ? ORDINAL_ONES_FEM : ORDINAL_ONES_MASC
|
|
277
|
+
const tensArr = feminine ? ORDINAL_TENS_FEM : ORDINAL_TENS_MASC
|
|
278
|
+
const hundredWord = feminine ? ORDINAL_HUNDRED_FEM : ORDINAL_HUNDRED_MASC
|
|
279
|
+
|
|
280
|
+
const parts = []
|
|
281
|
+
|
|
282
|
+
// Hundreds
|
|
283
|
+
if (hundreds > 0) {
|
|
284
|
+
if (hundreds === 1) {
|
|
285
|
+
parts.push(hundredWord)
|
|
286
|
+
} else {
|
|
287
|
+
const prefixes = ['', '', 'du', 'tri', 'cuadri', 'quin', 'sex', 'septi', 'octi', 'noni']
|
|
288
|
+
parts.push(prefixes[hundreds] + hundredWord)
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Tens
|
|
293
|
+
if (tens > 0) {
|
|
294
|
+
parts.push(tensArr[tens])
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Ones
|
|
298
|
+
if (ones > 0) {
|
|
299
|
+
parts.push(onesArr[ones])
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return parts.join(' ')
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Converts a positive integer to Spanish ordinal words.
|
|
307
|
+
*
|
|
308
|
+
* @param {bigint} n - Positive integer to convert
|
|
309
|
+
* @param {boolean} feminine - Use feminine forms
|
|
310
|
+
* @returns {string} Spanish ordinal words
|
|
311
|
+
*/
|
|
312
|
+
function integerToOrdinal (n, feminine) {
|
|
313
|
+
const thousandWord = feminine ? ORDINAL_THOUSAND_FEM : ORDINAL_THOUSAND_MASC
|
|
314
|
+
const millionWord = feminine ? ORDINAL_MILLION_FEM : ORDINAL_MILLION_MASC
|
|
315
|
+
|
|
316
|
+
// Fast path: numbers < 1000
|
|
317
|
+
if (n < 1000n) {
|
|
318
|
+
return buildOrdinalSegment(Number(n), feminine)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Numbers 1000-999999
|
|
322
|
+
if (n < 1_000_000n) {
|
|
323
|
+
const thousands = Number(n / 1000n)
|
|
324
|
+
const remainder = Number(n % 1000n)
|
|
325
|
+
|
|
326
|
+
let result = ''
|
|
327
|
+
|
|
328
|
+
if (thousands === 1) {
|
|
329
|
+
result = thousandWord
|
|
330
|
+
} else {
|
|
331
|
+
result = buildOrdinalSegment(thousands, feminine) + ' ' + thousandWord
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (remainder > 0) {
|
|
335
|
+
result += ' ' + buildOrdinalSegment(remainder, feminine)
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return result
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Numbers >= 1,000,000
|
|
342
|
+
const millions = Number(n / 1_000_000n)
|
|
343
|
+
const remainder = n % 1_000_000n
|
|
344
|
+
|
|
345
|
+
let result = ''
|
|
346
|
+
|
|
347
|
+
if (millions === 1) {
|
|
348
|
+
result = millionWord
|
|
349
|
+
} else {
|
|
350
|
+
result = buildOrdinalSegment(millions, feminine) + ' ' + millionWord
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (remainder > 0n) {
|
|
354
|
+
result += ' ' + integerToOrdinal(remainder, feminine)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return result
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Converts a numeric value to Spanish ordinal words.
|
|
362
|
+
*
|
|
363
|
+
* @param {number | string | bigint} value - The positive integer to convert
|
|
364
|
+
* @param {Object} [options] - Optional configuration
|
|
365
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
366
|
+
* @returns {string} The number in Spanish ordinal words
|
|
367
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
368
|
+
* @throws {Error} If value is not a positive integer
|
|
369
|
+
*
|
|
370
|
+
* @example
|
|
371
|
+
* toOrdinal(1) // 'primero'
|
|
372
|
+
* toOrdinal(1, { gender: 'feminine' }) // 'primera'
|
|
373
|
+
* toOrdinal(21) // 'vigésimo primero'
|
|
374
|
+
*/
|
|
375
|
+
function toOrdinal (value, options) {
|
|
376
|
+
options = validateOptions(options)
|
|
377
|
+
const integerPart = parseOrdinalValue(value)
|
|
378
|
+
|
|
379
|
+
const { gender = 'masculine' } = options
|
|
380
|
+
const feminine = gender === 'feminine'
|
|
381
|
+
|
|
382
|
+
return integerToOrdinal(integerPart, feminine)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ============================================================================
|
|
386
|
+
// CURRENCY: toCurrency(value, options?)
|
|
387
|
+
// ============================================================================
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Converts a numeric value to US Dollar currency words in Spanish.
|
|
391
|
+
*
|
|
392
|
+
* US Dollar uses masculine gender for dólares (el dólar)
|
|
393
|
+
* and masculine for centavos (el centavo).
|
|
394
|
+
*
|
|
395
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
396
|
+
* @param {Object} [options] - Optional configuration
|
|
397
|
+
* @param {boolean} [options.and=true] - Use "con" between dollars and cents
|
|
398
|
+
* @returns {string} The amount in Spanish US Dollar currency words
|
|
399
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
400
|
+
* @throws {Error} If value is not a valid number format
|
|
401
|
+
*
|
|
402
|
+
* @example
|
|
403
|
+
* toCurrency(42.50) // 'cuarenta y dos dólares con cincuenta centavos'
|
|
404
|
+
* toCurrency(1) // 'un dólar'
|
|
405
|
+
* toCurrency(0.99) // 'noventa y nueve centavos'
|
|
406
|
+
* toCurrency(42.50, { and: false }) // 'cuarenta y dos dólares cincuenta centavos'
|
|
407
|
+
*/
|
|
408
|
+
function toCurrency (value, options) {
|
|
409
|
+
options = validateOptions(options)
|
|
410
|
+
const { isNegative, dollars, cents: centavos } = parseCurrencyValue(value)
|
|
411
|
+
const { and: useAnd = true } = options
|
|
412
|
+
|
|
413
|
+
let result = ''
|
|
414
|
+
if (isNegative) result = NEGATIVE + ' '
|
|
415
|
+
|
|
416
|
+
// Dollars part (show if non-zero, or if no centavos)
|
|
417
|
+
if (dollars > 0n || centavos === 0n) {
|
|
418
|
+
// Use masculine for dollars, but "un dólar" not "uno dólar"
|
|
419
|
+
if (dollars === 1n) {
|
|
420
|
+
result += 'un ' + DOLAR
|
|
421
|
+
} else {
|
|
422
|
+
result += integerToWords(dollars, false) + ' ' + DOLARES
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Centavos part
|
|
427
|
+
if (centavos > 0n) {
|
|
428
|
+
if (dollars > 0n) {
|
|
429
|
+
result += useAnd ? ' ' + CURRENCY_CONNECTOR + ' ' : ' '
|
|
430
|
+
}
|
|
431
|
+
// Use masculine for centavos, but "un centavo" not "uno centavo"
|
|
432
|
+
if (centavos === 1n) {
|
|
433
|
+
result += 'un ' + CENTAVO
|
|
434
|
+
} else {
|
|
435
|
+
result += integerToWords(centavos, false) + ' ' + CENTAVOS
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return result
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// ============================================================================
|
|
443
|
+
// Public API
|
|
444
|
+
// ============================================================================
|
|
445
|
+
|
|
446
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/fa-IR.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a numeric value to Persian words.
|
|
3
|
+
*
|
|
4
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
+
* @returns {string} The number in Persian words
|
|
6
|
+
*/
|
|
7
|
+
export function toCardinal(value: number | string | bigint): string;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a numeric value to Persian ordinal words.
|
|
10
|
+
*
|
|
11
|
+
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
12
|
+
* @returns {string} The number as ordinal words
|
|
13
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
14
|
+
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* toOrdinal(1) // 'اول'
|
|
18
|
+
* toOrdinal(2) // 'دوم'
|
|
19
|
+
* toOrdinal(10) // 'دهم'
|
|
20
|
+
*/
|
|
21
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
22
|
+
/**
|
|
23
|
+
* Converts a numeric value to Persian currency words (Rial).
|
|
24
|
+
*
|
|
25
|
+
* Iranian Rial has no subunit in modern usage.
|
|
26
|
+
* (Historically dinar was 1/100 rial, but not used today)
|
|
27
|
+
*
|
|
28
|
+
* @param {number | string | bigint} value - The currency amount to convert
|
|
29
|
+
* @returns {string} The amount in Persian currency words
|
|
30
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
31
|
+
* @throws {Error} If value is not a valid number format
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* toCurrency(42) // 'چهل و دو ریال'
|
|
35
|
+
* toCurrency(1000) // 'هزار ریال'
|
|
36
|
+
* toCurrency(-5) // 'منفى پنج ریال'
|
|
37
|
+
*/
|
|
38
|
+
export function toCurrency(value: number | string | bigint): string;
|