{"version":3,"file":"numbers.cjs","sources":["../../../../src/tools/formatters/numbers.ts"],"sourcesContent":["import { Type } from '../type'\n\n/**\n * Locale-aware number formatter built on `Intl.NumberFormat`.\n *\n * A singleton — obtain it through `useFormatter()` rather than constructing\n * it directly (the constructor is guarded and throws `TypeError`). Integers\n * are formatted with no fraction digits and non-integers with exactly two.\n */\nexport default class FormatterNumbers {\n  private static isInternalConstructing: boolean = false\n  private static instance: FormatterNumbers | null = null\n  private _defLocale: null | string = null\n  private constructor() {\n    if (!FormatterNumbers.isInternalConstructing) {\n      throw new TypeError('FormatterNumber is not constructable')\n    }\n    FormatterNumbers.isInternalConstructing = false\n  }\n\n  /**\n   * Returns the shared `FormatterNumbers` singleton, creating it on first use.\n   *\n   * @returns The shared instance.\n   */\n  static getInstance(): FormatterNumbers {\n    if (!FormatterNumbers.instance) {\n      FormatterNumbers.isInternalConstructing = true\n      FormatterNumbers.instance = new FormatterNumbers()\n    }\n    return FormatterNumbers.instance\n  }\n\n  /**\n   * Sets the default locale used by {@link format} when no explicit locale is\n   * passed. Affects every consumer of the shared instance.\n   *\n   * @param locale - A BCP 47 locale tag (e.g. `'de'`, `'ru'`).\n   */\n  setDefLocale(locale: string) {\n    this._defLocale = locale\n  }\n\n  /**\n   * Formats a number for the given (or default) locale.\n   *\n   * The locale falls back to the value set via {@link setDefLocale}, then to\n   * `navigator.language`, then to `'en'`. Integers get no fraction digits and\n   * non-integers exactly two. For `ru`-based locales the decimal comma is\n   * normalised to a dot.\n   *\n   * @param value - The number to format.\n   * @param locale - Optional BCP 47 locale tag overriding the default.\n   * @returns The formatted number.\n   *\n   * @example\n   * ```ts\n   * formatterNumber.format(1234.5)        // '1,234.50'\n   * formatterNumber.format(1234.5, 'de')  // '1.234,50'\n   * ```\n   */\n  format(value: number, locale?: string): string {\n    let formatter\n    if (typeof locale === 'undefined' || !Type.isStringFilled(locale)) {\n      locale = Type.isStringFilled(this._defLocale)\n        ? this._defLocale || 'en'\n        : (\n            typeof navigator === 'undefined'\n              ? 'en'\n              : navigator?.language || 'en'\n          )\n    }\n\n    if (Number.isInteger(value)) {\n      formatter = new Intl.NumberFormat(locale, {\n        minimumFractionDigits: 0,\n        maximumFractionDigits: 0\n      })\n    } else {\n      formatter = new Intl.NumberFormat(locale, {\n        minimumFractionDigits: 2,\n        maximumFractionDigits: 2\n      })\n    }\n\n    let result = formatter.format(value)\n    if (locale.includes('ru')) {\n      result = result.replace(',', '.')\n    }\n\n    return result\n  }\n}\n"],"names":["Type"],"mappings":";;;;;;;;;;;;;;;;AASA,MAAqB,gBAAA,CAAiB;AAAA,EATtC;AASsC,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EACpC,OAAe,sBAAA,GAAkC,KAAA;AAAA,EACjD,OAAe,QAAA,GAAoC,IAAA;AAAA,EAC3C,UAAA,GAA4B,IAAA;AAAA,EAC5B,WAAA,GAAc;AACpB,IAAA,IAAI,CAAC,iBAAiB,sBAAA,EAAwB;AAC5C,MAAA,MAAM,IAAI,UAAU,sCAAsC,CAAA;AAAA,IAC5D;AACA,IAAA,gBAAA,CAAiB,sBAAA,GAAyB,KAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAA,GAAgC;AACrC,IAAA,IAAI,CAAC,iBAAiB,QAAA,EAAU;AAC9B,MAAA,gBAAA,CAAiB,sBAAA,GAAyB,IAAA;AAC1C,MAAA,gBAAA,CAAiB,QAAA,GAAW,IAAI,gBAAA,EAAiB;AAAA,IACnD;AACA,IAAA,OAAO,gBAAA,CAAiB,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAA,EAAgB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAA,CAAO,OAAe,MAAA,EAAyB;AAC7C,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAACA,SAAA,CAAK,cAAA,CAAe,MAAM,CAAA,EAAG;AACjE,MAAA,MAAA,GAASA,SAAA,CAAK,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA,GACxC,IAAA,CAAK,UAAA,IAAc,IAAA,GAEjB,OAAO,SAAA,KAAc,WAAA,GACjB,IAAA,GACA,WAAW,QAAA,IAAY,IAAA;AAAA,IAEnC;AAEA,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC3B,MAAA,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QACxC,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACxB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QACxC,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;;"}