n2words 1.24.0 → 2.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/README.md +285 -156
- package/dist/ArabicConverter.js +3 -0
- package/dist/ArabicConverter.js.map +1 -0
- package/dist/AzerbaijaniConverter.js +3 -0
- package/dist/AzerbaijaniConverter.js.map +1 -0
- package/dist/BanglaConverter.js +3 -0
- package/dist/BanglaConverter.js.map +1 -0
- package/dist/BiblicalHebrewConverter.js +3 -0
- package/dist/BiblicalHebrewConverter.js.map +1 -0
- package/dist/CroatianConverter.js +3 -0
- package/dist/CroatianConverter.js.map +1 -0
- package/dist/CzechConverter.js +3 -0
- package/dist/CzechConverter.js.map +1 -0
- package/dist/DanishConverter.js +3 -0
- package/dist/DanishConverter.js.map +1 -0
- package/dist/DutchConverter.js +3 -0
- package/dist/DutchConverter.js.map +1 -0
- package/dist/EnglishConverter.js +3 -0
- package/dist/EnglishConverter.js.map +1 -0
- package/dist/FilipinoConverter.js +3 -0
- package/dist/FilipinoConverter.js.map +1 -0
- package/dist/FrenchBelgiumConverter.js +3 -0
- package/dist/FrenchBelgiumConverter.js.map +1 -0
- package/dist/FrenchConverter.js +3 -0
- package/dist/FrenchConverter.js.map +1 -0
- package/dist/GermanConverter.js +3 -0
- package/dist/GermanConverter.js.map +1 -0
- package/dist/GreekConverter.js +3 -0
- package/dist/GreekConverter.js.map +1 -0
- package/dist/GujaratiConverter.js +3 -0
- package/dist/GujaratiConverter.js.map +1 -0
- package/dist/HebrewConverter.js +3 -0
- package/dist/HebrewConverter.js.map +1 -0
- package/dist/HindiConverter.js +3 -0
- package/dist/HindiConverter.js.map +1 -0
- package/dist/HungarianConverter.js +3 -0
- package/dist/HungarianConverter.js.map +1 -0
- package/dist/IndonesianConverter.js +3 -0
- package/dist/IndonesianConverter.js.map +1 -0
- package/dist/ItalianConverter.js +3 -0
- package/dist/ItalianConverter.js.map +1 -0
- package/dist/JapaneseConverter.js +3 -0
- package/dist/JapaneseConverter.js.map +1 -0
- package/dist/KannadaConverter.js +3 -0
- package/dist/KannadaConverter.js.map +1 -0
- package/dist/KoreanConverter.js +3 -0
- package/dist/KoreanConverter.js.map +1 -0
- package/dist/LatvianConverter.js +3 -0
- package/dist/LatvianConverter.js.map +1 -0
- package/dist/LithuanianConverter.js +3 -0
- package/dist/LithuanianConverter.js.map +1 -0
- package/dist/MalayConverter.js +3 -0
- package/dist/MalayConverter.js.map +1 -0
- package/dist/MarathiConverter.js +3 -0
- package/dist/MarathiConverter.js.map +1 -0
- package/dist/NorwegianBokmalConverter.js +3 -0
- package/dist/NorwegianBokmalConverter.js.map +1 -0
- package/dist/PersianConverter.js +3 -0
- package/dist/PersianConverter.js.map +1 -0
- package/dist/PolishConverter.js +3 -0
- package/dist/PolishConverter.js.map +1 -0
- package/dist/PortugueseConverter.js +3 -0
- package/dist/PortugueseConverter.js.map +1 -0
- package/dist/PunjabiConverter.js +3 -0
- package/dist/PunjabiConverter.js.map +1 -0
- package/dist/RomanianConverter.js +3 -0
- package/dist/RomanianConverter.js.map +1 -0
- package/dist/RussianConverter.js +3 -0
- package/dist/RussianConverter.js.map +1 -0
- package/dist/SerbianCyrillicConverter.js +3 -0
- package/dist/SerbianCyrillicConverter.js.map +1 -0
- package/dist/SerbianLatinConverter.js +3 -0
- package/dist/SerbianLatinConverter.js.map +1 -0
- package/dist/SimplifiedChineseConverter.js +3 -0
- package/dist/SimplifiedChineseConverter.js.map +1 -0
- package/dist/SpanishConverter.js +3 -0
- package/dist/SpanishConverter.js.map +1 -0
- package/dist/SwahiliConverter.js +3 -0
- package/dist/SwahiliConverter.js.map +1 -0
- package/dist/SwedishConverter.js +3 -0
- package/dist/SwedishConverter.js.map +1 -0
- package/dist/TamilConverter.js +3 -0
- package/dist/TamilConverter.js.map +1 -0
- package/dist/TeluguConverter.js +3 -0
- package/dist/TeluguConverter.js.map +1 -0
- package/dist/ThaiConverter.js +3 -0
- package/dist/ThaiConverter.js.map +1 -0
- package/dist/TraditionalChineseConverter.js +3 -0
- package/dist/TraditionalChineseConverter.js.map +1 -0
- package/dist/TurkishConverter.js +3 -0
- package/dist/TurkishConverter.js.map +1 -0
- package/dist/UkrainianConverter.js +3 -0
- package/dist/UkrainianConverter.js.map +1 -0
- package/dist/UrduConverter.js +3 -0
- package/dist/UrduConverter.js.map +1 -0
- package/dist/VietnameseConverter.js +3 -0
- package/dist/VietnameseConverter.js.map +1 -0
- package/dist/n2words.js +3 -2
- package/dist/n2words.js.map +1 -1
- package/lib/classes/abstract-language.d.ts +178 -0
- package/lib/classes/abstract-language.js +192 -185
- package/lib/classes/greedy-scale-language.d.ts +109 -0
- package/lib/classes/greedy-scale-language.js +96 -90
- package/lib/classes/slavic-language.d.ts +148 -0
- package/lib/classes/slavic-language.js +136 -106
- package/lib/classes/south-asian-language.d.ts +70 -0
- package/lib/classes/south-asian-language.js +58 -65
- package/lib/classes/turkic-language.d.ts +26 -0
- package/lib/classes/turkic-language.js +22 -26
- package/lib/languages/ar.d.ts +30 -0
- package/lib/languages/ar.js +49 -133
- package/lib/languages/az.d.ts +12 -0
- package/lib/languages/az.js +7 -23
- package/lib/languages/bn.d.ts +11 -0
- package/lib/languages/bn.js +12 -7
- package/lib/languages/cs.d.ts +88 -0
- package/lib/languages/cs.js +44 -113
- package/lib/languages/da.d.ts +15 -0
- package/lib/languages/da.js +40 -87
- package/lib/languages/de.d.ts +14 -0
- package/lib/languages/de.js +34 -68
- package/lib/languages/el.d.ts +14 -0
- package/lib/languages/el.js +22 -48
- package/lib/languages/en.d.ts +16 -0
- package/lib/languages/en.js +22 -59
- package/lib/languages/es.d.ts +15 -0
- package/lib/languages/es.js +49 -81
- package/lib/languages/fa.d.ts +47 -0
- package/lib/languages/fa.js +90 -73
- package/lib/languages/fil.d.ts +16 -0
- package/lib/languages/fil.js +35 -76
- package/lib/languages/fr-BE.d.ts +11 -0
- package/lib/languages/fr-BE.js +15 -51
- package/lib/languages/fr.d.ts +15 -0
- package/lib/languages/fr.js +33 -72
- package/lib/languages/gu.d.ts +11 -0
- package/lib/languages/gu.js +10 -34
- package/lib/languages/hbo.d.ts +113 -0
- package/lib/languages/hbo.js +251 -0
- package/lib/languages/he.d.ts +80 -0
- package/lib/languages/he.js +41 -164
- package/lib/languages/hi.d.ts +11 -0
- package/lib/languages/hi.js +12 -7
- package/lib/languages/hr.d.ts +80 -0
- package/lib/languages/hr.js +51 -95
- package/lib/languages/hu.d.ts +22 -0
- package/lib/languages/hu.js +35 -53
- package/lib/languages/id.d.ts +37 -0
- package/lib/languages/id.js +29 -44
- package/lib/languages/it.d.ts +37 -0
- package/lib/languages/it.js +36 -52
- package/lib/languages/ja.d.ts +17 -0
- package/lib/languages/ja.js +22 -75
- package/lib/languages/kn.d.ts +11 -0
- package/lib/languages/kn.js +10 -39
- package/lib/languages/ko.d.ts +14 -0
- package/lib/languages/ko.js +17 -45
- package/lib/languages/lt.d.ts +70 -0
- package/lib/languages/lt.js +28 -63
- package/lib/languages/lv.d.ts +70 -0
- package/lib/languages/lv.js +35 -58
- package/lib/languages/mr.d.ts +11 -0
- package/lib/languages/mr.js +10 -34
- package/lib/languages/ms.d.ts +31 -0
- package/lib/languages/ms.js +24 -20
- package/lib/languages/nb.d.ts +12 -0
- package/lib/languages/nb.js +36 -56
- package/lib/languages/nl.d.ts +16 -0
- package/lib/languages/nl.js +58 -109
- package/lib/languages/pa.d.ts +11 -0
- package/lib/languages/{pa-Guru.js → pa.js} +12 -7
- package/lib/languages/pl.d.ts +80 -0
- package/lib/languages/pl.js +26 -105
- package/lib/languages/pt.d.ts +29 -0
- package/lib/languages/pt.js +29 -64
- package/lib/languages/ro.d.ts +158 -0
- package/lib/languages/ro.js +60 -167
- package/lib/languages/ru.d.ts +85 -0
- package/lib/languages/ru.js +17 -37
- package/lib/languages/sr-Cyrl.d.ts +80 -0
- package/lib/languages/sr-Cyrl.js +113 -0
- package/lib/languages/sr-Latn.d.ts +80 -0
- package/lib/languages/sr-Latn.js +54 -98
- package/lib/languages/sv.d.ts +14 -0
- package/lib/languages/sv.js +26 -63
- package/lib/languages/sw.d.ts +39 -0
- package/lib/languages/sw.js +26 -21
- package/lib/languages/ta.d.ts +20 -0
- package/lib/languages/ta.js +26 -26
- package/lib/languages/te.d.ts +22 -0
- package/lib/languages/te.js +28 -38
- package/lib/languages/th.d.ts +17 -0
- package/lib/languages/th.js +25 -31
- package/lib/languages/tr.d.ts +12 -0
- package/lib/languages/tr.js +11 -38
- package/lib/languages/uk.d.ts +85 -0
- package/lib/languages/uk.js +18 -44
- package/lib/languages/ur.d.ts +11 -0
- package/lib/languages/ur.js +12 -7
- package/lib/languages/vi.d.ts +72 -0
- package/lib/languages/vi.js +25 -71
- package/lib/languages/zh-Hans.d.ts +21 -0
- package/lib/languages/zh-Hans.js +33 -87
- package/lib/languages/zh-Hant.d.ts +21 -0
- package/lib/languages/zh-Hant.js +111 -0
- package/lib/n2words.d.ts +209 -0
- package/lib/n2words.js +474 -191
- package/package.json +106 -67
- package/dist/languages/ar.js +0 -2
- package/dist/languages/ar.js.map +0 -1
- package/dist/languages/az.js +0 -2
- package/dist/languages/az.js.map +0 -1
- package/dist/languages/bn.js +0 -2
- package/dist/languages/bn.js.map +0 -1
- package/dist/languages/cs.js +0 -2
- package/dist/languages/cs.js.map +0 -1
- package/dist/languages/da.js +0 -2
- package/dist/languages/da.js.map +0 -1
- package/dist/languages/de.js +0 -2
- package/dist/languages/de.js.map +0 -1
- package/dist/languages/el.js +0 -2
- package/dist/languages/el.js.map +0 -1
- package/dist/languages/en.js +0 -2
- package/dist/languages/en.js.map +0 -1
- package/dist/languages/es.js +0 -2
- package/dist/languages/es.js.map +0 -1
- package/dist/languages/fa.js +0 -2
- package/dist/languages/fa.js.map +0 -1
- package/dist/languages/fil.js +0 -2
- package/dist/languages/fil.js.map +0 -1
- package/dist/languages/fr-BE.js +0 -2
- package/dist/languages/fr-BE.js.map +0 -1
- package/dist/languages/fr.js +0 -2
- package/dist/languages/fr.js.map +0 -1
- package/dist/languages/gu.js +0 -2
- package/dist/languages/gu.js.map +0 -1
- package/dist/languages/he.js +0 -2
- package/dist/languages/he.js.map +0 -1
- package/dist/languages/hi.js +0 -2
- package/dist/languages/hi.js.map +0 -1
- package/dist/languages/hr.js +0 -2
- package/dist/languages/hr.js.map +0 -1
- package/dist/languages/hu.js +0 -2
- package/dist/languages/hu.js.map +0 -1
- package/dist/languages/id.js +0 -2
- package/dist/languages/id.js.map +0 -1
- package/dist/languages/it.js +0 -2
- package/dist/languages/it.js.map +0 -1
- package/dist/languages/ja.js +0 -2
- package/dist/languages/ja.js.map +0 -1
- package/dist/languages/kn.js +0 -2
- package/dist/languages/kn.js.map +0 -1
- package/dist/languages/ko.js +0 -2
- package/dist/languages/ko.js.map +0 -1
- package/dist/languages/lt.js +0 -2
- package/dist/languages/lt.js.map +0 -1
- package/dist/languages/lv.js +0 -2
- package/dist/languages/lv.js.map +0 -1
- package/dist/languages/mr.js +0 -2
- package/dist/languages/mr.js.map +0 -1
- package/dist/languages/ms.js +0 -2
- package/dist/languages/ms.js.map +0 -1
- package/dist/languages/nb.js +0 -2
- package/dist/languages/nb.js.map +0 -1
- package/dist/languages/nl.js +0 -2
- package/dist/languages/nl.js.map +0 -1
- package/dist/languages/pa-Guru.js +0 -2
- package/dist/languages/pa-Guru.js.map +0 -1
- package/dist/languages/pl.js +0 -2
- package/dist/languages/pl.js.map +0 -1
- package/dist/languages/pt.js +0 -2
- package/dist/languages/pt.js.map +0 -1
- package/dist/languages/ro.js +0 -2
- package/dist/languages/ro.js.map +0 -1
- package/dist/languages/ru.js +0 -2
- package/dist/languages/ru.js.map +0 -1
- package/dist/languages/sr-Latn.js +0 -2
- package/dist/languages/sr-Latn.js.map +0 -1
- package/dist/languages/sv.js +0 -2
- package/dist/languages/sv.js.map +0 -1
- package/dist/languages/sw.js +0 -2
- package/dist/languages/sw.js.map +0 -1
- package/dist/languages/ta.js +0 -2
- package/dist/languages/ta.js.map +0 -1
- package/dist/languages/te.js +0 -2
- package/dist/languages/te.js.map +0 -1
- package/dist/languages/th.js +0 -2
- package/dist/languages/th.js.map +0 -1
- package/dist/languages/tr.js +0 -2
- package/dist/languages/tr.js.map +0 -1
- package/dist/languages/uk.js +0 -2
- package/dist/languages/uk.js.map +0 -1
- package/dist/languages/ur.js +0 -2
- package/dist/languages/ur.js.map +0 -1
- package/dist/languages/vi.js +0 -2
- package/dist/languages/vi.js.map +0 -1
- package/dist/languages/zh-Hans.js +0 -2
- package/dist/languages/zh-Hans.js.map +0 -1
- package/typings/classes/abstract-language.d.ts +0 -144
- package/typings/classes/greedy-scale-language.d.ts +0 -148
- package/typings/classes/slavic-language.d.ts +0 -145
- package/typings/classes/south-asian-language.d.ts +0 -101
- package/typings/classes/turkic-language.d.ts +0 -42
- package/typings/languages/ar.d.ts +0 -93
- package/typings/languages/az.d.ts +0 -25
- package/typings/languages/bn.d.ts +0 -1
- package/typings/languages/cs.d.ts +0 -120
- package/typings/languages/da.d.ts +0 -53
- package/typings/languages/de.d.ts +0 -26
- package/typings/languages/el.d.ts +0 -11
- package/typings/languages/en.d.ts +0 -30
- package/typings/languages/es.d.ts +0 -43
- package/typings/languages/fa.d.ts +0 -81
- package/typings/languages/fil.d.ts +0 -12
- package/typings/languages/fr-BE.d.ts +0 -41
- package/typings/languages/fr.d.ts +0 -43
- package/typings/languages/gu.d.ts +0 -12
- package/typings/languages/he.d.ts +0 -197
- package/typings/languages/hi.d.ts +0 -1
- package/typings/languages/hr.d.ts +0 -110
- package/typings/languages/hu.d.ts +0 -37
- package/typings/languages/id.d.ts +0 -69
- package/typings/languages/it.d.ts +0 -51
- package/typings/languages/ja.d.ts +0 -58
- package/typings/languages/kn.d.ts +0 -11
- package/typings/languages/ko.d.ts +0 -25
- package/typings/languages/lt.d.ts +0 -110
- package/typings/languages/lv.d.ts +0 -99
- package/typings/languages/mr.d.ts +0 -12
- package/typings/languages/ms.d.ts +0 -37
- package/typings/languages/nb.d.ts +0 -27
- package/typings/languages/nl.d.ts +0 -65
- package/typings/languages/pa-Guru.d.ts +0 -1
- package/typings/languages/pl.d.ts +0 -116
- package/typings/languages/pt.d.ts +0 -39
- package/typings/languages/ro.d.ts +0 -229
- package/typings/languages/ru.d.ts +0 -108
- package/typings/languages/sr-Latn.d.ts +0 -98
- package/typings/languages/sv.d.ts +0 -30
- package/typings/languages/sw.d.ts +0 -1
- package/typings/languages/ta.d.ts +0 -1
- package/typings/languages/te.d.ts +0 -1
- package/typings/languages/th.d.ts +0 -1
- package/typings/languages/tr.d.ts +0 -46
- package/typings/languages/uk.d.ts +0 -117
- package/typings/languages/ur.d.ts +0 -1
- package/typings/languages/vi.d.ts +0 -116
- package/typings/languages/zh-Hans.d.ts +0 -57
- package/typings/n2words.d.ts +0 -177
package/README.md
CHANGED
|
@@ -1,223 +1,352 @@
|
|
|
1
1
|
# n2words
|
|
2
2
|
|
|
3
|
-
[](https://github.com/forzagreen/n2words/actions/workflows/ci.yml)
|
|
4
|
+
[](https://coveralls.io/github/forzagreen/n2words)
|
|
5
|
+
[](https://npmjs.com/package/n2words)
|
|
6
|
+
[](https://www.npmjs.com/package/n2words)
|
|
7
|
+
[](https://bundlephobia.com/package/n2words)
|
|
8
|
+
[](https://npmjs.com/package/n2words)
|
|
9
|
+
[](https://www.jsdelivr.com/package/npm/n2words)
|
|
10
|
+
|
|
11
|
+
**Convert numbers to words in 48 languages with zero dependencies.**
|
|
12
|
+
|
|
13
|
+
## Why n2words?
|
|
14
|
+
|
|
15
|
+
- **Maximum Language Coverage** — 48 languages including European, Asian, Middle Eastern, and regional variants
|
|
16
|
+
- **Zero Dependencies** — Pure JavaScript with no external runtime dependencies
|
|
17
|
+
- **Universal Compatibility** — Works in Node.js, browsers (via CDN), and all modern bundlers
|
|
18
|
+
- **Type-Safe** — Full TypeScript support with generated `.d.ts` declarations
|
|
19
|
+
- **Production Ready** — Comprehensive test coverage (unit, integration, browser, type checking)
|
|
20
|
+
- **BigInt Support** — Handle arbitrarily large numbers without precision loss
|
|
21
|
+
- **Flexible Input** — Accepts `number`, `bigint`, or `string` inputs
|
|
22
|
+
- **Tree-Shakable** — Import only the languages you need (~2-5 KB gzipped per language)
|
|
23
|
+
- **Browser Tested** — Verified in Chromium, Firefox, and WebKit via automated tests
|
|
24
|
+
|
|
25
|
+
## Contents
|
|
26
|
+
|
|
27
|
+
- [Quick Start](#quick-start)
|
|
28
|
+
- [Usage](#usage) — ESM, CommonJS, Browser (UMD)
|
|
29
|
+
- [Type Safety](#type-safety) — TypeScript support
|
|
30
|
+
- [Supported Languages](#supported-languages-48) — 48 languages with options
|
|
31
|
+
- [Browser Compatibility](#browser-compatibility) — Chrome 67+, Firefox 68+, Safari 14+, Edge 79+
|
|
32
|
+
- [Performance & Bundle Size](#performance--bundle-size) — Tree-shaking and benchmarks
|
|
33
|
+
- [Examples](#examples) — Basic, gender agreement, language-specific features
|
|
34
|
+
- [Documentation](#documentation) — Guides and API reference
|
|
35
|
+
- [Contributing](#contributing) — How to contribute
|
|
36
|
+
- [License](#license)
|
|
17
37
|
|
|
18
38
|
## Quick Start
|
|
19
39
|
|
|
20
|
-
```
|
|
21
|
-
import n2words from 'n2words';
|
|
22
|
-
|
|
23
|
-
n2words(123); // 'one hundred and twenty-three'
|
|
24
|
-
n2words(-1.5); // 'minus one point five'
|
|
25
|
-
n2words(123, { lang: 'zh-Hans' }); // '壹佰贰拾叁'
|
|
26
|
-
n2words(123, { lang: 'hi' }); // 'एक सौ तेईस'
|
|
27
|
-
n2words(123, { lang: 'es' }); // 'ciento veintitrés'
|
|
28
|
-
n2words(123, { lang: 'ar' }); // 'مائة وثلاثة وعشرون'
|
|
29
|
-
n2words(10000n, { lang: 'zh-Hans' }); // '壹万' (BigInt support!)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Installation
|
|
33
|
-
|
|
34
|
-
```sh
|
|
40
|
+
```bash
|
|
35
41
|
npm install n2words
|
|
36
42
|
```
|
|
37
43
|
|
|
38
|
-
## Usage
|
|
39
|
-
|
|
40
|
-
### Node.js / ESM
|
|
41
|
-
|
|
42
44
|
```js
|
|
43
|
-
import
|
|
45
|
+
import { EnglishConverter, SpanishConverter, ArabicConverter } from 'n2words'
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
EnglishConverter(123) // 'one hundred and twenty-three'
|
|
48
|
+
SpanishConverter(123) // 'ciento veintitrés'
|
|
49
|
+
ArabicConverter(1, { gender: 'feminine' }) // 'واحدة' (with options)
|
|
47
50
|
```
|
|
48
51
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
**Full type safety with language-specific options:**
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
import n2words, { type N2WordsOptions, type LanguageCode } from 'n2words';
|
|
55
|
-
|
|
56
|
-
// Language code autocomplete (45+ languages)
|
|
57
|
-
const lang: LanguageCode = 'zh-Hans'; // Full IntelliSense support
|
|
52
|
+
## Usage
|
|
58
53
|
|
|
59
|
-
|
|
60
|
-
const result1 = n2words(123, { lang: 'zh-Hans', formal: true }); // Chinese financial numerals
|
|
61
|
-
const result2 = n2words(42, { lang: 'ar', feminine: true }); // Arabic feminine forms
|
|
62
|
-
const result3 = n2words(91, { lang: 'fr', withHyphenSeparator: true }); // French with hyphens
|
|
54
|
+
**ESM (Node.js, modern bundlers):**
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
lang: 'es',
|
|
67
|
-
genderStem: 'a' // TypeScript validates this option for Spanish
|
|
68
|
-
};
|
|
56
|
+
```js
|
|
57
|
+
import { EnglishConverter } from 'n2words'
|
|
69
58
|
```
|
|
70
59
|
|
|
71
|
-
|
|
60
|
+
**CommonJS (Node.js):**
|
|
72
61
|
|
|
73
|
-
|
|
62
|
+
n2words is an ES module. For CommonJS environments, use dynamic import with Promises:
|
|
74
63
|
|
|
75
64
|
```js
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
// Promise-based
|
|
66
|
+
import('n2words').then(({ EnglishConverter }) => {
|
|
67
|
+
console.log(EnglishConverter(42)) // 'forty-two'
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Or use async function
|
|
71
|
+
async function convertNumber(num) {
|
|
72
|
+
const { EnglishConverter } = await import('n2words')
|
|
73
|
+
return EnglishConverter(num)
|
|
74
|
+
}
|
|
79
75
|
```
|
|
80
76
|
|
|
81
|
-
|
|
77
|
+
**Browser (UMD via CDN):**
|
|
82
78
|
|
|
83
79
|
```html
|
|
80
|
+
<!-- All languages (~23KB gzipped) -->
|
|
84
81
|
<script src="https://cdn.jsdelivr.net/npm/n2words/dist/n2words.js"></script>
|
|
85
82
|
<script>
|
|
86
|
-
|
|
83
|
+
n2words.EnglishConverter(42) // 'forty-two'
|
|
87
84
|
</script>
|
|
88
|
-
```
|
|
89
85
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
<script src="https://cdn.jsdelivr.net/npm/n2words/dist/languages/fr.js"></script>
|
|
86
|
+
<!-- Individual languages (~2KB gzipped each) - load only what you need -->
|
|
87
|
+
<script src="https://cdn.jsdelivr.net/npm/n2words/dist/EnglishConverter.js"></script>
|
|
88
|
+
<script src="https://cdn.jsdelivr.net/npm/n2words/dist/SpanishConverter.js"></script>
|
|
94
89
|
<script>
|
|
95
|
-
|
|
90
|
+
n2words.EnglishConverter(42) // 'forty-two'
|
|
91
|
+
n2words.SpanishConverter(123) // 'ciento veintitrés'
|
|
96
92
|
</script>
|
|
97
93
|
```
|
|
98
94
|
|
|
99
|
-
##
|
|
100
|
-
|
|
101
|
-
| Code | Language | Code | Language |
|
|
102
|
-
| --------- | -------------------- | --------- | ---------------- |
|
|
103
|
-
| `ar` | Arabic | `az` | Azerbaijani |
|
|
104
|
-
| `bn` | Bengali | `cs` | Czech |
|
|
105
|
-
| `de` | German | `da` | Danish |
|
|
106
|
-
| `el` | Greek | `en` | English |
|
|
107
|
-
| `es` | Spanish | `fa` | Farsi/Persian |
|
|
108
|
-
| `fr` | French | `fr-BE` | French (Belgium) |
|
|
109
|
-
| `gu` | Gujarati | `he` | Hebrew |
|
|
110
|
-
| `hi` | Hindi | `hr` | Croatian |
|
|
111
|
-
| `hu` | Hungarian | `id` | Indonesian |
|
|
112
|
-
| `it` | Italian | `ja` | Japanese |
|
|
113
|
-
| `kn` | Kannada | `ko` | Korean |
|
|
114
|
-
| `lt` | Lithuanian | `lv` | Latvian |
|
|
115
|
-
| `mr` | Marathi | `ms` | Malay |
|
|
116
|
-
| `nl` | Dutch | `nb` | Norwegian |
|
|
117
|
-
| `pa-Guru` | Punjabi (Gurmukhi) | `pl` | Polish |
|
|
118
|
-
| `pt` | Portuguese | `ro` | Romanian |
|
|
119
|
-
| `ru` | Russian | `sr-Latn` | Serbian (Latin) |
|
|
120
|
-
| `sv` | Swedish | `sw` | Swahili |
|
|
121
|
-
| `ta` | Tamil | `te` | Telugu |
|
|
122
|
-
| `th` | Thai | `fil` | Filipino/Tagalog |
|
|
123
|
-
| `tr` | Turkish | `uk` | Ukrainian |
|
|
124
|
-
| `ur` | Urdu | `vi` | Vietnamese |
|
|
125
|
-
| `zh-Hans` | Chinese (Simplified) | `gu` | Gujarati |
|
|
126
|
-
|
|
127
|
-
## Performance
|
|
128
|
-
|
|
129
|
-
Performance benchmarks (ops/sec) on latest hardware:
|
|
130
|
-
|
|
131
|
-
| Language | Performance |
|
|
132
|
-
| --------------- | ------------- |
|
|
133
|
-
| Arabic (ar) | ~180k ops/sec |
|
|
134
|
-
| Indonesian (id) | ~160k ops/sec |
|
|
135
|
-
| Vietnamese (vi) | ~165k ops/sec |
|
|
136
|
-
| Persian (fa) | ~125k ops/sec |
|
|
137
|
-
| Hebrew (he) | ~115k ops/sec |
|
|
138
|
-
|
|
139
|
-
All languages are highly optimized. Run `npm run bench:perf` to benchmark on your system.
|
|
95
|
+
## Type Safety
|
|
140
96
|
|
|
141
|
-
|
|
97
|
+
Full TypeScript support via JSDoc annotations and generated type definitions - works in both JavaScript and TypeScript projects with IntelliSense and type checking:
|
|
142
98
|
|
|
143
|
-
|
|
99
|
+
```typescript
|
|
100
|
+
import { EnglishConverter, ArabicConverter, SimplifiedChineseConverter } from 'n2words'
|
|
101
|
+
import type { NumericValue, ArabicOptions } from 'n2words'
|
|
144
102
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
103
|
+
// All converters accept: number | bigint | string
|
|
104
|
+
EnglishConverter(42) // ✓ number → 'forty-two'
|
|
105
|
+
EnglishConverter('123') // ✓ string → 'one hundred and twenty-three'
|
|
106
|
+
EnglishConverter(100n) // ✓ BigInt → 'one hundred'
|
|
107
|
+
|
|
108
|
+
// Language-specific options with type checking
|
|
109
|
+
ArabicConverter(1, { gender: 'feminine' }) // ✓ 'واحدة' (feminine form)
|
|
110
|
+
ArabicConverter(1, { invalid: true }) // ✗ TypeScript error: invalid property
|
|
111
|
+
|
|
112
|
+
SimplifiedChineseConverter(123, { formal: false }) // ✓ '一百二十三' (common style)
|
|
113
|
+
SimplifiedChineseConverter(123, { formal: 'yes' }) // ✗ TypeScript error: wrong type
|
|
152
114
|
```
|
|
153
115
|
|
|
154
|
-
|
|
116
|
+
**Type Definitions:**
|
|
117
|
+
|
|
118
|
+
n2words includes TypeScript declaration files (`.d.ts`) generated from JSDoc annotations:
|
|
119
|
+
|
|
120
|
+
- **Source**: JSDoc annotations in JavaScript source files
|
|
121
|
+
- **Generated**: TypeScript declarations built via `tsc` during package preparation
|
|
122
|
+
- **Included**: Published to npm with the package (no separate `@types` package needed)
|
|
123
|
+
- **Validated**: Comprehensive type tests ensure correctness
|
|
124
|
+
|
|
125
|
+
**Exported Types:**
|
|
126
|
+
|
|
127
|
+
- `NumericValue` - Accepted input types: `number | bigint | string`
|
|
128
|
+
- Language-specific option types (e.g., `ArabicOptions`, `SimplifiedChineseOptions`, `DutchOptions`, etc.)
|
|
129
|
+
|
|
130
|
+
## Supported Languages (48)
|
|
131
|
+
|
|
132
|
+
Language codes follow [IETF BCP 47](https://tools.ietf.org/html/bcp47) standards.
|
|
133
|
+
|
|
134
|
+
| Code | Language | Options | Code | Language | Options |
|
|
135
|
+
| --------- | ------------------- | ------- | --------- | ------------------- | ------- |
|
|
136
|
+
| `ar` | Arabic | ✓ | `az` | Azerbaijani | |
|
|
137
|
+
| `bn` | Bengali | | `cs` | Czech | ✓ |
|
|
138
|
+
| `da` | Danish | ✓ | `de` | German | |
|
|
139
|
+
| `el` | Greek | | `en` | English | |
|
|
140
|
+
| `es` | Spanish | ✓ | `fa` | Persian | |
|
|
141
|
+
| `fil` | Filipino | | `fr` | French | ✓ |
|
|
142
|
+
| `fr-BE` | Belgian French | ✓ | `gu` | Gujarati | |
|
|
143
|
+
| `hbo` | Biblical Hebrew | ✓ | `he` | Modern Hebrew | ✓ |
|
|
144
|
+
| `hi` | Hindi | | `hr` | Croatian | ✓ |
|
|
145
|
+
| `hu` | Hungarian | | `id` | Indonesian | |
|
|
146
|
+
| `it` | Italian | | `ja` | Japanese | |
|
|
147
|
+
| `kn` | Kannada | | `ko` | Korean | |
|
|
148
|
+
| `lt` | Lithuanian | ✓ | `lv` | Latvian | ✓ |
|
|
149
|
+
| `mr` | Marathi | | `ms` | Malay | |
|
|
150
|
+
| `nb` | Norwegian Bokmål | | `nl` | Dutch | ✓ |
|
|
151
|
+
| `pa` | Punjabi | | `pl` | Polish | ✓ |
|
|
152
|
+
| `pt` | Portuguese | | `ro` | Romanian | ✓ |
|
|
153
|
+
| `ru` | Russian | ✓ | `sr-Cyrl` | Serbian Cyrillic | ✓ |
|
|
154
|
+
| `sr-Latn` | Serbian Latin | ✓ | `sv` | Swedish | |
|
|
155
|
+
| `sw` | Swahili | | `ta` | Tamil | |
|
|
156
|
+
| `te` | Telugu | | `th` | Thai | |
|
|
157
|
+
| `tr` | Turkish | ✓ | `uk` | Ukrainian | ✓ |
|
|
158
|
+
| `ur` | Urdu | | `vi` | Vietnamese | |
|
|
159
|
+
| `zh-Hans` | Chinese Simplified | ✓ | `zh-Hant` | Chinese Traditional | ✓ |
|
|
160
|
+
|
|
161
|
+
### Language Options
|
|
162
|
+
|
|
163
|
+
21 languages support additional options. Common options include:
|
|
164
|
+
|
|
165
|
+
**`gender`** (`'masculine'` | `'feminine'`) - 13 languages
|
|
166
|
+
Arabic, Biblical Hebrew, Croatian, Czech, Latvian, Lithuanian, Polish, Romanian, Russian, Serbian (both scripts), Spanish, Ukrainian
|
|
167
|
+
|
|
168
|
+
**`formal`** (`boolean`) - 2 languages
|
|
169
|
+
Simplified Chinese, Traditional Chinese - Toggle between formal/financial and common numerals
|
|
170
|
+
|
|
171
|
+
**Other options:**
|
|
172
|
+
|
|
173
|
+
- Dutch: `includeOptionalAnd`, `accentOne`, `noHundredPairing`
|
|
174
|
+
- French/French Belgium: `withHyphenSeparator`
|
|
175
|
+
- Hebrew (Modern & Biblical): `andWord`
|
|
176
|
+
- Turkish: `dropSpaces`
|
|
177
|
+
- Danish: `ordFlag` (ordinal numbers)
|
|
178
|
+
- Arabic: `negativeWord` (custom negative word)
|
|
179
|
+
|
|
180
|
+
[See complete options reference →](docs/ARCHITECTURE.md#language-specific-options)
|
|
181
|
+
|
|
182
|
+
## Browser Compatibility
|
|
183
|
+
|
|
184
|
+
**Minimum Requirements** (due to BigInt):
|
|
185
|
+
|
|
186
|
+
- **Node.js**: 20 or above
|
|
187
|
+
- **Browsers**: Chrome 67+, Firefox 68+, Safari 14+, Edge 79+ (desktop + mobile)
|
|
188
|
+
- **Global Coverage**: ~86% of all users worldwide
|
|
189
|
+
|
|
190
|
+
**Note**: BigInt is a hard requirement and cannot be polyfilled. Older browsers are not supported.
|
|
191
|
+
|
|
192
|
+
**Build options:**
|
|
193
|
+
|
|
194
|
+
- **Browser CDN**: Use `dist/n2words.js` (pre-built UMD, tested in real browsers)
|
|
195
|
+
- **Node.js/Bundlers**: Use `lib/` source (ES modules, tree-shakable)
|
|
196
|
+
|
|
197
|
+
[See detailed compatibility guide →](COMPATIBILITY.md)
|
|
198
|
+
|
|
199
|
+
## Performance & Bundle Size
|
|
200
|
+
|
|
201
|
+
### Bundle Size Comparison
|
|
202
|
+
|
|
203
|
+
| Import Strategy | Bundle Size (Minified) | Gzipped | Languages Included |
|
|
204
|
+
| ---------------------------- | ---------------------- | -------- | ------------------ |
|
|
205
|
+
| All languages (UMD) | ~92 KB | ~23 KB | All 48 |
|
|
206
|
+
| Single language (UMD) | ~4-6 KB | ~2 KB | 1 |
|
|
207
|
+
| Tree-shaken (ESM, 1 lang) | ~4-5 KB | ~2 KB | 1 |
|
|
208
|
+
| Tree-shaken (ESM, 3 langs) | ~12-15 KB | ~4-5 KB | 3 |
|
|
209
|
+
| Tree-shaken (ESM, 10 langs) | ~40-50 KB | ~12-15 KB| 10 |
|
|
210
|
+
|
|
211
|
+
### Performance Characteristics
|
|
212
|
+
|
|
213
|
+
- **Fast**: Sub-millisecond conversion for most numbers
|
|
214
|
+
- **Efficient**: Zero dependencies, minimal memory footprint
|
|
215
|
+
- **BigInt support**: Handles arbitrarily large numbers without precision loss
|
|
216
|
+
- **Memory-efficient**: ~2 KB overhead per language when tree-shaken
|
|
217
|
+
|
|
218
|
+
**Tree-shaking example:**
|
|
155
219
|
|
|
156
220
|
```js
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
221
|
+
// Import only what you need - bundler only includes used languages
|
|
222
|
+
import { EnglishConverter, SpanishConverter } from 'n2words'
|
|
223
|
+
// Final bundle: ~4-5 KB gzipped (only English + Spanish + core)
|
|
224
|
+
```
|
|
160
225
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
226
|
+
**Run benchmarks:**
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
npm run bench:perf # Performance benchmarks (ops/sec)
|
|
230
|
+
npm run bench:memory # Memory usage benchmarks
|
|
164
231
|
```
|
|
165
232
|
|
|
166
|
-
|
|
233
|
+
## Examples
|
|
234
|
+
|
|
235
|
+
### Basic Conversions
|
|
167
236
|
|
|
168
237
|
```js
|
|
169
|
-
|
|
170
|
-
|
|
238
|
+
import { EnglishConverter } from 'n2words'
|
|
239
|
+
|
|
240
|
+
// Basic numbers
|
|
241
|
+
EnglishConverter(0) // 'zero'
|
|
242
|
+
EnglishConverter(42) // 'forty-two'
|
|
243
|
+
EnglishConverter(1000000) // 'one million'
|
|
244
|
+
|
|
245
|
+
// Decimals & negatives
|
|
246
|
+
EnglishConverter(3.14) // 'three point one four'
|
|
247
|
+
EnglishConverter(-42) // 'minus forty-two'
|
|
248
|
+
|
|
249
|
+
// Large numbers & BigInt
|
|
250
|
+
EnglishConverter(1234567890) // 'one billion two hundred and thirty-four million five hundred and sixty-seven thousand eight hundred and ninety'
|
|
251
|
+
EnglishConverter(123456789012345n) // Works with arbitrarily large integers
|
|
171
252
|
```
|
|
172
253
|
|
|
173
|
-
###
|
|
254
|
+
### Gender Agreement
|
|
174
255
|
|
|
175
256
|
```js
|
|
176
|
-
|
|
177
|
-
|
|
257
|
+
import { SpanishConverter, ArabicConverter, RussianConverter } from 'n2words'
|
|
258
|
+
|
|
259
|
+
// Spanish: masculine vs feminine
|
|
260
|
+
SpanishConverter(1) // 'uno' (masculine, default)
|
|
261
|
+
SpanishConverter(1, { gender: 'feminine' }) // 'una'
|
|
262
|
+
SpanishConverter(21) // 'veintiuno' (masculine)
|
|
263
|
+
SpanishConverter(21, { gender: 'feminine' }) // 'veintiuna'
|
|
264
|
+
|
|
265
|
+
// Arabic: rich gender system
|
|
266
|
+
ArabicConverter(1) // 'واحد' (masculine, default)
|
|
267
|
+
ArabicConverter(1, { gender: 'feminine' }) // 'واحدة'
|
|
268
|
+
|
|
269
|
+
// Russian: gender for numerals
|
|
270
|
+
RussianConverter(1) // 'один' (masculine, default)
|
|
271
|
+
RussianConverter(1, { gender: 'feminine' }) // 'одна'
|
|
178
272
|
```
|
|
179
273
|
|
|
180
|
-
###
|
|
274
|
+
### Language-Specific Features
|
|
181
275
|
|
|
182
276
|
```js
|
|
183
|
-
|
|
277
|
+
import {
|
|
278
|
+
SimplifiedChineseConverter,
|
|
279
|
+
TraditionalChineseConverter,
|
|
280
|
+
JapaneseConverter,
|
|
281
|
+
DutchConverter,
|
|
282
|
+
FrenchConverter
|
|
283
|
+
} from 'n2words'
|
|
284
|
+
|
|
285
|
+
// Chinese: formal (financial) vs common numerals
|
|
286
|
+
SimplifiedChineseConverter(123) // '壹佰贰拾叁' (formal, default)
|
|
287
|
+
SimplifiedChineseConverter(123, { formal: false }) // '一百二十三' (common)
|
|
288
|
+
|
|
289
|
+
TraditionalChineseConverter(456) // '肆佰伍拾陸' (formal, default)
|
|
290
|
+
TraditionalChineseConverter(456, { formal: false }) // '四百五十六' (common)
|
|
291
|
+
|
|
292
|
+
// Japanese: digit-by-digit decimals
|
|
293
|
+
JapaneseConverter(3.14) // '三点一四'
|
|
294
|
+
|
|
295
|
+
// Dutch: flexible formatting
|
|
296
|
+
DutchConverter(123) // 'honderddrieëntwintig' (default compound)
|
|
297
|
+
DutchConverter(101, { includeOptionalAnd: true }) // 'honderdeneen' (with optional "en")
|
|
298
|
+
DutchConverter(1) // 'één' (accented, default)
|
|
299
|
+
DutchConverter(1, { accentOne: false }) // 'een' (unaccented)
|
|
300
|
+
|
|
301
|
+
// French: selective hyphens vs all hyphens
|
|
302
|
+
FrenchConverter(123) // 'cent vingt-trois' (default)
|
|
303
|
+
FrenchConverter(123, { withHyphenSeparator: true }) // 'cent-vingt-trois' (all hyphens)
|
|
184
304
|
```
|
|
185
305
|
|
|
186
|
-
|
|
306
|
+
### Input Flexibility
|
|
187
307
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
- [LANGUAGE_GUIDE.md](./guides/LANGUAGE_GUIDE.md) - Comprehensive guide for adding new languages
|
|
191
|
-
- [BIGINT-GUIDE.md](./guides/BIGINT-GUIDE.md) - BigInt usage guide for language developers
|
|
192
|
-
- [CONTRIBUTING.md](./CONTRIBUTING.md) - Contribution guidelines
|
|
193
|
-
- [Wiki](https://github.com/forzagreen/n2words/wiki) - Detailed examples and guides
|
|
308
|
+
```js
|
|
309
|
+
import { EnglishConverter } from 'n2words'
|
|
194
310
|
|
|
195
|
-
|
|
311
|
+
// Multiple input types
|
|
312
|
+
EnglishConverter(42) // number → 'forty-two'
|
|
313
|
+
EnglishConverter('42') // string → 'forty-two'
|
|
314
|
+
EnglishConverter(42n) // BigInt → 'forty-two'
|
|
196
315
|
|
|
197
|
-
|
|
316
|
+
// Decimal strings
|
|
317
|
+
EnglishConverter('3.14') // 'three point one four'
|
|
318
|
+
EnglishConverter('.5') // 'zero point five'
|
|
198
319
|
|
|
199
|
-
|
|
200
|
-
-
|
|
201
|
-
- 🌐 **New languages** - Add support for more languages (use `npm run lang:add` to get started!)
|
|
202
|
-
- 📝 **Documentation** - Improve guides and examples
|
|
320
|
+
// Negative strings
|
|
321
|
+
EnglishConverter('-42') // 'minus forty-two'
|
|
203
322
|
|
|
204
|
-
|
|
323
|
+
// Large BigInts (no precision loss)
|
|
324
|
+
EnglishConverter(999999999999999999999999n) // Accurate conversion
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## Documentation
|
|
205
328
|
|
|
206
|
-
|
|
329
|
+
- **[Compatibility Guide](COMPATIBILITY.md)** - Browser and Node.js compatibility
|
|
330
|
+
- **[Contributing Guide](CONTRIBUTING.md)** - How to contribute and add languages
|
|
331
|
+
- **[Architecture Guide](docs/ARCHITECTURE.md)** - Implementation patterns and options reference
|
|
332
|
+
- **[Code of Conduct](CODE_OF_CONDUCT.md)** - Community standards
|
|
207
333
|
|
|
208
|
-
|
|
209
|
-
# Generate boilerplate for a new language
|
|
210
|
-
npm run lang:add
|
|
334
|
+
## Contributing
|
|
211
335
|
|
|
212
|
-
|
|
213
|
-
npm run lang:validate <language-code>
|
|
336
|
+
We welcome contributions! Add a new language or improve existing ones:
|
|
214
337
|
|
|
215
|
-
|
|
216
|
-
npm run lang:
|
|
338
|
+
```bash
|
|
339
|
+
npm run lang:add <code> # Scaffold a new language (BCP 47 code)
|
|
340
|
+
npm run lang:validate -- <code> # Validate implementation
|
|
341
|
+
npm test # Run full test suite
|
|
217
342
|
```
|
|
218
343
|
|
|
219
|
-
|
|
344
|
+
Also welcome: bug reports, feature requests, documentation improvements, and language enhancements.
|
|
345
|
+
|
|
346
|
+
Please read our [Code of Conduct](CODE_OF_CONDUCT.md) before contributing.
|
|
347
|
+
|
|
348
|
+
**[See full contributing guide →](CONTRIBUTING.md)**
|
|
220
349
|
|
|
221
350
|
## License
|
|
222
351
|
|
|
223
|
-
[MIT](./LICENSE) ©
|
|
352
|
+
[MIT](./LICENSE) © Wael TELLAT, Tyler Vigario & contributors
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! n2words/ArabicConverter v2.0.0 | MIT License | github.com/forzagreen/n2words */
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).n2words=e.n2words||{})}(this,function(e){"use strict";class t{#e={};negativeWord="";decimalSeparatorWord="";zeroWord="";wordSeparator=" ";usePerDigitDecimals=!1;get options(){return this.#e}toWords(e,t,r){const s=[];return e&&s.push(this.negativeWord),s.push(this.integerToWords(t)),r&&(s.push(this.decimalSeparatorWord),s.push(...this.decimalDigitsToWords(r))),s.join(this.wordSeparator)}integerToWords(e){throw new Error("integerToWords() must be implemented by subclass")}setOptions(e={},t={}){this.#e={...e,...t}}decimalIntegerToWords(e){return this.integerToWords(e)}decimalDigitsToWords(e){const t=[];let r=0;for(;r<e.length&&"0"===e[r];)t.push(this.zeroWord),r++;const s=e.slice(r);if(!s)return t;if(this.usePerDigitDecimals)for(const e of s)t.push(this.decimalIntegerToWords(BigInt(e)));else t.push(this.decimalIntegerToWords(BigInt(s)));return t}}function r(e){const[t,r]=e.toLowerCase().split("e"),s=parseInt(r,10),n=t.indexOf("."),i=-1===n?t:t.slice(0,n)+t.slice(n+1),o=(-1===n?t.length:n)+s;return o>=i.length?i+"0".repeat(o-i.length):o<=0?"0."+"0".repeat(-o)+i:i.slice(0,o)+"."+i.slice(o)}const s=(n=class extends t{negativeWord="ناقص";decimalSeparatorWord="فاصلة";zeroWord="صفر";tensWords=["عشرون","ثلاثون","أربعون","خمسون","ستون","سبعون","ثمانون","تسعون"];hundredsWords=["","مائة","مئتان","ثلاثمائة","أربعمائة","خمسمائة","ستمائة","سبعمائة","ثمانمائة","تسعمائة"];scaleWords=["مائة","ألف","مليون","مليار","تريليون","كوادريليون","كوينتليون","سكستيليون"];scaleAppendedWords=["","ألفاً","مليوناً","ملياراً","تريليوناً","كوادريليوناً","كوينتليوناً","سكستيليوناً"];scalePluralWords=["","آلاف","ملايين","مليارات","تريليونات","كوادريليونات","كوينتليونات","سكستيليونات"];dualWords=["مئتان","ألفان","مليونان","ملياران","تريليونان","كوادريليونان","كوينتليونان","سكستيليونان"];dualAppendedWords=["مئتا","ألفا","مليونا","مليارا","تريليونا","كوادريليونا","كوينتليونا","سكستيليونا"];ones={masculine:["واحد","اثنان","ثلاثة","أربعة","خمسة","ستة","سبعة","ثمانية","تسعة","عشرة","أحد عشر","اثنا عشر","ثلاثة عشر","أربعة عشر","خمسة عشر","ستة عشر","سبعة عشر","ثمانية عشر","تسعة عشر"],feminine:["واحدة","اثنتان","ثلاث","أربع","خمس","ست","سبع","ثمان","تسع","عشر","إحدى عشرة","اثنتا عشرة","ثلاث عشرة","أربع عشرة","خمس عشرة","ست عشرة","سبع عشرة","ثماني عشرة","تسع عشرة"]};constructor(e={}){super(),this.setOptions({gender:"masculine"},e),void 0!==e.negativeWord&&(this.negativeWord=e.negativeWord)}get selectedOnes(){return this.ones["feminine"===this.options.gender?"feminine":"masculine"]}segmentToWords(e,t,r){const s=e%100,n=e/100,i=Math.trunc(n);let o="";if(i>0)if(0===s&&2===i)o=this.dualWords[0];else{const e=this.hundredsWords[i];e&&(o=e,0!==s&&(o+=" و"))}if(s>0)if(s<20)if(2===s&&0===i&&t>0){const s=Number(r),n=Math.trunc(Math.log10(s));o=n%3==0&&r===BigInt(2*Math.pow(10,n))?2===e?this.dualWords[t]:this.dualAppendedWords[t]:this.dualWords[t]}else o+=1===s&&t>0?this.scaleWords[t]:this.selectedOnes[s-1];else{const e=s%10,t=Math.trunc(s/10)-2;e>0&&(o+=this.selectedOnes[e-1],o+=" و"),o+=this.tensWords[t]}return o}integerToWords(e){if(0n===e)return this.zeroWord;let t=e,r=0,s="";for(;t>0n;){const n=Number(t%1000n);if(t/=1000n,n>0){const t=this.segmentToWords(n,r,e);t&&(r>0&&(s&&(s=" و"+s),n>2)&&(s=1==n%100?this.scaleWords[r]+" "+s:n>=3&&n<=10?this.scalePluralWords[r]+" "+s:(s?this.scaleAppendedWords[r]:this.scaleWords[r])+" "+s),s=t+" "+s)}r++}return s.replace(/\s+/g," ").trim()}},function(e,t){if(void 0!==t&&!function(e){if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(t))throw new TypeError("options must be a plain object if provided");const{isNegative:s,integerPart:i,decimalPart:o}=function(e){const t=typeof e;if("bigint"===t)return e<0n?{isNegative:!0,integerPart:-e}:{isNegative:!1,integerPart:e};if("number"!==t&&"string"!==t)throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${t}`);const s="number"===t?function(e){if(!Number.isFinite(e))throw new Error("Number must be finite (NaN and Infinity are not supported)");const t=e.toString();return t.includes("e")||t.includes("E")?r(t):t}(e):function(e){const t=e.trim();if(0===t.length)throw new Error(`Invalid number format: "${e}"`);if(Number.isNaN(Number(t)))throw new Error(`Invalid number format: "${e}"`);return t.includes("e")||t.includes("E")?r(t):t}(e);return function(e){const t="-"===e[0];t&&(e=e.slice(1));const r=e.indexOf(".");if(-1===r)return{isNegative:t,integerPart:BigInt(e)};const s=e.slice(0,r)||"0",n=e.slice(r+1);return{isNegative:t,integerPart:BigInt(s),decimalPart:n}}(s)}(e);return new n(t).toWords(s,i,o)});var n;e.ArabicConverter=s});
|
|
3
|
+
//# sourceMappingURL=ArabicConverter.js.map
|