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
package/src/pt-PT.js
ADDED
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portuguese (Portugal) language converter
|
|
3
|
+
*
|
|
4
|
+
* CLDR: pt-PT | European Portuguese as used in Portugal
|
|
5
|
+
*
|
|
6
|
+
* Portuguese-specific rules:
|
|
7
|
+
* - "e" conjunction everywhere: vinte e um, cento e um, mil e um
|
|
8
|
+
* - "cem" for exact 100, "cento" for 100+ remainder
|
|
9
|
+
* - Irregular hundreds: duzentos, trezentos, quatrocentos, etc.
|
|
10
|
+
* - Long scale: milhão (10^6), mil milhões (10^9), bilião (10^12)
|
|
11
|
+
* - Omit "um" before "mil"
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
15
|
+
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
16
|
+
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
17
|
+
import { validateOptions } from './utils/validate-options.js'
|
|
18
|
+
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Vocabulary (module-level constants)
|
|
21
|
+
// ============================================================================
|
|
22
|
+
|
|
23
|
+
const ONES = ['', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove']
|
|
24
|
+
const TEENS = ['dez', 'onze', 'doze', 'treze', 'catorze', 'quinze', 'dezasseis', 'dezassete', 'dezoito', 'dezanove']
|
|
25
|
+
const TENS = ['', '', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa']
|
|
26
|
+
|
|
27
|
+
// Irregular hundreds
|
|
28
|
+
const HUNDREDS = ['', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos']
|
|
29
|
+
|
|
30
|
+
const THOUSAND = 'mil'
|
|
31
|
+
const ZERO = 'zero'
|
|
32
|
+
const NEGATIVE = 'menos'
|
|
33
|
+
const DECIMAL_SEP = 'vírgula'
|
|
34
|
+
|
|
35
|
+
// Ordinal vocabulary
|
|
36
|
+
const ORDINAL_ONES = ['', 'primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'sétimo', 'oitavo', 'nono']
|
|
37
|
+
const ORDINAL_TEENS = ['décimo', 'décimo primeiro', 'décimo segundo', 'décimo terceiro', 'décimo quarto', 'décimo quinto', 'décimo sexto', 'décimo sétimo', 'décimo oitavo', 'décimo nono']
|
|
38
|
+
const ORDINAL_TENS = ['', '', 'vigésimo', 'trigésimo', 'quadragésimo', 'quinquagésimo', 'sexagésimo', 'septuagésimo', 'octogésimo', 'nonagésimo']
|
|
39
|
+
const ORDINAL_HUNDREDS = ['', 'centésimo', 'ducentésimo', 'tricentésimo', 'quadringentésimo', 'quingentésimo', 'sexcentésimo', 'septingentésimo', 'octingentésimo', 'nongentésimo']
|
|
40
|
+
|
|
41
|
+
// Currency vocabulary (Euro)
|
|
42
|
+
const EURO = 'euro'
|
|
43
|
+
const EUROS = 'euros'
|
|
44
|
+
const CENTIMO = 'cêntimo'
|
|
45
|
+
const CENTIMOS = 'cêntimos'
|
|
46
|
+
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Segment Building
|
|
49
|
+
// ============================================================================
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Builds segment word for 0-999 with Portuguese "e" rules.
|
|
53
|
+
* Returns the word and whether it's an exact hundred (for "cem" handling).
|
|
54
|
+
*/
|
|
55
|
+
function buildSegment (n) {
|
|
56
|
+
if (n === 0) return { word: '', isExactHundred: false }
|
|
57
|
+
|
|
58
|
+
// Special case: exact 100 is "cem"
|
|
59
|
+
if (n === 100) return { word: 'cem', isExactHundred: true }
|
|
60
|
+
|
|
61
|
+
const ones = n % 10
|
|
62
|
+
const tens = Math.trunc(n / 10) % 10
|
|
63
|
+
const hundreds = Math.trunc(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 if (tens >= 2) {
|
|
77
|
+
if (ones > 0) {
|
|
78
|
+
// Tens + ones with "e": "vinte e um"
|
|
79
|
+
parts.push(TENS[tens] + ' e ' + ONES[ones])
|
|
80
|
+
} else {
|
|
81
|
+
parts.push(TENS[tens])
|
|
82
|
+
}
|
|
83
|
+
} else if (ones > 0) {
|
|
84
|
+
parts.push(ONES[ones])
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Join hundreds with "e": "cento e um", "duzentos e trinta e um"
|
|
88
|
+
const word = parts.join(' e ')
|
|
89
|
+
|
|
90
|
+
return { word, isExactHundred: hundreds > 0 && tens === 0 && ones === 0, startsWithHundreds: n >= 100 }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// Scale Word Lookup
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
// Precompute scale words for singular and plural forms
|
|
98
|
+
// Index 1 = thousands, 2 = millions, 3 = billions (mil milhões), etc.
|
|
99
|
+
const SCALE_WORDS_SINGULAR = [
|
|
100
|
+
'', // 0 unused
|
|
101
|
+
THOUSAND, // 1: mil
|
|
102
|
+
'milhão', // 2: 10^6
|
|
103
|
+
'mil milhões', // 3: 10^9 (compound)
|
|
104
|
+
'bilião', // 4: 10^12
|
|
105
|
+
'mil biliões', // 5: 10^15 (compound)
|
|
106
|
+
'trilião', // 6: 10^18
|
|
107
|
+
'mil triliões', // 7: 10^21 (compound)
|
|
108
|
+
'quatrilião' // 8: 10^24
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
const SCALE_WORDS_PLURAL = [
|
|
112
|
+
'', // 0 unused
|
|
113
|
+
THOUSAND, // 1: mil (same)
|
|
114
|
+
'milhões', // 2: 10^6
|
|
115
|
+
'mil milhões', // 3: 10^9 (compound, same)
|
|
116
|
+
'biliões', // 4: 10^12
|
|
117
|
+
'mil biliões', // 5: 10^15 (compound, same)
|
|
118
|
+
'triliões', // 6: 10^18
|
|
119
|
+
'mil triliões', // 7: 10^21 (compound, same)
|
|
120
|
+
'quatriliões' // 8: 10^24
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// Conversion Functions
|
|
125
|
+
// ============================================================================
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Converts a non-negative integer to Portuguese words.
|
|
129
|
+
*
|
|
130
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
131
|
+
* @returns {string} Portuguese words
|
|
132
|
+
*/
|
|
133
|
+
function integerToWords (n) {
|
|
134
|
+
if (n === 0n) return ZERO
|
|
135
|
+
|
|
136
|
+
// Fast path: numbers < 1000
|
|
137
|
+
if (n < 1000n) {
|
|
138
|
+
return buildSegment(Number(n)).word
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Fast path: numbers < 1,000,000 (thousands)
|
|
142
|
+
if (n < 1_000_000n) {
|
|
143
|
+
const thousands = Number(n / 1000n)
|
|
144
|
+
const remainder = Number(n % 1000n)
|
|
145
|
+
|
|
146
|
+
let result
|
|
147
|
+
if (thousands === 1) {
|
|
148
|
+
// "mil" not "um mil"
|
|
149
|
+
result = THOUSAND
|
|
150
|
+
} else {
|
|
151
|
+
result = buildSegment(thousands).word + ' ' + THOUSAND
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (remainder > 0) {
|
|
155
|
+
const remainderResult = buildSegment(remainder)
|
|
156
|
+
// Insert "e" before remainder if it doesn't start with hundreds (< 100)
|
|
157
|
+
if (!remainderResult.startsWithHundreds) {
|
|
158
|
+
result += ' e ' + remainderResult.word
|
|
159
|
+
} else {
|
|
160
|
+
result += ' ' + remainderResult.word
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return result
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// For numbers >= 1,000,000, use scale decomposition
|
|
168
|
+
return buildLargeNumberWords(n)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Builds words for numbers >= 1,000,000.
|
|
173
|
+
* Uses BigInt division for faster segment extraction.
|
|
174
|
+
*
|
|
175
|
+
* @param {bigint} n - Number >= 1,000,000
|
|
176
|
+
* @returns {string} Portuguese words
|
|
177
|
+
*/
|
|
178
|
+
function buildLargeNumberWords (n) {
|
|
179
|
+
// Extract segments using BigInt division
|
|
180
|
+
// Segments stored least-significant first (index 0 = ones, 1 = thousands, etc.)
|
|
181
|
+
const segments = []
|
|
182
|
+
let temp = n
|
|
183
|
+
while (temp > 0n) {
|
|
184
|
+
segments.push(Number(temp % 1000n))
|
|
185
|
+
temp = temp / 1000n
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Find the first non-zero segment index (lowest scale with value)
|
|
189
|
+
let firstNonZeroIdx = 0
|
|
190
|
+
for (let i = 0; i < segments.length; i++) {
|
|
191
|
+
if (segments[i] !== 0) {
|
|
192
|
+
firstNonZeroIdx = i
|
|
193
|
+
break
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Build result string directly
|
|
198
|
+
let result = ''
|
|
199
|
+
let prevWasScale = false
|
|
200
|
+
|
|
201
|
+
for (let i = segments.length - 1; i >= 0; i--) {
|
|
202
|
+
const segment = segments[i]
|
|
203
|
+
if (segment === 0) continue
|
|
204
|
+
|
|
205
|
+
const segmentResult = buildSegment(segment)
|
|
206
|
+
const isLastSegment = (i === firstNonZeroIdx)
|
|
207
|
+
|
|
208
|
+
// Add "e" before final segment if previous was scale and this doesn't start with hundreds
|
|
209
|
+
if (result && isLastSegment && prevWasScale && !segmentResult.startsWithHundreds) {
|
|
210
|
+
result += ' e'
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (result) result += ' '
|
|
214
|
+
|
|
215
|
+
if (i === 0) {
|
|
216
|
+
// Units segment
|
|
217
|
+
result += segmentResult.word
|
|
218
|
+
prevWasScale = false
|
|
219
|
+
} else if (i === 1) {
|
|
220
|
+
// Thousands
|
|
221
|
+
if (segment === 1) {
|
|
222
|
+
result += THOUSAND
|
|
223
|
+
} else {
|
|
224
|
+
result += segmentResult.word + ' ' + THOUSAND
|
|
225
|
+
}
|
|
226
|
+
prevWasScale = true
|
|
227
|
+
} else {
|
|
228
|
+
// Million and above - use scale arrays
|
|
229
|
+
const scaleWord = segment === 1 ? SCALE_WORDS_SINGULAR[i] : SCALE_WORDS_PLURAL[i]
|
|
230
|
+
if (segment === 1) {
|
|
231
|
+
result += 'um ' + scaleWord
|
|
232
|
+
} else {
|
|
233
|
+
result += segmentResult.word + ' ' + scaleWord
|
|
234
|
+
}
|
|
235
|
+
prevWasScale = true
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return result
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Converts decimal digits to Portuguese words.
|
|
244
|
+
*
|
|
245
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
246
|
+
* @returns {string} Portuguese words for decimal part
|
|
247
|
+
*/
|
|
248
|
+
function decimalPartToWords (decimalPart) {
|
|
249
|
+
let result = ''
|
|
250
|
+
|
|
251
|
+
// Handle leading zeros
|
|
252
|
+
let i = 0
|
|
253
|
+
while (i < decimalPart.length && decimalPart[i] === '0') {
|
|
254
|
+
if (result) result += ' '
|
|
255
|
+
result += ZERO
|
|
256
|
+
i++
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Convert remainder as a single number
|
|
260
|
+
const remainder = decimalPart.slice(i)
|
|
261
|
+
if (remainder) {
|
|
262
|
+
if (result) result += ' '
|
|
263
|
+
result += integerToWords(BigInt(remainder))
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return result
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Converts a numeric value to Portuguese words.
|
|
271
|
+
*
|
|
272
|
+
* This is the main public API. It accepts any valid numeric input
|
|
273
|
+
* (number, string, or bigint) and handles parsing internally.
|
|
274
|
+
*
|
|
275
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
276
|
+
* @returns {string} The number in Portuguese words
|
|
277
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
278
|
+
* @throws {Error} If value is not a valid number format
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* toCardinal(21) // 'vinte e um'
|
|
282
|
+
* toCardinal(100) // 'cem'
|
|
283
|
+
* toCardinal(1000000) // 'um milhão'
|
|
284
|
+
*/
|
|
285
|
+
function toCardinal (value) {
|
|
286
|
+
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
287
|
+
|
|
288
|
+
let result = ''
|
|
289
|
+
|
|
290
|
+
if (isNegative) {
|
|
291
|
+
result = NEGATIVE + ' '
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
result += integerToWords(integerPart)
|
|
295
|
+
|
|
296
|
+
if (decimalPart) {
|
|
297
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return result
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ============================================================================
|
|
304
|
+
// Ordinal Functions
|
|
305
|
+
// ============================================================================
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Builds ordinal words for 0-999.
|
|
309
|
+
*
|
|
310
|
+
* @param {number} n - Number 0-999
|
|
311
|
+
* @returns {string} Portuguese ordinal words
|
|
312
|
+
*/
|
|
313
|
+
function buildOrdinalSegment (n) {
|
|
314
|
+
if (n === 0) return ''
|
|
315
|
+
|
|
316
|
+
const ones = n % 10
|
|
317
|
+
const tens = Math.trunc(n / 10) % 10
|
|
318
|
+
const hundreds = Math.trunc(n / 100)
|
|
319
|
+
|
|
320
|
+
const parts = []
|
|
321
|
+
|
|
322
|
+
// Hundreds ordinal
|
|
323
|
+
if (hundreds > 0) {
|
|
324
|
+
parts.push(ORDINAL_HUNDREDS[hundreds])
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Tens and ones
|
|
328
|
+
if (tens === 1) {
|
|
329
|
+
// 10-19: use teens array (décimo, décimo primeiro, etc.)
|
|
330
|
+
parts.push(ORDINAL_TEENS[ones])
|
|
331
|
+
} else if (tens >= 2) {
|
|
332
|
+
parts.push(ORDINAL_TENS[tens])
|
|
333
|
+
if (ones > 0) {
|
|
334
|
+
parts.push(ORDINAL_ONES[ones])
|
|
335
|
+
}
|
|
336
|
+
} else if (ones > 0) {
|
|
337
|
+
parts.push(ORDINAL_ONES[ones])
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return parts.join(' ')
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Builds ordinal words for large numbers.
|
|
345
|
+
*
|
|
346
|
+
* @param {bigint} n - Non-negative integer
|
|
347
|
+
* @returns {string} Portuguese ordinal words
|
|
348
|
+
*/
|
|
349
|
+
function buildLargeOrdinal (n) {
|
|
350
|
+
// Extract segments
|
|
351
|
+
const segments = []
|
|
352
|
+
let temp = n
|
|
353
|
+
while (temp > 0n) {
|
|
354
|
+
segments.push(Number(temp % 1000n))
|
|
355
|
+
temp = temp / 1000n
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Find the lowest non-zero segment (index 0 = units, lowest scale)
|
|
359
|
+
let lowestNonZeroIdx = 0
|
|
360
|
+
for (let i = 0; i < segments.length; i++) {
|
|
361
|
+
if (segments[i] !== 0) {
|
|
362
|
+
lowestNonZeroIdx = i
|
|
363
|
+
break
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Scale ordinal words (singular forms)
|
|
368
|
+
const SCALE_ORDINAL = ['', 'milésimo', 'milionésimo', 'mil milionésimo', 'bilionésimo', 'mil bilionésimo', 'trilionésimo']
|
|
369
|
+
|
|
370
|
+
let result = ''
|
|
371
|
+
|
|
372
|
+
for (let i = segments.length - 1; i >= 0; i--) {
|
|
373
|
+
const segment = segments[i]
|
|
374
|
+
if (segment === 0) continue
|
|
375
|
+
|
|
376
|
+
if (result) result += ' '
|
|
377
|
+
|
|
378
|
+
if (i === lowestNonZeroIdx) {
|
|
379
|
+
// Last non-zero segment gets ordinal form
|
|
380
|
+
if (i === 0) {
|
|
381
|
+
// Units: just ordinal
|
|
382
|
+
result += buildOrdinalSegment(segment)
|
|
383
|
+
} else if (segment === 1 && i > 0) {
|
|
384
|
+
// Exact scale: "milésimo", "milionésimo", etc.
|
|
385
|
+
result += SCALE_ORDINAL[i]
|
|
386
|
+
} else {
|
|
387
|
+
// Segment + scale ordinal
|
|
388
|
+
result += buildOrdinalSegment(segment) + ' ' + SCALE_ORDINAL[i]
|
|
389
|
+
}
|
|
390
|
+
} else {
|
|
391
|
+
// Higher segments use cardinal form
|
|
392
|
+
if (i === 0) {
|
|
393
|
+
result += buildSegment(segment).word
|
|
394
|
+
} else if (i === 1) {
|
|
395
|
+
if (segment === 1) {
|
|
396
|
+
result += THOUSAND
|
|
397
|
+
} else {
|
|
398
|
+
result += buildSegment(segment).word + ' ' + THOUSAND
|
|
399
|
+
}
|
|
400
|
+
} else {
|
|
401
|
+
const scaleWord = segment === 1 ? SCALE_WORDS_SINGULAR[i] : SCALE_WORDS_PLURAL[i]
|
|
402
|
+
if (segment === 1) {
|
|
403
|
+
result += 'um ' + scaleWord
|
|
404
|
+
} else {
|
|
405
|
+
result += buildSegment(segment).word + ' ' + scaleWord
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return result
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Converts a number to Portuguese ordinal words.
|
|
416
|
+
*
|
|
417
|
+
* @param {number | string | bigint} value - The number to convert
|
|
418
|
+
* @returns {string} Portuguese ordinal words
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* toOrdinal(1) // 'primeiro'
|
|
422
|
+
* toOrdinal(21) // 'vigésimo primeiro'
|
|
423
|
+
* toOrdinal(100) // 'centésimo'
|
|
424
|
+
*/
|
|
425
|
+
function toOrdinal (value) {
|
|
426
|
+
const n = parseOrdinalValue(value)
|
|
427
|
+
|
|
428
|
+
// Fast path: 1-9
|
|
429
|
+
if (n < 10n) {
|
|
430
|
+
return ORDINAL_ONES[Number(n)]
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Fast path: 10-19
|
|
434
|
+
if (n < 20n) {
|
|
435
|
+
return ORDINAL_TEENS[Number(n) - 10]
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Fast path: 20-99
|
|
439
|
+
if (n < 100n) {
|
|
440
|
+
const ones = Number(n % 10n)
|
|
441
|
+
const tens = Number(n / 10n)
|
|
442
|
+
if (ones === 0) {
|
|
443
|
+
return ORDINAL_TENS[tens]
|
|
444
|
+
}
|
|
445
|
+
return ORDINAL_TENS[tens] + ' ' + ORDINAL_ONES[ones]
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Fast path: 100-999
|
|
449
|
+
if (n < 1000n) {
|
|
450
|
+
return buildOrdinalSegment(Number(n))
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Large numbers
|
|
454
|
+
return buildLargeOrdinal(n)
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// ============================================================================
|
|
458
|
+
// Currency Functions
|
|
459
|
+
// ============================================================================
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Converts a number to Portuguese currency words (Euro).
|
|
463
|
+
*
|
|
464
|
+
* @param {number | string | bigint} value - The amount to convert
|
|
465
|
+
* @param {Object} [options]
|
|
466
|
+
* @param {boolean} [options.and=true] - Include "e" between euros and cents
|
|
467
|
+
* @returns {string} Portuguese currency words
|
|
468
|
+
*
|
|
469
|
+
* @example
|
|
470
|
+
* toCurrency(42.50) // 'quarenta e dois euros e cinquenta cêntimos'
|
|
471
|
+
* toCurrency(1) // 'um euro'
|
|
472
|
+
* toCurrency(0.01) // 'um cêntimo'
|
|
473
|
+
*/
|
|
474
|
+
function toCurrency (value, options) {
|
|
475
|
+
options = validateOptions(options)
|
|
476
|
+
const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
|
|
477
|
+
const { and = true } = options
|
|
478
|
+
|
|
479
|
+
let result = ''
|
|
480
|
+
|
|
481
|
+
if (isNegative) {
|
|
482
|
+
result = NEGATIVE + ' '
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const hasEuros = euros > 0n
|
|
486
|
+
const hasCents = cents > 0n
|
|
487
|
+
|
|
488
|
+
if (!hasEuros && !hasCents) {
|
|
489
|
+
return ZERO + ' ' + EUROS
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
if (hasEuros) {
|
|
493
|
+
const euroWords = integerToWords(euros)
|
|
494
|
+
const euroUnit = euros === 1n ? EURO : EUROS
|
|
495
|
+
result += euroWords + ' ' + euroUnit
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (hasCents) {
|
|
499
|
+
if (hasEuros) {
|
|
500
|
+
result += and ? ' e ' : ' '
|
|
501
|
+
}
|
|
502
|
+
const centWords = integerToWords(cents)
|
|
503
|
+
const centUnit = cents === 1n ? CENTIMO : CENTIMOS
|
|
504
|
+
result += centWords + ' ' + centUnit
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
return result
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// ============================================================================
|
|
511
|
+
// Public API
|
|
512
|
+
// ============================================================================
|
|
513
|
+
|
|
514
|
+
export { toCardinal, toOrdinal, toCurrency }
|
package/src/ro-RO.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
* toCardinal(21) // 'douăzeci și unu'
|
|
13
|
+
* toCardinal(1, { gender: 'feminine' }) // 'una'
|
|
14
|
+
* toCardinal(1000) // 'o mie'
|
|
15
|
+
*/
|
|
16
|
+
export function toCardinal(value: number | string | bigint, options?: {
|
|
17
|
+
gender?: string | undefined;
|
|
18
|
+
}): string;
|
|
19
|
+
/**
|
|
20
|
+
* Converts a numeric value to Romanian ordinal words.
|
|
21
|
+
*
|
|
22
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
23
|
+
* @returns {string} The ordinal in Romanian words
|
|
24
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
25
|
+
* @throws {Error} If value is not a positive integer
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* toOrdinal(1) // 'primul'
|
|
29
|
+
* toOrdinal(21) // 'douăzeci și primul'
|
|
30
|
+
*/
|
|
31
|
+
export function toOrdinal(value: number | string | bigint): string;
|
|
32
|
+
/**
|
|
33
|
+
* Converts a numeric value to Romanian Leu currency words.
|
|
34
|
+
*
|
|
35
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
36
|
+
* @returns {string} The currency in Romanian words
|
|
37
|
+
* @throws {TypeError} If value is not a valid numeric type
|
|
38
|
+
* @throws {Error} If value is not a valid number format
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* toCurrency(1) // 'un leu'
|
|
42
|
+
* toCurrency(2.50) // 'doi lei cincizeci de bani'
|
|
43
|
+
*/
|
|
44
|
+
export function toCurrency(value: number | string | bigint): string;
|