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/lib/languages/sv.js
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
|
|
1
|
+
import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Swedish language converter.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* Merge rules:
|
|
12
|
-
* - Hyphenated for compound tens (e.g., "tjugo-tre")
|
|
13
|
-
* - "och" (and) after hundreds (e.g., "hundra och ett")
|
|
14
|
-
* - Space-separated for larger composites (e.g., "en miljon")
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Hyphenation for compound tens (tjugo-tre)
|
|
8
|
+
* - "och" (and) after hundreds
|
|
9
|
+
* - Space-separated larger composites
|
|
15
10
|
*/
|
|
16
11
|
export class Swedish extends GreedyScaleLanguage {
|
|
17
12
|
negativeWord = 'minus'
|
|
18
13
|
decimalSeparatorWord = 'komma'
|
|
19
14
|
zeroWord = 'noll'
|
|
20
15
|
wordSeparator = ' '
|
|
21
|
-
|
|
16
|
+
|
|
17
|
+
scaleWords = [
|
|
22
18
|
[1_000_000_000_000_000_000_000_000_000n, 'kvadriljon'],
|
|
23
19
|
[1_000_000_000_000_000_000_000_000n, 'triljon'],
|
|
24
20
|
[1_000_000_000_000_000_000_000n, 'biljon'],
|
|
@@ -58,70 +54,37 @@ export class Swedish extends GreedyScaleLanguage {
|
|
|
58
54
|
[0n, 'noll']
|
|
59
55
|
]
|
|
60
56
|
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
* - "och" after hundreds: `mergeScales({ 'hundra': 100n }, { 'ett': 1n })` → `{ 'hundra och ett': 101n }`
|
|
68
|
-
* - "en" for millions: `mergeScales({ 'ett': 1n }, { 'miljon': 1000000n })` → `{ 'en miljon': 1000000n }`
|
|
69
|
-
*
|
|
70
|
-
* @param {Object} leftPair Left word-set as `{ word: BigInt }`.
|
|
71
|
-
* @param {Object} rightPair Right word-set as `{ word: BigInt }`.
|
|
72
|
-
* @returns {Object} Merged pair with combined word and resulting numeric value.
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* mergeScales({ 'ett': 1n }, { 'hundra': 100n }); // { 'hundra': 100n }
|
|
76
|
-
* mergeScales({ 'tjugo': 20n }, { 'tre': 3n }); // { 'tjugo-tre': 23n }
|
|
77
|
-
*/
|
|
78
|
-
mergeScales (leftPair, rightPair) {
|
|
79
|
-
const leftWord = Object.keys(leftPair)[0]
|
|
80
|
-
const rightWord = Object.keys(rightPair)[0]
|
|
81
|
-
const leftNumber = Object.values(leftPair)[0]
|
|
82
|
-
const rightNumber = Object.values(rightPair)[0]
|
|
57
|
+
/** Combines two word-sets according to Swedish grammar rules. */
|
|
58
|
+
combineWordSets (preceding, following) {
|
|
59
|
+
const precedingWord = Object.keys(preceding)[0]
|
|
60
|
+
const followingWord = Object.keys(following)[0]
|
|
61
|
+
const precedingValue = Object.values(preceding)[0]
|
|
62
|
+
const followingValue = Object.values(following)[0]
|
|
83
63
|
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
64
|
+
if (precedingValue === 1n && followingValue < 100n) {
|
|
65
|
+
return following
|
|
86
66
|
}
|
|
87
67
|
|
|
88
68
|
// Omit 'ett' before 'hundra' and 'tusen'
|
|
89
|
-
if (
|
|
90
|
-
return
|
|
69
|
+
if (precedingValue === 1n && (followingValue === 100n || followingValue === 1000n)) {
|
|
70
|
+
return following
|
|
91
71
|
}
|
|
92
72
|
|
|
93
|
-
if (
|
|
94
|
-
return { [`${
|
|
73
|
+
if (precedingValue < 100n && precedingValue > followingValue) {
|
|
74
|
+
return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }
|
|
95
75
|
}
|
|
96
76
|
|
|
97
|
-
if (
|
|
98
|
-
return { [`${
|
|
77
|
+
if (precedingValue >= 100n && followingValue < 100n) {
|
|
78
|
+
return { [`${precedingWord} och ${followingWord}`]: precedingValue + followingValue }
|
|
99
79
|
}
|
|
100
80
|
|
|
101
|
-
if (
|
|
102
|
-
if (
|
|
103
|
-
return { [`en ${
|
|
81
|
+
if (followingValue > precedingValue) {
|
|
82
|
+
if (precedingValue === 1n && followingValue >= 1_000_000n) {
|
|
83
|
+
return { [`en ${followingWord}`]: precedingValue * followingValue }
|
|
104
84
|
}
|
|
105
|
-
return { [`${
|
|
85
|
+
return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }
|
|
106
86
|
}
|
|
107
87
|
|
|
108
|
-
return { [`${
|
|
88
|
+
return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }
|
|
109
89
|
}
|
|
110
90
|
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Converts a number to Swedish cardinal (written) form.
|
|
114
|
-
*
|
|
115
|
-
* @param {number|string|bigint} value The number to convert.
|
|
116
|
-
* @param {Object} [options] Conversion options (see Swedish class options).
|
|
117
|
-
* @returns {string} The number expressed in Swedish words.
|
|
118
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
119
|
-
* @throws {Error} If value is an invalid number string.
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* convertToWords(42); // 'fyrtio-två'
|
|
123
|
-
* convertToWords('1.5'); // 'ett komma fem'
|
|
124
|
-
*/
|
|
125
|
-
export default function convertToWords (value, options = {}) {
|
|
126
|
-
return new Swedish(options).convertToWords(value)
|
|
127
|
-
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swahili language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Swahili number words (moja, mbili, tatu)
|
|
6
|
+
* - Space-separated components
|
|
7
|
+
* - Simple decimal point notation
|
|
8
|
+
*/
|
|
9
|
+
export class Swahili extends AbstractLanguage {
|
|
10
|
+
onesWords: {
|
|
11
|
+
0: string;
|
|
12
|
+
1: string;
|
|
13
|
+
2: string;
|
|
14
|
+
3: string;
|
|
15
|
+
4: string;
|
|
16
|
+
5: string;
|
|
17
|
+
6: string;
|
|
18
|
+
7: string;
|
|
19
|
+
8: string;
|
|
20
|
+
9: string;
|
|
21
|
+
};
|
|
22
|
+
tensWords: {
|
|
23
|
+
10: string;
|
|
24
|
+
20: string;
|
|
25
|
+
30: string;
|
|
26
|
+
40: string;
|
|
27
|
+
50: string;
|
|
28
|
+
60: string;
|
|
29
|
+
70: string;
|
|
30
|
+
80: string;
|
|
31
|
+
90: string;
|
|
32
|
+
};
|
|
33
|
+
scaleWords: string[];
|
|
34
|
+
wordsUnder100(n: any): any;
|
|
35
|
+
wordsUnder1000(n: any): any;
|
|
36
|
+
splitBy3(number: any): number[];
|
|
37
|
+
integerToWords(integerPart: any): string;
|
|
38
|
+
}
|
|
39
|
+
import { AbstractLanguage } from '../classes/abstract-language.js';
|
package/lib/languages/sw.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import AbstractLanguage from '../classes/abstract-language.js'
|
|
1
|
+
import { AbstractLanguage } from '../classes/abstract-language.js'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Swahili language converter.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Swahili number words (moja, mbili, tatu)
|
|
8
|
+
* - Space-separated components
|
|
9
|
+
* - Simple decimal point notation
|
|
10
|
+
*/
|
|
11
|
+
export class Swahili extends AbstractLanguage {
|
|
4
12
|
negativeWord = 'minus'
|
|
5
13
|
decimalSeparatorWord = 'nukta'
|
|
6
14
|
zeroWord = 'sifuri'
|
|
7
|
-
|
|
15
|
+
|
|
16
|
+
onesWords = {
|
|
8
17
|
0: 'sifuri',
|
|
9
18
|
1: 'moja',
|
|
10
19
|
2: 'mbili',
|
|
@@ -17,7 +26,7 @@ class Swahili extends AbstractLanguage {
|
|
|
17
26
|
9: 'tisa'
|
|
18
27
|
}
|
|
19
28
|
|
|
20
|
-
|
|
29
|
+
tensWords = {
|
|
21
30
|
10: 'kumi',
|
|
22
31
|
20: 'ishirini',
|
|
23
32
|
30: 'thelathini',
|
|
@@ -29,7 +38,7 @@ class Swahili extends AbstractLanguage {
|
|
|
29
38
|
90: 'tisini'
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
|
|
41
|
+
scaleWords = [
|
|
33
42
|
'',
|
|
34
43
|
'elfu',
|
|
35
44
|
'milioni',
|
|
@@ -38,16 +47,16 @@ class Swahili extends AbstractLanguage {
|
|
|
38
47
|
]
|
|
39
48
|
|
|
40
49
|
wordsUnder100 (n) {
|
|
41
|
-
if (n < 10) return this.
|
|
42
|
-
if (n === 10) return this.
|
|
50
|
+
if (n < 10) return this.onesWords[n]
|
|
51
|
+
if (n === 10) return this.tensWords[10]
|
|
43
52
|
if (n < 20) {
|
|
44
53
|
// 11-19: 'kumi na <digit>'
|
|
45
|
-
return this.
|
|
54
|
+
return this.tensWords[10] + ' na ' + this.onesWords[n - 10]
|
|
46
55
|
}
|
|
47
56
|
const tens = Math.trunc(n / 10) * 10
|
|
48
57
|
const ones = n % 10
|
|
49
|
-
if (ones === 0) return this.
|
|
50
|
-
return this.
|
|
58
|
+
if (ones === 0) return this.tensWords[tens]
|
|
59
|
+
return this.tensWords[tens] + ' na ' + this.onesWords[ones]
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
wordsUnder1000 (n) {
|
|
@@ -58,10 +67,10 @@ class Swahili extends AbstractLanguage {
|
|
|
58
67
|
const parts = []
|
|
59
68
|
|
|
60
69
|
// Hundreds: 'mia <digit>'
|
|
61
|
-
parts.push('mia ' + this.
|
|
70
|
+
parts.push('mia ' + this.onesWords[hundreds])
|
|
62
71
|
if (rest > 0) {
|
|
63
72
|
if (rest < 10) {
|
|
64
|
-
parts.push('na ' + this.
|
|
73
|
+
parts.push('na ' + this.onesWords[rest])
|
|
65
74
|
} else {
|
|
66
75
|
parts.push(this.wordsUnder100(rest))
|
|
67
76
|
}
|
|
@@ -85,10 +94,10 @@ class Swahili extends AbstractLanguage {
|
|
|
85
94
|
return groups
|
|
86
95
|
}
|
|
87
96
|
|
|
88
|
-
|
|
89
|
-
if (
|
|
97
|
+
integerToWords (integerPart) {
|
|
98
|
+
if (integerPart === 0n) return this.zeroWord
|
|
90
99
|
|
|
91
|
-
const groups = this.splitBy3(
|
|
100
|
+
const groups = this.splitBy3(integerPart)
|
|
92
101
|
const parts = []
|
|
93
102
|
|
|
94
103
|
for (let i = 0; i < groups.length; i++) {
|
|
@@ -98,7 +107,7 @@ class Swahili extends AbstractLanguage {
|
|
|
98
107
|
// scale word
|
|
99
108
|
if (scaleIndex === 0) {
|
|
100
109
|
if (val < 10 && parts.length > 0) {
|
|
101
|
-
parts.push('na ' + this.
|
|
110
|
+
parts.push('na ' + this.onesWords[val])
|
|
102
111
|
} else if (val === 100 && parts.length > 0) {
|
|
103
112
|
// In compound numbers (e.g., 1100 -> 'elfu moja mia'), use 'mia' not 'mia moja'
|
|
104
113
|
parts.push('mia')
|
|
@@ -108,14 +117,10 @@ class Swahili extends AbstractLanguage {
|
|
|
108
117
|
} else {
|
|
109
118
|
// e.g., 'elfu moja', 'milioni mbili'
|
|
110
119
|
const unit = (val === 1) ? 'moja' : this.wordsUnder1000(val)
|
|
111
|
-
parts.push(this.
|
|
120
|
+
parts.push(this.scaleWords[scaleIndex] + ' ' + unit)
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
123
|
|
|
115
124
|
return parts.join(' ').trim()
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
|
-
|
|
119
|
-
export default function convertToWords (value, options = {}) {
|
|
120
|
-
return new Swahili(options).convertToWords(value)
|
|
121
|
-
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tamil language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Tamil numbering system
|
|
6
|
+
* - Tamil script
|
|
7
|
+
* - Complete word forms for 0-99
|
|
8
|
+
*/
|
|
9
|
+
export class Tamil extends AbstractLanguage {
|
|
10
|
+
belowHundredWords: string[];
|
|
11
|
+
hundredsWords: string[];
|
|
12
|
+
onesWords: string[];
|
|
13
|
+
scaleWords: string[];
|
|
14
|
+
/** Convert numbers below 100 to Tamil words. */
|
|
15
|
+
convertBelowHundred(number: any): string;
|
|
16
|
+
convertBelowThousand(number: any): string;
|
|
17
|
+
splitIndian(number: any): number[];
|
|
18
|
+
integerToWords(integerPart: any): string;
|
|
19
|
+
}
|
|
20
|
+
import { AbstractLanguage } from '../classes/abstract-language.js';
|
package/lib/languages/ta.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import AbstractLanguage from '../classes/abstract-language.js'
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { AbstractLanguage } from '../classes/abstract-language.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tamil language converter.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Tamil numbering system
|
|
8
|
+
* - Tamil script
|
|
9
|
+
* - Complete word forms for 0-99
|
|
10
|
+
*/
|
|
11
|
+
export class Tamil extends AbstractLanguage {
|
|
4
12
|
negativeWord = 'மைனஸ்'
|
|
5
13
|
decimalSeparatorWord = 'புள்ளி'
|
|
6
14
|
zeroWord = 'பூஜ்ஜியம்'
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
|
|
16
|
+
|
|
17
|
+
belowHundredWords = [
|
|
9
18
|
'பூஜ்ஜியம்',
|
|
10
19
|
'ஒன்று',
|
|
11
20
|
'இரண்டு',
|
|
@@ -108,7 +117,7 @@ class Tamil extends AbstractLanguage {
|
|
|
108
117
|
'தொண்ணூற்று ஒன்பது'
|
|
109
118
|
]
|
|
110
119
|
|
|
111
|
-
|
|
120
|
+
hundredsWords = [
|
|
112
121
|
'',
|
|
113
122
|
'நூறு',
|
|
114
123
|
'இருநூறு',
|
|
@@ -121,8 +130,8 @@ class Tamil extends AbstractLanguage {
|
|
|
121
130
|
'தொள்ளாயிரம்'
|
|
122
131
|
]
|
|
123
132
|
|
|
124
|
-
//
|
|
125
|
-
|
|
133
|
+
// Ones words map 1–9 for decimal reading
|
|
134
|
+
onesWords = [
|
|
126
135
|
'ஒன்று',
|
|
127
136
|
'இரண்டு',
|
|
128
137
|
'மூன்று',
|
|
@@ -134,7 +143,7 @@ class Tamil extends AbstractLanguage {
|
|
|
134
143
|
'ஒன்பது'
|
|
135
144
|
]
|
|
136
145
|
|
|
137
|
-
|
|
146
|
+
scaleWords = [
|
|
138
147
|
'',
|
|
139
148
|
'ஆயிரம்',
|
|
140
149
|
'லட்சம்',
|
|
@@ -146,14 +155,9 @@ class Tamil extends AbstractLanguage {
|
|
|
146
155
|
'சங்கு'
|
|
147
156
|
]
|
|
148
157
|
|
|
149
|
-
/**
|
|
150
|
-
* Convert numbers below 100 to Tamil words.
|
|
151
|
-
*
|
|
152
|
-
* @param {number} number The number to convert (0-99).
|
|
153
|
-
* @returns {string} The Tamil representation.
|
|
154
|
-
*/
|
|
158
|
+
/** Convert numbers below 100 to Tamil words. */
|
|
155
159
|
convertBelowHundred (number) {
|
|
156
|
-
return this.
|
|
160
|
+
return this.belowHundredWords[number]
|
|
157
161
|
}
|
|
158
162
|
|
|
159
163
|
convertBelowThousand (number) {
|
|
@@ -162,7 +166,7 @@ class Tamil extends AbstractLanguage {
|
|
|
162
166
|
|
|
163
167
|
const hundreds = Math.trunc(number / 100)
|
|
164
168
|
const remainder = number % 100
|
|
165
|
-
let hundredPart = this.
|
|
169
|
+
let hundredPart = this.hundredsWords[hundreds]
|
|
166
170
|
|
|
167
171
|
if (remainder > 0) {
|
|
168
172
|
if (hundredPart.endsWith('ம்')) {
|
|
@@ -198,10 +202,10 @@ class Tamil extends AbstractLanguage {
|
|
|
198
202
|
return groups
|
|
199
203
|
}
|
|
200
204
|
|
|
201
|
-
|
|
202
|
-
if (
|
|
205
|
+
integerToWords (integerPart) {
|
|
206
|
+
if (integerPart === 0n) return this.zeroWord
|
|
203
207
|
|
|
204
|
-
const groups = this.splitIndian(
|
|
208
|
+
const groups = this.splitIndian(integerPart)
|
|
205
209
|
const groupCount = groups.length
|
|
206
210
|
const words = []
|
|
207
211
|
|
|
@@ -212,15 +216,11 @@ class Tamil extends AbstractLanguage {
|
|
|
212
216
|
const scaleIndex = groupCount - i - 1
|
|
213
217
|
const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)
|
|
214
218
|
words.push(groupWords)
|
|
215
|
-
if (scaleIndex > 0 && this.
|
|
216
|
-
words.push(this.
|
|
219
|
+
if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
|
|
220
|
+
words.push(this.scaleWords[scaleIndex])
|
|
217
221
|
}
|
|
218
222
|
}
|
|
219
223
|
|
|
220
224
|
return words.join(' ').trim()
|
|
221
225
|
}
|
|
222
226
|
}
|
|
223
|
-
|
|
224
|
-
export default function convertToWords (value, options = {}) {
|
|
225
|
-
return new Tamil(options).convertToWords(value)
|
|
226
|
-
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telugu language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Telugu numbering system
|
|
6
|
+
* - Telugu script
|
|
7
|
+
* - Complete word forms for 0-99
|
|
8
|
+
*/
|
|
9
|
+
export class Telugu extends AbstractLanguage {
|
|
10
|
+
belowHundredWords: string[];
|
|
11
|
+
hundredsWords: string[];
|
|
12
|
+
onesWords: string[];
|
|
13
|
+
scaleWords: string[];
|
|
14
|
+
/** Convert numbers below 100 to Telugu words. */
|
|
15
|
+
convertBelowHundred(number: any): string;
|
|
16
|
+
/** Convert numbers below 1000 to Telugu words. */
|
|
17
|
+
convertBelowThousand(number: any): string;
|
|
18
|
+
/** Split a number using Indian-style grouping (3-2-2 digits from right). */
|
|
19
|
+
splitIndian(number: any): number[];
|
|
20
|
+
integerToWords(integerPart: any): string;
|
|
21
|
+
}
|
|
22
|
+
import { AbstractLanguage } from '../classes/abstract-language.js';
|
package/lib/languages/te.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import AbstractLanguage from '../classes/abstract-language.js'
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { AbstractLanguage } from '../classes/abstract-language.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Telugu language converter.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Telugu numbering system
|
|
8
|
+
* - Telugu script
|
|
9
|
+
* - Complete word forms for 0-99
|
|
10
|
+
*/
|
|
11
|
+
export class Telugu extends AbstractLanguage {
|
|
4
12
|
negativeWord = 'మైనస్'
|
|
5
13
|
decimalSeparatorWord = 'పాయింట్'
|
|
6
14
|
zeroWord = 'సున్నా'
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
|
|
16
|
+
|
|
17
|
+
belowHundredWords = [
|
|
9
18
|
'సున్నా',
|
|
10
19
|
'ఒకటి',
|
|
11
20
|
'రెండు',
|
|
@@ -108,7 +117,7 @@ class Telugu extends AbstractLanguage {
|
|
|
108
117
|
'తొంభై తొమ్మిది'
|
|
109
118
|
]
|
|
110
119
|
|
|
111
|
-
|
|
120
|
+
hundredsWords = [
|
|
112
121
|
'',
|
|
113
122
|
'వంద',
|
|
114
123
|
'రెండు వందలు',
|
|
@@ -121,8 +130,8 @@ class Telugu extends AbstractLanguage {
|
|
|
121
130
|
'తొమ్మిది వందలు'
|
|
122
131
|
]
|
|
123
132
|
|
|
124
|
-
//
|
|
125
|
-
|
|
133
|
+
// Ones words map 1–9 for decimal reading
|
|
134
|
+
onesWords = [
|
|
126
135
|
'ఒకటి',
|
|
127
136
|
'రెండు',
|
|
128
137
|
'మూడు',
|
|
@@ -134,7 +143,7 @@ class Telugu extends AbstractLanguage {
|
|
|
134
143
|
'తొమ్మిది'
|
|
135
144
|
]
|
|
136
145
|
|
|
137
|
-
|
|
146
|
+
scaleWords = [
|
|
138
147
|
'',
|
|
139
148
|
'వెయ్యి',
|
|
140
149
|
'లక్ష',
|
|
@@ -146,29 +155,19 @@ class Telugu extends AbstractLanguage {
|
|
|
146
155
|
'శంకు'
|
|
147
156
|
]
|
|
148
157
|
|
|
149
|
-
/**
|
|
150
|
-
* Convert numbers below 100 to Telugu words.
|
|
151
|
-
*
|
|
152
|
-
* @param {number} number The number to convert (0-99).
|
|
153
|
-
* @returns {string} The Telugu representation.
|
|
154
|
-
*/
|
|
158
|
+
/** Convert numbers below 100 to Telugu words. */
|
|
155
159
|
convertBelowHundred (number) {
|
|
156
|
-
return this.
|
|
160
|
+
return this.belowHundredWords[number]
|
|
157
161
|
}
|
|
158
162
|
|
|
159
|
-
/**
|
|
160
|
-
* Convert numbers below 1000 to Telugu words.
|
|
161
|
-
*
|
|
162
|
-
* @param {number} number The number to convert (0-999).
|
|
163
|
-
* @returns {string} The Telugu representation.
|
|
164
|
-
*/
|
|
163
|
+
/** Convert numbers below 1000 to Telugu words. */
|
|
165
164
|
convertBelowThousand (number) {
|
|
166
165
|
if (number === 0) return ''
|
|
167
166
|
if (number < 100) return this.convertBelowHundred(number)
|
|
168
167
|
|
|
169
168
|
const hundreds = Math.trunc(number / 100)
|
|
170
169
|
const remainder = number % 100
|
|
171
|
-
const parts = [this.
|
|
170
|
+
const parts = [this.hundredsWords[hundreds]]
|
|
172
171
|
|
|
173
172
|
if (remainder > 0) {
|
|
174
173
|
parts.push(this.convertBelowHundred(remainder))
|
|
@@ -177,12 +176,7 @@ class Telugu extends AbstractLanguage {
|
|
|
177
176
|
return parts.join(' ').trim()
|
|
178
177
|
}
|
|
179
178
|
|
|
180
|
-
/**
|
|
181
|
-
* Split a number using Indian-style grouping (3-2-2 digits from right).
|
|
182
|
-
*
|
|
183
|
-
* @param {bigint} number The number to split.
|
|
184
|
-
* @returns {number[]} Array of number groups.
|
|
185
|
-
*/
|
|
179
|
+
/** Split a number using Indian-style grouping (3-2-2 digits from right). */
|
|
186
180
|
splitIndian (number) {
|
|
187
181
|
const numStr = number.toString()
|
|
188
182
|
if (numStr.length <= 3) return [Number(numStr)]
|
|
@@ -201,10 +195,10 @@ class Telugu extends AbstractLanguage {
|
|
|
201
195
|
return groups
|
|
202
196
|
}
|
|
203
197
|
|
|
204
|
-
|
|
205
|
-
if (
|
|
198
|
+
integerToWords (integerPart) {
|
|
199
|
+
if (integerPart === 0n) return this.zeroWord
|
|
206
200
|
|
|
207
|
-
const groups = this.splitIndian(
|
|
201
|
+
const groups = this.splitIndian(integerPart)
|
|
208
202
|
const groupCount = groups.length
|
|
209
203
|
const words = []
|
|
210
204
|
|
|
@@ -215,15 +209,11 @@ class Telugu extends AbstractLanguage {
|
|
|
215
209
|
const scaleIndex = groupCount - i - 1
|
|
216
210
|
const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
|
|
217
211
|
words.push(groupWords)
|
|
218
|
-
if (scaleIndex > 0 && this.
|
|
219
|
-
words.push(this.
|
|
212
|
+
if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
|
|
213
|
+
words.push(this.scaleWords[scaleIndex])
|
|
220
214
|
}
|
|
221
215
|
}
|
|
222
216
|
|
|
223
217
|
return words.join(' ').trim()
|
|
224
218
|
}
|
|
225
219
|
}
|
|
226
|
-
|
|
227
|
-
export default function convertToWords (value, options = {}) {
|
|
228
|
-
return new Telugu(options).convertToWords(value)
|
|
229
|
-
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thai language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
|
|
6
|
+
* - No word separators (continuous Thai script)
|
|
7
|
+
* - Digit-by-digit decimal reading
|
|
8
|
+
*/
|
|
9
|
+
export class Thai extends AbstractLanguage {
|
|
10
|
+
onesWords: string[];
|
|
11
|
+
/** Converts numbers below one million to Thai words. */
|
|
12
|
+
convertBelowMillion(number: any): string;
|
|
13
|
+
/** Split a number into million-sized groups for processing. */
|
|
14
|
+
splitMillionGroups(number: any): number[];
|
|
15
|
+
integerToWords(integerPart: any): string;
|
|
16
|
+
}
|
|
17
|
+
import { AbstractLanguage } from '../classes/abstract-language.js';
|