UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

103 lines 3.39 kB
import { LOCALE } from "../../../shared/defaults.js"; import { warn, escapeRegexChars } from "../../../shared/component-helper.js"; import { IS_MAC } from "../../../shared/helpers.js"; import { ABSENT_VALUE_FORMAT, NUMBER_MINUS } from "./constants.js"; import { getFallbackCurrencyDisplay } from "./currencyDisplay.js"; function toIntlOptions({ decimals: _decimals, ...rest }) { return rest; } export function formatToParts({ number, locale = null, options = null }) { if (typeof Intl !== 'undefined' && typeof Intl.NumberFormat === 'function') { try { const inst = new Intl.NumberFormat(locale || LOCALE, toIntlOptions(options || {})); if (typeof inst.formatToParts === 'function') { return inst.formatToParts(Number(number)); } else { return [{ value: inst.format(Number(number)), type: 'unknown' }]; } } catch (e) { warn(e); } } return [{ value: String(number), type: 'unknown' }]; } export function alignCurrencySymbol(output, currencyDisplay) { if (typeof output === 'string' && currencyDisplay === 'name') { output = output.replace(/(nor[^\s]+?)\s(\w+)/i, '$2'); } return String(output); } export const prepareMinus = (display, locale) => { if (!(locale && /(no|nb|nn)$/i.test(locale))) { return display; } const first = display[0]; const second = display[1]; if (first === '-' && second === '-') { return display; } const reg = `^(${NUMBER_MINUS})`; if (new RegExp(reg).test(first)) { if (parseFloat(second) > 0) { display = display.replace(new RegExp(reg + '(.*)'), '-$2'); } else { display = display.replace(new RegExp(reg + '([^0-9]+)(.*)'), '$2-$3'); } } return display; }; export const enhanceSR = (value, aria, locale) => { if (IS_MAC && Math.abs(parseFloat(String(value))) <= 99999) { aria = String(aria).replace(/\s([0-9])/g, '$1'); } aria = prepareMinus(aria, locale); return aria; }; function replaceNaNWithDash(number) { const string = String(number); const replaced = string.replace(/NaN/, ABSENT_VALUE_FORMAT); if (!/NaN/.test(string)) { return replaced; } const escapedDash = escapeRegexChars(ABSENT_VALUE_FORMAT); return replaced.replace(new RegExp(`([^\\s])${escapedDash}`, 'g'), `$1 ${ABSENT_VALUE_FORMAT}`); } export const formatNumberCore = (number, locale, options = {}, formatter = null) => { try { if (options.currencyDisplay) { options.currencyDisplay = getFallbackCurrencyDisplay(locale, options.currencyDisplay); } delete options.decimals; if (formatter) { number = formatToParts({ number, locale, options }).map(formatter).reduce((acc, { value }) => acc + value, ''); } else if (typeof Number !== 'undefined' && typeof Number.toLocaleString === 'function') { number = parseFloat(String(number)).toLocaleString(locale || LOCALE, toIntlOptions(options)); } if (new RegExp(`^(${NUMBER_MINUS})(0|0[^\\d]|0\\s.*)$`).test(String(number))) { number = String(number).replace(new RegExp(`(${NUMBER_MINUS})0`), '0'); } } catch (e) { warn(`Number could not be formatted: ${JSON.stringify([number, locale, options])}`, e); } return replaceNaNWithDash(alignCurrencySymbol(number, options.currencyDisplay)); }; //# sourceMappingURL=formatNumberCore.js.map