to-words
Version:
Convert numbers to words in 132 locales with currency, ordinal, and BigInt support (TypeScript, ESM/CJS/UMD).
2,566 lines (2,562 loc) • 1.12 MB
JavaScript
"use strict";var ToWords=(()=>{//#region src/ToWordsCore.ts
const DefaultConverterOptions = {
currency: false,
ignoreDecimal: false,
ignoreZeroCurrency: false,
doNotAddOnly: false,
includeZeroFractional: false
};
const DefaultToWordsOptions = {
localeCode: "en-IN",
converterOptions: DefaultConverterOptions
};
const localeCache = /* @__PURE__ */ new WeakMap();
const BIGINT_0 = 0n;
const BIGINT_1 = 1n;
const BIGINT_2 = 2n;
const BIGINT_10 = 10n;
const BIGINT_11 = 11n;
const BIGINT_100 = 100n;
const BIGINT_1000 = 1000n;
const BIGINT_MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);
var ToWordsCore = class {
options = {};
locale = void 0;
localeClass = void 0;
formalLocale = void 0;
constructor(options = {}) {
this.options = Object.assign({}, DefaultToWordsOptions, options);
}
/**
* Resolve gendered value from a cached number-word mapping entry.
*/
resolveGenderedValue(entry, gender, trailing) {
if (gender === "feminine" && entry.feminineValue) return entry.feminineValue;
if (gender === "masculine" && entry.masculineValue) return entry.masculineValue;
return trailing && Array.isArray(entry.value) ? entry.value[1] : entry.resolvedValue;
}
/**
* Resolve locale instance, applying formalConfig merge when formal=true.
*/
resolveLocale(formal) {
const locale = this.getLocale();
if (!formal) return locale;
const formalConfig = locale.config.formalConfig;
if (!formalConfig) return locale;
if (!this.formalLocale) this.formalLocale = this.createFormalLocale(locale, formalConfig);
return this.formalLocale;
}
/**
* Create a synthetic locale instance with formalConfig merged in.
*/
createFormalLocale(base, formalConfig) {
const mergedConfig = { ...base.config };
if (formalConfig.numberWordsMapping) mergedConfig.numberWordsMapping = formalConfig.numberWordsMapping;
if (formalConfig.exactWordsMapping) mergedConfig.exactWordsMapping = formalConfig.exactWordsMapping;
if (formalConfig.ordinalWordsMapping) mergedConfig.ordinalWordsMapping = formalConfig.ordinalWordsMapping;
if (formalConfig.ordinalExactWordsMapping) mergedConfig.ordinalExactWordsMapping = formalConfig.ordinalExactWordsMapping;
if (formalConfig.currency) mergedConfig.currency = formalConfig.currency;
if (formalConfig.ignoreOneForWords) mergedConfig.ignoreOneForWords = formalConfig.ignoreOneForWords;
mergedConfig.formalConfig = void 0;
return { config: mergedConfig };
}
/**
* Set a locale class directly.
* @internal Used by per-locale entry points
*/
setLocale(localeClass) {
this.localeClass = localeClass;
this.locale = void 0;
return this;
}
/**
* Get the locale class. Must be set via setLocale() or overridden in subclass.
*/
getLocaleClass() {
if (this.localeClass) return this.localeClass;
throw new Error("No locale set. Use setLocale() or import from a locale-specific entry point (e.g., \"to-words/en-IN\")");
}
getLocale() {
if (this.locale === void 0) {
const LocaleClass = this.getLocaleClass();
this.locale = new LocaleClass();
this.initLocaleCache(this.locale);
}
return this.locale;
}
initLocaleCache(locale) {
const config = locale.config;
const numberWordsMappingBigInt = config.numberWordsMapping.map((elem) => ({
...elem,
numberBigInt: BigInt(elem.number),
resolvedValue: Array.isArray(elem.value) ? elem.value[0] : elem.value
}));
const exactWordsMap = /* @__PURE__ */ new Map();
if (config.exactWordsMapping) for (const elem of config.exactWordsMapping) {
const cached = {
...elem,
numberBigInt: BigInt(elem.number),
resolvedValue: Array.isArray(elem.value) ? elem.value[0] : elem.value
};
exactWordsMap.set(cached.numberBigInt, cached);
}
const smallNumbersMap = /* @__PURE__ */ new Map();
let smallNumbersBoundary = BIGINT_0;
for (const elem of numberWordsMappingBigInt) if (elem.numberBigInt <= BIGINT_100) {
smallNumbersMap.set(elem.numberBigInt, elem);
if (elem.numberBigInt > smallNumbersBoundary) smallNumbersBoundary = elem.numberBigInt;
}
const unitMappings = numberWordsMappingBigInt.filter((m) => m.numberBigInt >= BIGINT_100);
const pluralWordsSet = new Set(config.pluralWords ?? []);
const pluralWordsOnlyWhenTrailingSet = new Set(config.pluralWordsOnlyWhenTrailing ?? []);
const ignoreOneForWordsSet = new Set(config.ignoreOneForWords ?? []);
const noSplitWordAfterSet = new Set(config.noSplitWordAfter ?? []);
localeCache.set(locale, {
numberWordsMappingBigInt,
exactWordsMap,
smallNumbersMap,
unitMappings,
smallNumbersBoundary,
pluralWordsSet,
pluralWordsOnlyWhenTrailingSet,
ignoreOneForWordsSet,
noSplitWordAfterSet
});
}
getLocaleCache(locale) {
let cache = localeCache.get(locale);
if (!cache) {
this.initLocaleCache(locale);
cache = localeCache.get(locale);
}
return cache;
}
convert(number, options = {}) {
const baseOptions = this.options.converterOptions;
const mergedOptions = Object.keys(options).length === 0 ? baseOptions ?? {} : {
currency: options.currency ?? baseOptions?.currency ?? false,
ignoreDecimal: options.ignoreDecimal ?? baseOptions?.ignoreDecimal ?? false,
ignoreZeroCurrency: options.ignoreZeroCurrency ?? baseOptions?.ignoreZeroCurrency ?? false,
doNotAddOnly: options.doNotAddOnly ?? baseOptions?.doNotAddOnly ?? false,
includeZeroFractional: options.includeZeroFractional ?? baseOptions?.includeZeroFractional ?? false,
currencyOptions: options.currencyOptions ?? baseOptions?.currencyOptions,
gender: options.gender ?? baseOptions?.gender,
useAnd: options.useAnd ?? baseOptions?.useAnd,
formal: options.formal ?? baseOptions?.formal,
decimalStyle: options.decimalStyle ?? baseOptions?.decimalStyle
};
if (!this.isValidNumber(number)) throw new Error(`Invalid Number "${String(number)}"`);
const isBigInt = typeof number === "bigint";
let numericValue = isBigInt ? number : Number(number);
if (mergedOptions.ignoreDecimal && !isBigInt) numericValue = Math.trunc(numericValue);
const forceZeroFractional = !!mergedOptions.includeZeroFractional && !isBigInt && !mergedOptions.ignoreDecimal && typeof number === "string" && /\.\d+$/.test(number) && Number(number.split(".")[1]) === 0;
let words = [];
const localeOverride = this.resolveLocale(mergedOptions.formal);
if (mergedOptions.currency) words = this.convertCurrency(numericValue, mergedOptions, forceZeroFractional, localeOverride);
else words = this.convertNumber(numericValue, mergedOptions, localeOverride);
if (localeOverride.config.trim) return words.join("");
return words.join(" ");
}
toOrdinal(number, options = {}) {
if (!this.isValidNumber(number)) throw new Error(`Invalid Number "${String(number)}"`);
const locale = this.resolveLocale(options.formal);
const localeConfig = locale.config;
const numValue = Number(number);
if (!Number.isInteger(numValue) || numValue < 0) throw new Error(`Ordinal numbers must be non-negative integers, got "${number}"`);
if (!localeConfig.ordinalWordsMapping && !localeConfig.ordinalSuffix && !localeConfig.ordinalPrefix && !localeConfig.ordinalExactWordsMapping) throw new Error(`Ordinal conversion not supported for locale "${this.options.localeCode}"`);
const words = this.convertOrdinal(numValue, options, locale);
if (localeConfig.trim) return words.join("");
return words.join(" ");
}
convertOrdinal(number, _options, localeInstance) {
const localeConfig = localeInstance.config;
if (localeConfig.ordinalExactWordsMapping) {
const exactMatch = localeConfig.ordinalExactWordsMapping.find((m) => m.number === number);
if (exactMatch) return [exactMatch.value];
}
if (number <= 20 && localeConfig.ordinalWordsMapping) {
const ordinalMatch = localeConfig.ordinalWordsMapping.find((m) => m.number === number);
if (ordinalMatch) return [ordinalMatch.value];
}
const cardinalWords = this.convertInternal(BigInt(number), true, void 0, localeInstance);
const lastWordIndex = cardinalWords.length - 1;
const lastWord = cardinalWords[lastWordIndex];
const lastNumberComponent = this.getLastNumberComponent(number, localeConfig, localeInstance);
let transformed = false;
if (localeConfig.ordinalWordsMapping) {
const ordinalMatch = localeConfig.ordinalWordsMapping.find((m) => m.number === lastNumberComponent);
if (ordinalMatch) {
cardinalWords[lastWordIndex] = ordinalMatch.value;
transformed = true;
}
}
if (!transformed && localeConfig.ordinalSuffix) {
cardinalWords[lastWordIndex] = lastWord + localeConfig.ordinalSuffix;
transformed = true;
}
if (!transformed && localeConfig.ordinalPrefix) cardinalWords.unshift(localeConfig.ordinalPrefix);
return cardinalWords;
}
getLastNumberComponent(number, localeConfig, localeInstance) {
if (number <= 20) return number;
const unitMappings = localeInstance ? this.getLocaleCache(localeInstance).unitMappings : localeConfig.numberWordsMapping.filter((m) => Number(m.number) >= 100).sort((a, b) => Number(b.number) - Number(a.number));
for (const mapping of unitMappings) {
const unit = Number(mapping.number);
if (number % unit === 0) return unit;
}
const lastTwoDigits = number % 100;
if (localeConfig.numberWordsMapping.some((m) => Number(m.number) === lastTwoDigits)) return lastTwoDigits;
if (lastTwoDigits % 10 === 0) return lastTwoDigits;
return number % 10;
}
convertNumber(number, options = {}, localeOverride) {
const locale = localeOverride ?? this.getLocale();
const localeConfig = locale.config;
const gender = options.gender;
const useAnd = options.useAnd;
const isNegativeNumber = number < 0 || typeof number === "bigint" && number < 0n;
if (isNegativeNumber) number = typeof number === "bigint" ? -number : Math.abs(number);
const isBigInt = typeof number === "bigint";
const isFloat = !isBigInt && this.isFloat(number);
let integerPart;
let fractionalPart = "";
if (isBigInt) integerPart = number;
else if (isFloat) {
const segments = number.toString().split(".");
integerPart = BigInt(segments[0]);
fractionalPart = segments[1];
} else integerPart = BigInt(Math.trunc(number));
const ignoreZero = this.isNumberZero(number) && localeConfig.ignoreZeroInDecimals;
let words = this.convertInternal(integerPart, true, void 0, locale, gender, useAnd);
if (isFloat && ignoreZero) words = [];
const wordsWithDecimal = [];
if (isFloat) {
const fracValue = Number.parseInt(fractionalPart, 10);
const denominator = localeConfig.fractionDenominatorMapping?.[fractionalPart.length];
if (options.decimalStyle === "fraction" && denominator) {
if (!ignoreZero) wordsWithDecimal.push(localeConfig.texts.and);
wordsWithDecimal.push(...this.convertInternal(BigInt(fracValue), true, void 0, locale, gender));
const useSingular = localeConfig.fractionSingularRule === "slavic" ? fracValue % 10 === 1 && fracValue % 100 !== 11 : fracValue === 1;
wordsWithDecimal.push(useSingular ? denominator.singular : denominator.plural);
} else {
if (!ignoreZero) wordsWithDecimal.push(localeConfig.texts.point);
if (fractionalPart.startsWith("0") && !localeConfig?.decimalLengthWordMapping) {
const zeroWords = [];
for (const num of fractionalPart) zeroWords.push(...this.convertInternal(BigInt(num), true, void 0, locale, gender));
wordsWithDecimal.push(...zeroWords);
} else {
wordsWithDecimal.push(...this.convertInternal(BigInt(fractionalPart), true, void 0, locale, gender));
const decimalLengthWord = localeConfig?.decimalLengthWordMapping?.[fractionalPart.length];
if (decimalLengthWord) wordsWithDecimal.push(decimalLengthWord);
}
}
}
if (!(words.length <= 0) && isNegativeNumber) words.unshift(localeConfig.texts.minus);
words.push(...wordsWithDecimal);
return words;
}
convertCurrency(number, options = {}, forceZeroFractional = false, localeOverride) {
const locale = localeOverride ?? this.getLocale();
const localeConfig = locale.config;
const gender = options.gender;
const useAnd = options.useAnd;
const currencyOptions = options.currencyOptions ?? localeConfig.currency;
const precision = currencyOptions.precision ?? 2;
const isNegativeNumber = number < 0 || typeof number === "bigint" && number < 0n;
if (isNegativeNumber) number = typeof number === "bigint" ? -number : Math.abs(number);
const isBigInt = typeof number === "bigint";
if (!isBigInt) number = this.toFixed(number, precision);
const isFloat = !isBigInt && this.isFloat(number);
let mainAmount;
let fractionalPart = "";
if (isBigInt) mainAmount = number;
else if (isFloat) {
const segments = number.toString().split(".");
mainAmount = BigInt(segments[0]);
fractionalPart = segments[1];
} else mainAmount = BigInt(Math.trunc(number));
let words = [];
const mainAmountNum = mainAmount <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(mainAmount) : -1;
if (mainAmountNum !== -1 && currencyOptions.numberSpecificForms?.[mainAmountNum]) words = [currencyOptions.numberSpecificForms[mainAmountNum]];
else {
const trailing = localeConfig.useTrailingForCurrency ?? false;
words = [...this.convertInternal(mainAmount, trailing, void 0, locale, gender, useAnd)];
if (mainAmount === 1n && currencyOptions.singular) words.push(currencyOptions.singular);
else if (currencyOptions.plural) words.push(currencyOptions.plural);
}
const ignoreZero = this.isNumberZero(number) && (options.ignoreZeroCurrency || localeConfig?.ignoreZeroInDecimals && number !== 0 && number !== 0n);
if (ignoreZero) words = [];
const wordsWithDecimal = [];
if (isFloat) {
if (!ignoreZero) wordsWithDecimal.push(localeConfig.texts.and);
const decimalBase = !localeConfig.decimalLengthWordMapping && fractionalPart.length ? Math.pow(10, Math.max(0, precision - fractionalPart.length)) : 1;
const decimalPart = Number(fractionalPart) * decimalBase;
const decimalLengthWord = localeConfig?.decimalLengthWordMapping?.[fractionalPart.length];
if (currencyOptions.fractionalUnit.numberSpecificForms?.[decimalPart]) wordsWithDecimal.push(currencyOptions.fractionalUnit.numberSpecificForms[decimalPart]);
else {
wordsWithDecimal.push(...this.convertInternal(BigInt(decimalPart), false, void 0, locale, gender));
if (decimalLengthWord?.length) wordsWithDecimal.push(decimalLengthWord);
if (decimalPart === 1 && currencyOptions.fractionalUnit.singular) wordsWithDecimal.push(currencyOptions.fractionalUnit.singular);
else wordsWithDecimal.push(currencyOptions.fractionalUnit.plural);
}
} else if (forceZeroFractional && !ignoreZero && !localeConfig.decimalLengthWordMapping && !!currencyOptions.fractionalUnit.plural) {
wordsWithDecimal.push(localeConfig.texts.and);
if (currencyOptions.fractionalUnit.numberSpecificForms?.[0]) wordsWithDecimal.push(currencyOptions.fractionalUnit.numberSpecificForms[0]);
else {
wordsWithDecimal.push(...this.convertInternal(0n, false, void 0, locale, gender));
wordsWithDecimal.push(currencyOptions.fractionalUnit.plural);
}
} else if (localeConfig.decimalLengthWordMapping && words.length) wordsWithDecimal.push(currencyOptions.fractionalUnit.plural);
const isEmpty = words.length <= 0 && wordsWithDecimal.length <= 0;
if (!isEmpty && isNegativeNumber) words.unshift(localeConfig.texts.minus);
if (!isEmpty && localeConfig.texts.only && !options.doNotAddOnly && !localeConfig.onlyInFront) wordsWithDecimal.push(localeConfig.texts.only);
if (wordsWithDecimal.length) words.push(...wordsWithDecimal);
if (!isEmpty && !options.doNotAddOnly && localeConfig.onlyInFront) words.splice(0, 0, localeConfig.texts.only);
return words;
}
convertInternal(number, trailing = false, overrides, localeInstance, gender, useAnd) {
const locale = localeInstance ?? this.getLocale();
const localeConfig = locale.config;
const cache = this.getLocaleCache(locale);
if (overrides) {
const numberAsNum = number <= BIGINT_MAX_SAFE ? Number(number) : -1;
if (numberAsNum !== -1 && overrides[numberAsNum]) return [overrides[numberAsNum]];
}
const exactMatch = cache.exactWordsMap.get(number);
if (exactMatch) return [this.resolveGenderedValue(exactMatch, gender, trailing)];
let match;
if (number <= BIGINT_100) {
const directMatch = cache.smallNumbersMap.get(number);
if (directMatch) return [this.resolveGenderedValue(directMatch, gender, trailing)];
match = this.binarySearchDescending(cache.numberWordsMappingBigInt, number);
} else match = this.binarySearchDescending(cache.numberWordsMappingBigInt, number);
const matchNumber = match.numberBigInt;
const words = [];
if (number <= BIGINT_100 || number < BIGINT_1000 && localeConfig.namedLessThan1000) {
words.push(this.resolveGenderedValue(match, gender, trailing));
const remainder = number - matchNumber;
if (remainder > BIGINT_0) {
if (localeConfig.splitWord) words.push(localeConfig.splitWord);
const remainderWords = this.convertInternal(remainder, trailing, overrides, locale, gender, useAnd);
for (const remainderWord of remainderWords) words.push(remainderWord);
}
return words;
}
const quotient = number / matchNumber;
const remainder = number % matchNumber;
let matchValue = match.resolvedValue;
const originalMatchValue = match.resolvedValue;
const matchNumberNum = Number(matchNumber);
const pluralForms = localeConfig.pluralForms?.[matchNumberNum];
let usedPluralForm = false;
const usesIgnoreOne = cache.ignoreOneForWordsSet.has(originalMatchValue);
if (pluralForms) {
const lastTwoDigits = Number(quotient % BIGINT_100);
const useLastDigits = quotient >= BIGINT_11 && lastTwoDigits >= 3 && lastTwoDigits <= 10;
if (quotient === BIGINT_2 && pluralForms.dual) {
matchValue = pluralForms.dual;
usedPluralForm = true;
} else if (quotient >= BigInt(localeConfig.paucalConfig?.min ?? 3) && quotient <= BigInt(localeConfig.paucalConfig?.max ?? 10) || useLastDigits) {
if (pluralForms.paucal) matchValue = pluralForms.paucal;
} else if (quotient >= BIGINT_11 && pluralForms.plural) matchValue = pluralForms.plural;
} else {
const matchValueStr = match.value;
const isInPluralWords = cache.pluralWordsSet.has(matchValueStr);
const isInTrailingOnlyPluralWords = cache.pluralWordsOnlyWhenTrailingSet.has(matchValueStr);
if (quotient > BIGINT_1 && localeConfig.pluralMark && (isInPluralWords || isInTrailingOnlyPluralWords && remainder === BIGINT_0)) matchValue += localeConfig.pluralMark;
if (quotient % BIGINT_10 === BIGINT_1 && !usesIgnoreOne) matchValue = match.singularValue || matchValue;
}
if (quotient === BIGINT_1 && usesIgnoreOne || usedPluralForm) {
let valueToUse;
if (usedPluralForm) valueToUse = matchValue;
else if (match.singularValue) valueToUse = match.singularValue;
else valueToUse = this.resolveGenderedValue(match, gender, trailing);
words.push(valueToUse);
} else {
const quotientWords = this.convertInternal(quotient, false, overrides, locale, void 0, useAnd);
if (localeConfig.scaleFirst) {
words.push(matchValue);
for (const quotientWord of quotientWords) words.push(quotientWord);
} else {
for (const quotientWord of quotientWords) words.push(quotientWord);
words.push(matchValue);
}
}
if (remainder > BIGINT_0) {
const andWord = localeConfig.texts.and?.trim();
if (useAnd && remainder < BIGINT_100 && !localeConfig.splitWord && andWord) words.push(localeConfig.texts.and);
if (localeConfig.splitWord) {
if (!cache.noSplitWordAfterSet.has(match.resolvedValue)) words.push(localeConfig.splitWord);
}
const remainderWords = this.convertInternal(remainder, trailing, overrides, locale, gender, useAnd);
for (const remainderWord of remainderWords) words.push(remainderWord);
}
return words;
}
/**
* Binary search on a descending-sorted array of CachedNumberWordMap.
* Finds the first element where numberBigInt <= target.
*/
binarySearchDescending(arr, target) {
let left = 0;
let right = arr.length - 1;
let result = arr[right];
while (left <= right) {
const mid = left + right >> 1;
if (arr[mid].numberBigInt <= target) {
result = arr[mid];
right = mid - 1;
} else left = mid + 1;
}
return result;
}
toFixed(number, precision = 2) {
return Number(Number(number).toFixed(precision));
}
isFloat(number) {
return Number(number) === number && number % 1 !== 0;
}
isValidNumber(number) {
const type = typeof number;
if (type === "bigint") return true;
if (type === "number") return !Number.isNaN(number) && Number.isFinite(number);
if (type === "string") {
const str = number;
if (str.trim() === "") return false;
const converted = Number(str);
return !Number.isNaN(converted) && Number.isFinite(converted);
}
return false;
}
isNumberZero(number) {
if (typeof number === "bigint") return number === BIGINT_0;
return number >= 0 && number < 1;
}
};
//#endregion
//#region src/locales/af-ZA.ts
var Locale$131 = class {
config = {
currency: {
name: "Rand",
plural: "Rand",
singular: "Rand",
symbol: "R",
fractionalUnit: {
name: "Sent",
singular: "Sent",
plural: "Sente",
symbol: "c"
}
},
texts: {
and: "En",
minus: "Negatief",
only: "",
point: "Punt"
},
numberWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "Biljard"
},
{
number: 0xe8d4a51000,
value: "Biljoen"
},
{
number: 1e9,
value: "Miljard"
},
{
number: 1e6,
value: "Miljoen"
},
{
number: 1e3,
value: "Duisend"
},
{
number: 100,
value: "Honderd"
},
{
number: 99,
value: "Nege En Negentig"
},
{
number: 98,
value: "Agt En Negentig"
},
{
number: 97,
value: "Sewe En Negentig"
},
{
number: 96,
value: "Ses En Negentig"
},
{
number: 95,
value: "Vyf En Negentig"
},
{
number: 94,
value: "Vier En Negentig"
},
{
number: 93,
value: "Drie En Negentig"
},
{
number: 92,
value: "Twee En Negentig"
},
{
number: 91,
value: "Een En Negentig"
},
{
number: 90,
value: "Negentig"
},
{
number: 89,
value: "Nege En Tagtig"
},
{
number: 88,
value: "Agt En Tagtig"
},
{
number: 87,
value: "Sewe En Tagtig"
},
{
number: 86,
value: "Ses En Tagtig"
},
{
number: 85,
value: "Vyf En Tagtig"
},
{
number: 84,
value: "Vier En Tagtig"
},
{
number: 83,
value: "Drie En Tagtig"
},
{
number: 82,
value: "Twee En Tagtig"
},
{
number: 81,
value: "Een En Tagtig"
},
{
number: 80,
value: "Tagtig"
},
{
number: 79,
value: "Nege En Sewentig"
},
{
number: 78,
value: "Agt En Sewentig"
},
{
number: 77,
value: "Sewe En Sewentig"
},
{
number: 76,
value: "Ses En Sewentig"
},
{
number: 75,
value: "Vyf En Sewentig"
},
{
number: 74,
value: "Vier En Sewentig"
},
{
number: 73,
value: "Drie En Sewentig"
},
{
number: 72,
value: "Twee En Sewentig"
},
{
number: 71,
value: "Een En Sewentig"
},
{
number: 70,
value: "Sewentig"
},
{
number: 69,
value: "Nege En Sestig"
},
{
number: 68,
value: "Agt En Sestig"
},
{
number: 67,
value: "Sewe En Sestig"
},
{
number: 66,
value: "Ses En Sestig"
},
{
number: 65,
value: "Vyf En Sestig"
},
{
number: 64,
value: "Vier En Sestig"
},
{
number: 63,
value: "Drie En Sestig"
},
{
number: 62,
value: "Twee En Sestig"
},
{
number: 61,
value: "Een En Sestig"
},
{
number: 60,
value: "Sestig"
},
{
number: 59,
value: "Nege En Vyftig"
},
{
number: 58,
value: "Agt En Vyftig"
},
{
number: 57,
value: "Sewe En Vyftig"
},
{
number: 56,
value: "Ses En Vyftig"
},
{
number: 55,
value: "Vyf En Vyftig"
},
{
number: 54,
value: "Vier En Vyftig"
},
{
number: 53,
value: "Drie En Vyftig"
},
{
number: 52,
value: "Twee En Vyftig"
},
{
number: 51,
value: "Een En Vyftig"
},
{
number: 50,
value: "Vyftig"
},
{
number: 49,
value: "Nege En Veertig"
},
{
number: 48,
value: "Agt En Veertig"
},
{
number: 47,
value: "Sewe En Veertig"
},
{
number: 46,
value: "Ses En Veertig"
},
{
number: 45,
value: "Vyf En Veertig"
},
{
number: 44,
value: "Vier En Veertig"
},
{
number: 43,
value: "Drie En Veertig"
},
{
number: 42,
value: "Twee En Veertig"
},
{
number: 41,
value: "Een En Veertig"
},
{
number: 40,
value: "Veertig"
},
{
number: 39,
value: "Nege En Dertig"
},
{
number: 38,
value: "Agt En Dertig"
},
{
number: 37,
value: "Sewe En Dertig"
},
{
number: 36,
value: "Ses En Dertig"
},
{
number: 35,
value: "Vyf En Dertig"
},
{
number: 34,
value: "Vier En Dertig"
},
{
number: 33,
value: "Drie En Dertig"
},
{
number: 32,
value: "Twee En Dertig"
},
{
number: 31,
value: "Een En Dertig"
},
{
number: 30,
value: "Dertig"
},
{
number: 29,
value: "Nege En Twintig"
},
{
number: 28,
value: "Agt En Twintig"
},
{
number: 27,
value: "Sewe En Twintig"
},
{
number: 26,
value: "Ses En Twintig"
},
{
number: 25,
value: "Vyf En Twintig"
},
{
number: 24,
value: "Vier En Twintig"
},
{
number: 23,
value: "Drie En Twintig"
},
{
number: 22,
value: "Twee En Twintig"
},
{
number: 21,
value: "Een En Twintig"
},
{
number: 20,
value: "Twintig"
},
{
number: 19,
value: "Negentien"
},
{
number: 18,
value: "Agtien"
},
{
number: 17,
value: "Sewentien"
},
{
number: 16,
value: "Sestien"
},
{
number: 15,
value: "Vyftien"
},
{
number: 14,
value: "Veertien"
},
{
number: 13,
value: "Dertien"
},
{
number: 12,
value: "Twaalf"
},
{
number: 11,
value: "Elf"
},
{
number: 10,
value: "Tien"
},
{
number: 9,
value: "Nege"
},
{
number: 8,
value: "Agt"
},
{
number: 7,
value: "Sewe"
},
{
number: 6,
value: "Ses"
},
{
number: 5,
value: "Vyf"
},
{
number: 4,
value: "Vier"
},
{
number: 3,
value: "Drie"
},
{
number: 2,
value: "Twee"
},
{
number: 1,
value: "Een"
},
{
number: 0,
value: "Nul"
}
],
exactWordsMapping: [{
number: 100,
value: "Honderd"
}],
ordinalWordsMapping: [
{
number: 0xe8d4a51000,
value: "Biljoenste"
},
{
number: 1e9,
value: "Miljardste"
},
{
number: 1e6,
value: "Miljoenste"
},
{
number: 1e3,
value: "Duisendste"
},
{
number: 100,
value: "Honderdste"
},
{
number: 90,
value: "Negentigste"
},
{
number: 80,
value: "Tagtigste"
},
{
number: 70,
value: "Sewentigste"
},
{
number: 60,
value: "Sestigste"
},
{
number: 50,
value: "Vyftigste"
},
{
number: 40,
value: "Veertigste"
},
{
number: 30,
value: "Dertigste"
},
{
number: 20,
value: "Twintigste"
},
{
number: 19,
value: "Negentiende"
},
{
number: 18,
value: "Agtiende"
},
{
number: 17,
value: "Sewentiende"
},
{
number: 16,
value: "Sestiende"
},
{
number: 15,
value: "Vyftiende"
},
{
number: 14,
value: "Veertiende"
},
{
number: 13,
value: "Dertiende"
},
{
number: 12,
value: "Twaalfde"
},
{
number: 11,
value: "Elfde"
},
{
number: 10,
value: "Tiende"
},
{
number: 9,
value: "Negende"
},
{
number: 8,
value: "Agtste"
},
{
number: 7,
value: "Sewende"
},
{
number: 6,
value: "Sesde"
},
{
number: 5,
value: "Vyfde"
},
{
number: 4,
value: "Vierde"
},
{
number: 3,
value: "Derde"
},
{
number: 2,
value: "Tweede"
},
{
number: 1,
value: "Eerste"
},
{
number: 0,
value: "Nulde"
}
],
fractionDenominatorMapping: {
1: {
singular: "Tiende",
plural: "Tiende"
},
2: {
singular: "Honderdste",
plural: "Honderdste"
},
3: {
singular: "Duisendste",
plural: "Duisendste"
},
4: {
singular: "Tienduisendste",
plural: "Tienduisendste"
},
5: {
singular: "Honderdduisendste",
plural: "Honderdduisendste"
},
6: {
singular: "Miljoenste",
plural: "Miljoenste"
}
}
};
};
/**
* ToWords class pre-configured for this locale.
* This is a lightweight version that only bundles this specific locale.
*
* @example
* import { ToWords } from 'to-words/af-ZA';
* const tw = new ToWords();
* tw.convert(1234);
*/
var ToWords$132 = class extends ToWordsCore {
constructor(options = {}) {
super(options);
this.setLocale(Locale$131);
}
};
const instance$131 = new ToWords$132();
//#endregion
//#region src/locales/am-ET.ts
var Locale$130 = class {
config = {
currency: {
name: "ብር",
plural: "ብር",
singular: "ብር",
symbol: "ETB",
fractionalUnit: {
name: "ሳንቲም",
singular: "ሳንቲም",
plural: "ሳንቲም",
symbol: ""
}
},
texts: {
and: "እና",
minus: "አሉታዊ",
only: "ብቻ",
point: "ነጥብ"
},
numberWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "ኳድሪሊዮን"
},
{
number: 0xe8d4a51000,
value: "ትሪሊዮን"
},
{
number: 1e9,
value: "ቢሊዮን"
},
{
number: 1e6,
value: "ሚሊዮን"
},
{
number: 1e3,
value: "ሺ"
},
{
number: 100,
value: "መቶ"
},
{
number: 90,
value: "ዘጠና"
},
{
number: 80,
value: "ሰማንያ"
},
{
number: 70,
value: "ሰባ"
},
{
number: 60,
value: "ስድሳ"
},
{
number: 50,
value: "ሃምሳ"
},
{
number: 40,
value: "አርባ"
},
{
number: 30,
value: "ሰላሳ"
},
{
number: 20,
value: "ሃያ"
},
{
number: 19,
value: "አስራ ዘጠኝ"
},
{
number: 18,
value: "አስራ ስምንት"
},
{
number: 17,
value: "አስራ ሰባት"
},
{
number: 16,
value: "አስራ ስድስት"
},
{
number: 15,
value: "አስራ አምስት"
},
{
number: 14,
value: "አስራ አራት"
},
{
number: 13,
value: "አስራ ሦስት"
},
{
number: 12,
value: "አስራ ሁለት"
},
{
number: 11,
value: "አስራ አንድ"
},
{
number: 10,
value: "አስር"
},
{
number: 9,
value: "ዘጠኝ"
},
{
number: 8,
value: "ስምንት"
},
{
number: 7,
value: "ሰባት"
},
{
number: 6,
value: "ስድስት"
},
{
number: 5,
value: "አምስት"
},
{
number: 4,
value: "አራት"
},
{
number: 3,
value: "ሦስት"
},
{
number: 2,
value: "ሁለት"
},
{
number: 1,
value: "አንድ"
},
{
number: 0,
value: "ዜሮ"
}
],
ordinalWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "ኳድሪሊዮንኛ"
},
{
number: 0xe8d4a51000,
value: "ትሪሊዮንኛ"
},
{
number: 1e9,
value: "ቢሊዮንኛ"
},
{
number: 1e6,
value: "ሚሊዮንኛ"
},
{
number: 1e3,
value: "ሺኛ"
},
{
number: 100,
value: "መቶኛ"
},
{
number: 90,
value: "ዘጠናኛ"
},
{
number: 80,
value: "ሰማንያኛ"
},
{
number: 70,
value: "ሰባኛ"
},
{
number: 60,
value: "ስድሳኛ"
},
{
number: 50,
value: "ሃምሳኛ"
},
{
number: 40,
value: "አርባኛ"
},
{
number: 30,
value: "ሰላሳኛ"
},
{
number: 20,
value: "ሃያኛ"
},
{
number: 19,
value: "አስራ ዘጠነኛ"
},
{
number: 18,
value: "አስራ ስምንተኛ"
},
{
number: 17,
value: "አስራ ሰባተኛ"
},
{
number: 16,
value: "አስራ ስድስተኛ"
},
{
number: 15,
value: "አስራ አምስተኛ"
},
{
number: 14,
value: "አስራ አራተኛ"
},
{
number: 13,
value: "አስራ ሦስተኛ"
},
{
number: 12,
value: "አስራ ሁለተኛ"
},
{
number: 11,
value: "አስራ አንደኛ"
},
{
number: 10,
value: "አስረኛ"
},
{
number: 9,
value: "ዘጠነኛ"
},
{
number: 8,
value: "ስምንተኛ"
},
{
number: 7,
value: "ሰባተኛ"
},
{
number: 6,
value: "ስድስተኛ"
},
{
number: 5,
value: "አምስተኛ"
},
{
number: 4,
value: "አራተኛ"
},
{
number: 3,
value: "ሦስተኛ"
},
{
number: 2,
value: "ሁለተኛ"
},
{
number: 1,
value: "አንደኛ"
},
{
number: 0,
value: "ዜሮኛ"
}
]
};
};
/**
* ToWords class pre-configured for this locale.
* This is a lightweight version that only bundles this specific locale.
*
* @example
* import { ToWords } from 'to-words/am-ET';
* const tw = new ToWords();
* tw.convert(1234);
*/
var ToWords$131 = class extends ToWordsCore {
constructor(options = {}) {
super(options);
this.setLocale(Locale$130);
}
};
const instance$130 = new ToWords$131();
//#endregion
//#region src/locales/ar-AE.ts
var Locale$129 = class {
config = {
currency: {
name: "درهم",
plural: "درهم",
singular: "درهم",
symbol: "د.إ",
numberSpecificForms: {
1: "درهم واحد",
2: "درهمان",
3: "ثلاثة دراهم",
4: "أربعة دراهم",
5: "خمسة دراهم",
6: "ستة دراهم",
7: "سبعة دراهم",
8: "ثمانية دراهم",
9: "تسعة دراهم",
10: "عشرة دراهم"
},
fractionalUnit: {
name: "فلس",
plural: "فلس",
singular: "فلس",
numberSpecificForms: {
1: "فلس واحد",
2: "فلسان",
3: "ثلاثة فلوس",
4: "أربعة فلوس",
5: "خمسة فلوس",
6: "ستة فلوس",
7: "سبعة فلوس",
8: "ثمانية فلوس",
9: "تسعة فلوس",
10: "عشرة فلوس"
},
symbol: ""
}
},
texts: {
and: "و",
minus: "سالب",
only: "فقط لا غير",
point: "فاصلة"
},
numberWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "كوادريليون"
},
{
number: 0xe8d4a51000,
value: "تريليون"
},
{
number: 1e9,
value: "مليار"
},
{
number: 1e6,
value: "مليون"
},
{
number: 1e3,
value: "ألف"
},
{
number: 900,
value: "تسعمائة"
},
{
number: 800,
value: "ثمانمائة"
},
{
number: 700,
value: "سبعمائة"
},
{
number: 600,
value: "ستمائة"
},
{
number: 500,
value: "خمسمائة"
},
{
number: 400,
value: "أربعمائة"
},
{
number: 300,
value: "ثلاثمائة"
},
{
number: 200,
value: "مائتان"
},
{
number: 100,
value: "مائة"
},
{
number: 99,
value: "تسعة و تسعون",
feminineValue: "تسع و تسعون"
},
{
number: 98,
value: "ثمانية و تسعون"
},
{
number: 97,
value: "سبعة و تسعون"
},
{
number: 96,
value: "ستة و تسعون"
},
{
number: 95,
value: "خمسة و تسعون"
},
{
number: 94,
value: "أربعة و تسعون"
},
{
number: 93,
value: "ثلاثة و تسعون"
},
{
number: 92,
value: "اثنان و تسعون"
},
{
number: 91,
value: "واحد و تسعون"
},
{
number: 90,
value: "تسعون"
},
{
number: 89,
value: "تسعة و ثمانون"
},
{
number: 88,
value: "ثمانية و ثمانون"
},
{
number: 87,
value: "سبعة و ثمانون"
},
{
number: 86,
value: "ستة و ثمانون"
},
{
number: 85,
value: "خمسة و ثمانون"
},
{
number: 84,
value: "أربعة و ثمانون"
},
{
number: 83,
value: "ثلاثة و ثمانون"
},
{
number: 82,
value: "اثنان و ثمانون"
},
{
number: 81,
value: "واحد و ثمانون"
},
{
number: 80,
value: "ثمانون"
},
{
number: 79,
value: "تسعة و سبعون"
},
{
number: 78,
value: "ثمانية و سبعون"
},
{
number: 77,
value: "سبعة و سبعون"
},
{
number: 76,
value: "ستة و سبعون"
},
{
number: 75,
value: "خمسة و سبعون"
},
{
number: 74,
value: "أربعة و سبعون"
},
{
number: 73,
value: "ثلاثة و سبعون"
},
{
number: 72,
value: "اثنان و سبعون"
},
{
number: 71,
value: "واحد و سبعون"
},
{
number: 70,
value: "سبعون"
},
{
number: 69,
value: "تسعة و ستون"
},
{
number: 68,
value: "ثمانية و ستون"
},
{
number: 67,
value: "سبعة و ستون"
},
{
number: 66,
value: "ستة و ستون"
},
{
number: 65,
value: "خمسة و ستون"
},
{
number: 64,
value: "أربعة و ستون"
},
{
number: 63,
value: "ثلاثة و ستون"
},
{
number: 62,
value: "اثنان و ستون"
},
{
number: 61,
value: "واحد و ستون"
},
{
number: 60,
value: "ستون"
},
{
number: 59,
value: "تسعة و خمسون"
},
{
number: 58,
value: "ثمانية و خمسون"
},
{
number: 57,
value: "سبعة و خمسون"
},
{
number: 56,
value: "ستة و خمسون"
},
{
number: 55,
value: "خمسة و خمسون"
},
{
number: 54,
value: "أربعة و خمسون"
},
{
number: 53,
value: "ثلاثة و خمسون"
},
{
number: 52,
value: "اثنان و خمسون"
},
{
number: 51,
value: "واحد و خمسون"
},
{
number: 50,
value: "خمسون"
},
{
number: 49,
value: "تسعة و أربعون"
},
{
number: 48,
value: "ثمانية و أربعون"
},
{
number: 47,
value: "سبعة و أربعون"
},
{
number: 46,
value: "ستة و أربعون"
},
{
number: 45,
value: "خمسة و أربعون"
},
{
number: 44,
value: "أربعة و أربعون"
},
{
number: 43,
value: "ثلاثة و أربعون"
},
{
number: 42,
value: "اثنان و أربعون"
},
{
number: 41,
value: "واحد و أربعون"
},
{
number: 40,
value: "أربعون"
},
{
number: 39,
value: "تسعة و ثلاثون"
},
{
number: 38,
value: "ثمانية و ثلاثون"
},
{
number: 37,
value: "سبعة و ثلاثون"
},
{
number: 36,
value: "ستة و ثلاثون"
},
{
number: 35,
value: "خمسة و ثلاثون"
},
{
number: 34,
value: "أربعة و ثلاثون"
},
{
number: 33,
value: "ثلاثة و ثلاثون"
},
{
number: 32,
value: "اثنان و ثلاثون"
},
{
number: 31,
value: "واحد و ثلاثون"
},
{
number: 30,
value: "ثلاثون"
},
{
number: 29,
value: "تسعة و عشرون"
},
{
number: 28,
value: "ثمانية و عشرون"
},
{
number: 27,
value: "سبعة و عشرون"
},
{
number: 26,
value: "ستة و عشرون"
},
{
number: 25,
value: "خمسة و عشرون"
},
{
number: 24,
value: "أربعة و عشرون"
},
{
number: 23,
value: "ثلاثة و عشرون"
},
{
number: 22,
value: "اثنان و عشرون"
},
{
number: 21,
value: "واحد و عشرون",
feminineValue: "واحدة و عشرون"
},
{
number: 20,
value: "عشرون"
},
{
number: 19,
value: "تسعة عشر",
feminineValue: "تسع عشرة"
},
{
number: 18,
value: "ثمانية عشر",
feminineValue: "ثماني عشرة"
},
{
number: 17,
value: "سبعة عشر",
feminineValue: "سبع عشرة"
},
{
number: 16,
value: "ستة عشر",
feminineValue: "ست عشرة"
},
{
number: 15,
value: "خمسة عشر",
feminineValue: "خمس عشرة"
},
{
number: 14,
value: "أربعة عشر",
feminineValue: "أربع عشرة"
},
{
number: 13,
value: "ثلاثة عشر",
feminineValue: "ثلاث عشرة"
},
{
number: 12,
value: "اثنا عشر",
feminineValue: "اثنتا عشرة"
},
{
number: 11,
value: "أحد عشر",
feminineValue: "إحدى عشرة"
},
{
number: 10,
value: "عشرة",
feminineValue: "عشر"
},
{
number: 9,
value: "تسعة",
feminineValue: "تسع"
},
{
number: 8,
value: "ثمانية",
feminineValue: "ثماني"
},
{
number: 7,
value: "سبعة",
feminineValue: "سبع"
},
{
number: 6,
value: "ستة",
feminineValue: "ست"
},
{
number: 5,
value: "خمسة",
feminineValue: "خمس"
},
{
number: 4,
value: "أربعة",
feminineValue: "أربع"
},
{
number: 3,
value: "ثلاثة",
feminineValue: "ثلاث"
},
{
number: 2,
value: "اثنان",
feminineValue: "اثنتان"
},
{
number: 1,
value: "واحد",
feminineValue: "واحدة"
},
{
number: 0,
value: "صفر"
}
],
pluralForms: {
1e3: {
dual: "ألفان",
paucal: "آلاف",
plural: "ألف"
},
1e6: {
dual: "مليونان",
paucal: "ملايين",
plural: "مليون"
},
1e9: {
dual: "ملياران",
paucal: "مليارات",
plural: "مليار"
},
0xe8d4a51000: {
dual: "تريليونان",
paucal: "تريليونات",
plural: "تريليون"
}
},
paucalConfig: {
min: 3,
max: 10
},
ignoreOneForWords: [
"ألف",
"مائة",
"مليون",
"مليار",
"تريليون",
"كوادريليون"
],
namedLessThan1000: true,
splitWord: "و",
ordinalWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "الكوادريليون"
},
{
number: 0xe8d4a51000,
value: "التريليون"
},
{
number: 1e9,
value: "المليار"
},
{
number: 1e6,
value: "المليون"
},
{
number: 1e3,
value: "الألف"
},
{
number: 100,
value: "المائة"
},
{
number: 90,
value: "التسعون"
},
{
number: 80,
value: "الثمانون"
},
{
number: 70,
value: "السبعون"
},
{
number: 60,
value: "الستون"
},
{
number: 50,
value: "الخمسون"
},
{
number: 40,
value: "الأربعون"
},
{
number: 30,
value: "الثلاثون"
},
{
number: 20,
value: "العشرون"
},
{
number: 19,
value: "التاسع عشر"
},
{
number: 18,
value: "الثامن عشر"
},
{
number: 17,
value: "السابع عشر"
},
{
number: 16,
value: "السادس عشر"
},
{
number: 15,
value: "الخامس عشر"
},
{
number: 14,
value: "الرابع عشر"
},
{
number: 13,
value: "الثالث عشر"
},
{
number: 12,
value: "الثاني عشر"
},
{
number: 11,
value: "الحادي عشر"
},
{
number: 10,
value: "العاشر"
},
{
number: 9,
value: "التاسع"
},
{
number: 8,
value: "الثامن"
},
{
number: 7,
value: "السابع"
},
{
number: 6,
value: "السادس"
},
{
number: 5,
value: "الخامس"
},
{
number: 4,
value: "الرابع"
},
{
number: 3,
value: "الثالث"
},
{
number: 2,
value: "الثاني"
},
{
number: 1,
value: "الأول"
},
{
number: 0,
value: "الصفر"
}
]
};
};
/**
* ToWords class pre-configured for this locale.
* This is a lightweight version that only bundles this specific locale.
*
* @example
* import { ToWords } from 'to-words/ar-AE';
* const tw = new ToWords();
* tw.convert(1234);
*/
var ToWords$130 = class extends ToWordsCore {
constructor(options = {}) {
super(options);
this.setLocale(Locale$129);
}
};
const instance$129 = new ToWords$130();
//#endregion
//#region src/locales/ar-DZ.ts
var Locale$128 = class {
config = {
currency: {
name: "دينار جزائري",
plural: "دينار جزائري",
singular: "دينار جزائري",
symbol: "د.ج",
numberSpecificForms: {
1: "دينار واحد",
2: "ديناران",
3: "ثلاثة دنانير",
4: "أربعة دنانير",
5: "خمسة دنانير",
6: "ستة دنانير",
7: "سبعة دنانير",
8: "ثمانية دنانير",
9: "تسعة دنانير",
10: "عشرة دنانير"
},
fractionalUnit: {
name: "سنتيم",
plural: "سنتيم",
singular: "سنتيم",
numberSpecificForms: {
1: "سنتيم واحد",
2: "سنتيمان",
3: "ثلاثة سنتيمات",
4: "أربعة سنتيمات",
5: "خمسة سنتيمات",
6: "ستة سنتيمات",
7: "سبعة سنتيمات",
8: "ثمانية سنتيمات",
9: "تسعة سنتيمات",
10: "عشرة سنتيمات"
},
symbol: ""
}
},
texts: {
and: "و",
minus: "سالب",
only: "فقط لا غير",
point: "فاصلة"
},
numberWordsMapping: [
{
number: 0x38d7ea4c68000,
value: "كوادريليون"
},
{
number: 0xe8d4a51000,
value: "تريليون"
},
{
number: 1e9,
value: "مليار"
},
{
number: 1e6,
value: "مليون"
},
{
number: 1e3,
value: "ألف"
},
{
number: 900,
value: "تسعمائة"
},
{
number: 800,
value: "ثمانمائة"
},
{
number: 700,
value: "سبعمائة"
},
{
number: 600,
value: "ستمائة"
},
{
number: 500,
value: "خمسمائة"
},
{
number: 400,
value: "أربعمائة"
},
{
number: 300,
value: "ثلاثمائة"
},
{
number: 200,
value: "مائتان"
},
{
number: 100,
value: "مائة"
},
{
number: 99,
value: "تسعة و تسعون",
feminineValue: "تسع و تسعون"
},
{
number: 98,
value: "ثمانية و تسعون"
},
{
number: 97,
value: "سبعة و تسعون"
},
{
number: 96,
value: "ستة و تسعون"
},
{
number: 95,
value: "خمسة و تسعون"
},
{
number: 94,
value: "أربعة و تسعون"
},
{
number: 93,
value: "ثلاثة و تسعون"
},
{
number: 92,
value: "اثنان و تسعون"
},
{
number: 91,
value: "واحد و تسعون"
},
{
number: 90,
value: "تسعون"
},
{
number: 89,
value: "تسعة و ثمانون"
},
{
number: 88,
value: "ثمانية و ثمانون"
},
{
number: 87,
value: "سبعة و ثمانون"
},
{
number: 86,
value: "ستة و ثمانون"
},
{
number: 85,
value: "خمسة و ثمانون"
},
{
number: 84,
value: "أربعة و ثمانون"
},
{
number: 83,
value: "ثلاثة و ثمانون"
},
{
number: 82,
value: "اثنان و ثمانون"
},
{
number: 81,
value: "واحد و ثمانون"
},
{
number: 80,
value: "ثمانون"
},
{
number: 79,
value: "تسعة و سبعون"
},
{
number: 78,
value: "ثمانية و سبعون"
},
{
number: 77,
value: "سبعة و سبعون"
},
{
number: 76,
value: "ستة و سبعون"
},
{
number: 75,
value: "خمسة و سبعون"
},
{
number: 74,
value: "أربعة و سبعون"
},
{
number: 73,
value: "ثلاثة و سبعون"
},
{
number: 72,
value: "اثنان و سبعون"
},
{
number: 71,
value: "واحد و سبعون"
},
{
number: 70,
value: "سبعون"
},
{
number: 69,
value: "تسعة و ستون"
},
{
number: 68,
value: "ثمانية و ستون"
},
{
number: 67,
value: "سبعة و ستون"
},
{
number: 66,
value: "ستة و ستون"
},
{
number: 65,
value: "خمسة و ستون"
},
{
number: 64,
value: "أربعة و ستون"
},
{
number: 63,
value: "ثلاثة و ستون"
},
{
number: 62,
value: "اثنان و ستون"
},
{
number: 61,
value: "واحد و ستون"
},
{
number: 60,
value: "ستون"
},
{
number: 59,
value: "تسعة و خمسون"
},
{
number: 58,
value: "ثمانية و خمسون"
},
{
number: 57,
value: "سبعة و خمسون"
},
{
number: 56,
value: "ستة و خمسون"
},
{
number: 55,
value: "خمسة و خمسون"
},
{
number: 54,
value: "أربعة و خمسون"
},
{
number: 53,
value: "ثلاثة و خمسون"
},
{
number: 52,
value: "اثنان و خمسون"
},
{
number: 51,
value: "واحد و خمسون"
},
{
number: 50,
value: "خمسون"
},
{
number: 49,
value: "تسعة و أربعون"
},
{
number: 48,
value: "ثمانية و أربعون"
},
{
number: 47,
value: "سبعة و أربعون"
},
{
number: 46,
value: "ستة و أربعون"
},
{
number: 45,
value: "خمسة و أربعون"
},
{
number: 44,
value: "أربعة و أربعون"
},
{
number: 43,
value: "ثلاثة و أربعون"
},
{
number: 42,
value: "اثنان و أربعون"
},
{
number: 41,
value: "واحد و أربعون"
},
{
number: 40,
value: "أربعون"
},
{
number: 39,
value: "تسعة و ثلاثون"
},
{
number: 38,
value: "ثمانية و ثلاثون"
},
{
number: 37,
value: "سبعة و ثلاثون"
},
{
number: 36,
value: "ستة و ثلاثون"
},
{
number: 35,
value: "خمسة و ثلاثون"
},
{
number: 34,
value: "أربعة و ثلاثون"
},
{
number: 33,
value: "ثلاثة و ثلاثون"
},
{
number: 32,
value: "اثنان و ثلاثون"
},
{
number: 31,
value: "واحد و ثلاثون"
},
{
number: 30,
value: "ثلاثون"
},
{
number: 29,
value: "تسعة و عشرون"
},
{
number: 28,
value: "ثمانية و عشرون"
},
{
number: 27,
value: "سبعة و عشرون"
},
{
number: 26,
value: "ستة و عشرون"
},
{
number: 25,
value: "خمسة و عشرون"
},
{
number: 24,
value: "أربعة و عشرون"
},
{
number: 23,
value: "ثلاثة و عشرون"
},
{
number: 22,
value: "اثنان و عشرون"
},
{
number: 21,
value: "واحد و عشرون",
feminineValue: "واحدة و عشرون"
},
{
number: 20,
value: "عشرون"
},
{
number: 19,
value: "تسعة عشر",
feminineValue: "تسع عشرة"
},
{
number: 18,
value: "ثمانية عشر",
feminineValue: "ثماني عشرة"
},
{
number: 17,
value: "سبعة عشر",
feminineValue: "سبع عشرة"
},
{
number: 16,
value: "ستة عشر",
feminineValue: "ست عشرة"
},
{
number: 15,
value: "خمسة عشر",
feminineValue: "خمس عشرة"
},
{
number: 14,
value: "أربعة عشر",
feminineValue: "أربع عشرة"
},
{
number: 13,
value: "ثلاثة عشر",
feminineValue: "ثلاث عشرة"
},
{
number: 12,
value: "اثنا عشر",
feminineValue: "اثنتا