import { N as NumeralSystem } from '../types-CK7PVYeU.js'; export { C as CountedNoun, c as countedNoun } from '../count-C4U_RQ2h.js'; interface FormatNumberOptions { /** BCP-47 locale. Default `"ar"`. */ locale?: string; /** Digit shaping. Default `"latn"` — Eastern Arabic digits are opt-in. */ numerals?: NumeralSystem; /** Fixed number of fraction digits (sets both min and max). */ fractionDigits?: number; minimumFractionDigits?: number; maximumFractionDigits?: number; /** Thousands grouping. Default `true`. */ grouping?: boolean; /** Number style. Default `"decimal"`. */ style?: "decimal" | "percent"; signDisplay?: "auto" | "always" | "exceptZero" | "never"; /** Compact / scientific notation. Default `"standard"`. */ notation?: "standard" | "compact" | "scientific" | "engineering"; /** Compact display style when `notation` is `"compact"`. Default `"short"`. */ compactDisplay?: "short" | "long"; } /** * Locale-aware number formatting on top of `Intl.NumberFormat`. Eastern Arabic * numerals are never forced — pass `numerals: "arab"` to opt in. * * @example formatNumber(1234567.89) // "1,234,567.89" * @example formatNumber(1234.5, { numerals: "arab" }) // "١٬٢٣٤٫٥" * @example formatNumber(0.42, { style: "percent" }) // "42%" */ declare function formatNumber(value: number, options?: FormatNumberOptions): string; /** Format a ratio (0.42 → "42%") with the same options as {@link formatNumber}. */ declare function formatPercent(value: number, options?: Omit): string; /** * Format a number in compact notation ("short" by default): 1,200,000 → "1.2M" * or in Arabic "١٫٢ مليون" (when `numerals: "arab"` and an Arabic locale). * * @example formatCompact(1_200_000) // "1.2M" * @example formatCompact(1_200_000, { locale: "ar" }) // "1.2 مليون" * @example formatCompact(1_200_000, { numerals: "arab" }) // "١٫٢ مليون" */ declare function formatCompact(value: number, options?: Omit & { compactDisplay?: "short" | "long"; }): string; /** Arabic-Indic digits ٠١٢٣٤٥٦٧٨٩ (U+0660–U+0669), used across the Arab world. */ declare const ARABIC_INDIC_DIGITS: readonly string[]; /** Extended Arabic-Indic digits ۰۱۲۳۴۵۶۷۸۹ (U+06F0–U+06F9), used in Persian/Urdu. */ declare const EXTENDED_ARABIC_INDIC_DIGITS: readonly string[]; /** Convert Western digits (0-9) in `input` to Eastern Arabic-Indic digits. */ declare function toArabicDigits(input: string): string; /** * Convert Eastern Arabic-Indic and Extended (Persian) digits in `input` back to * Western digits (0-9). Useful before parsing user-entered numbers. */ declare function toLatinDigits(input: string): string; /** * Parse a localized number string — including Eastern Arabic digits, Arabic * thousands separators (٬) and Arabic decimal separator (٫) — back to a JS * `number`. Returns `NaN` when the input cannot be parsed. * * @example parseNumber("١٬٢٣٤٫٥٦") // 1234.56 * @example parseNumber("1,234.56") // 1234.56 * @example parseNumber("٢٠٢٦") // 2026 */ declare function parseNumber(input: string): number; /** * Parse a formatted currency string back to its numeric value. Strips known * Arab currency symbols, ISO codes, bidi controls and whitespace before * delegating to {@link parseNumber}. * * @example parseCurrency("1,234.50 ر.س") // 1234.5 * @example parseCurrency("١٬٢٣٤٫٥٠٠ د.ك") // 1234.5 * @example parseCurrency("(500.00 SAR)") // -500 (accounting notation) */ declare function parseCurrency(input: string): number; /** * Convert an integer to its Arabic word representation. * * Arabic number words follow strict grammar rules: * - Ones 3–9 use gender polarity (opposite gender to the counted noun). * - Teens 11–19 are compound; 10/11/12 have special forms. * - Scale words (thousands, millions…) use singular (1), dual (2), * plural (3–10), or tanwin-singular (11–99) forms. */ type Gender$1 = "male" | "female"; interface ArabicWordsOptions { /** * Grammatical gender of the counted noun. Affects ones (1–2) and the * final group (3–9). Default `"male"`. * * Use `"male"` for masculine nouns (ريال، دينار…) and most standalone * numbers. Use `"female"` for feminine nouns (ليرة، روبية…). */ gender?: Gender$1; /** Prepend "سالب" for negative values. Default `true`. */ negative?: boolean; /** * How to read a fractional part, after the decimal word "فاصلة". * - `"off"` — truncate to the integer (default; backward compatible). * - `"digits"` — read each fractional digit (3.14 → "ثلاثة فاصلة واحد أربعة"). * - `"number"` — read the fraction as a whole number (3.14 → "ثلاثة فاصلة أربعة عشر"). */ fraction?: "off" | "digits" | "number"; } /** * Convert a number to its Arabic word representation. * * Integers from 0 to ±999 trillion are spelled in full. By default a fractional * part is truncated; pass {@link ArabicWordsOptions.fraction} to read it too. * * @example arabicToWords(0) // "صفر" * @example arabicToWords(11) // "أحد عشر" * @example arabicToWords(25) // "خمسة وعشرون" * @example arabicToWords(5000) // "خمسة آلاف" * @example arabicToWords(1_234_567) * // "مليون ومئتان وأربعة وثلاثون ألفاً وخمسمئة وسبعة وستون" * @example arabicToWords(-42) // "سالب اثنان وأربعون" * @example arabicToWords(5, { gender: "female" }) // "خمس" * @example arabicToWords(3.14, { fraction: "digits" }) // "ثلاثة فاصلة واحد أربعة" * @example arabicToWords(3.5, { fraction: "number" }) // "ثلاثة فاصلة خمسة" */ declare function arabicToWords(n: number, options?: ArabicWordsOptions): string; /** * Common Arabic fraction words (الكسور): نصف، ثلث، ربع … * * Denominators 2–10 have dedicated nouns. The numerator follows the usual * counted-noun pattern: 1 → singular (ربع), 2 → dual (ربعان), 3–10 → number + * plural (ثلاثة أرباع). */ /** * Spell a simple fraction in Arabic words. * * Supports denominators 2–10 (the fractions with dedicated nouns). Returns an * empty string for unsupported denominators or non-positive numerators. * * @example arabicFraction(1, 2) // "نصف" * @example arabicFraction(1, 4) // "ربع" * @example arabicFraction(3, 4) // "ثلاثة أرباع" * @example arabicFraction(2, 3) // "ثلثان" * @example arabicFraction(5, 8) // "خمسة أثمان" */ declare function arabicFraction(numerator: number, denominator: number): string; /** * Arabic ordinal numbers (الأعداد الترتيبية). * * Ordinals 1–19 have dedicated forms; 20–99 combine a unit ordinal with a tens * word ("الخامس والعشرون"). Each form agrees in gender with the noun it * describes. Values ≥ 100 fall back to a definite cardinal ("ال" + words), * which is the form used in everyday writing (الصفحة المئة وخمسة وعشرون). */ type Gender = "male" | "female"; interface ArabicOrdinalOptions { /** Gender of the described noun. Default `"male"`. */ gender?: Gender; /** Include the definite article ال. Default `true`. */ definite?: boolean; } /** * Return the Arabic ordinal word for a positive integer. * * @example arabicOrdinal(1) // "الأول" * @example arabicOrdinal(2) // "الثاني" * @example arabicOrdinal(11) // "الحادي عشر" * @example arabicOrdinal(25) // "الخامس والعشرون" * @example arabicOrdinal(1, { gender: "female" }) // "الأولى" * @example arabicOrdinal(3, { definite: false }) // "ثالث" * @example arabicOrdinal(100) // "المئة" */ declare function arabicOrdinal(n: number, options?: ArabicOrdinalOptions): string; /** * Spell a time span in grammatical Arabic ("ساعتان وخمس دقائق"). * * Unlike `Intl.DurationFormat` (still poorly supported), this produces the fully * inflected spoken form: it picks the largest non-zero units, applies dual / * plural / accusative agreement to each unit noun, and joins them with و. */ type DurationUnit = "day" | "hour" | "minute" | "second"; interface FormatDurationOptions { /** Interpret the input as `"ms"` (default) or `"s"`. */ input?: "ms" | "s"; /** Maximum number of units to include, largest first. Default `2`. */ largest?: number; /** Restrict the units considered. Default day/hour/minute/second. */ units?: DurationUnit[]; } /** * Format a duration as spelled Arabic. * * @example formatDuration(7_500_000) // "ساعتان وخمس دقائق" * @example formatDuration(90, { input: "s" }) // "دقيقة واحدة وثلاثون ثانيةً" * @example formatDuration(3_600_000, { largest: 1 })// "ساعة واحدة" * @example formatDuration(500) // "أقل من ثانية" */ declare function formatDuration(value: number, options?: FormatDurationOptions): string; /** * Format a byte count as a human-readable data size with Arabic (or Latin) * unit names: 1536 → "1.5 كيلوبايت". */ interface FormatFileSizeOptions { /** BCP-47 locale for the number. Default `"ar"`. */ locale?: string; /** Digit shaping. Default `"latn"`. */ numerals?: NumeralSystem; /** Divisor: `1024` (binary, default) or `1000` (decimal/SI). */ base?: 1024 | 1000; /** Maximum fraction digits for the scaled value. Default `1`. */ precision?: number; /** Unit vocabulary. `"arabic"` (default) or `"latin"` (B/KB/MB…). */ unitStyle?: "arabic" | "latin"; } /** * Format a byte count with Arabic data-size units. * * @example formatFileSize(0) // "0 بايت" * @example formatFileSize(1536) // "1.5 كيلوبايت" * @example formatFileSize(5_242_880) // "5 ميجابايت" * @example formatFileSize(1_500_000, { base: 1000 }) // "1.5 ميجابايت" * @example formatFileSize(2048, { numerals: "arab" }) // "٢ كيلوبايت" * @example formatFileSize(2048, { unitStyle: "latin" })// "2 KB" */ declare function formatFileSize(bytes: number, options?: FormatFileSizeOptions): string; interface FormatRelativeTimeOptions { /** BCP-47 locale. Default `"ar"`. */ locale?: string; /** Digit shaping. Default `"latn"`. */ numerals?: NumeralSystem; /** * - `"auto"` — uses "yesterday" / "tomorrow" style when available. * - `"always"` — always numeric: "1 يوم مضى". * Default `"auto"`. */ numeric?: "auto" | "always"; /** Width of the unit name. Default `"long"`. */ style?: "long" | "short" | "narrow"; } /** * Format the time difference between `date` and `base` as a human-readable * relative string ("منذ ٣ أيام", "بعد ساعة", "3 days ago"). * * Picks the most appropriate unit automatically. Works on all engines via * `Intl.RelativeTimeFormat`. * * @example formatRelativeTime(new Date(Date.now() - 3 * 86400_000)) * // "منذ ٣ أيام" (locale "ar", numerals "latn" → "منذ 3 أيام") * @example formatRelativeTime(new Date(Date.now() + 3600_000), new Date(), { locale: "en" }) * // "in 1 hour" */ declare function formatRelativeTime(date: Date, base?: Date, options?: FormatRelativeTimeOptions): string; export { ARABIC_INDIC_DIGITS, type ArabicOrdinalOptions, type ArabicWordsOptions, type DurationUnit, EXTENDED_ARABIC_INDIC_DIGITS, type FormatDurationOptions, type FormatFileSizeOptions, type FormatNumberOptions, type FormatRelativeTimeOptions, arabicFraction, arabicOrdinal, arabicToWords, formatCompact, formatDuration, formatFileSize, formatNumber, formatPercent, formatRelativeTime, parseCurrency, parseNumber, toArabicDigits, toLatinDigits };