@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
103 lines • 3.39 kB
JavaScript
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