UNPKG

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
"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: "اثنتا