UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

149 lines (148 loc) 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _hasOwn = _interopRequireDefault(require("core-js-pure/stable/object/has-own.js")); var _useNumberFormat = _interopRequireDefault(require("./useNumberFormat.js")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function useNumberFormatWithParts(value, options = {}) { var _normalizedOptions$cu; const normalizedOptions = { returnAria: true, ...options }; if (!(0, _hasOwn.default)(options, 'currency')) { normalizedOptions.currency = false; } const formatOptions = { ...normalizedOptions, currency_display: normalizedOptions.currencyDisplay, currency_position: normalizedOptions.currencyPosition === 'auto' ? null : normalizedOptions.currencyPosition, omit_currency_sign: normalizedOptions.omitCurrencySign, clean_copy_value: normalizedOptions.cleanCopyValue, omit_rounding: normalizedOptions.omitRounding }; const amountOnly = (0, _useNumberFormat.default)(value, { ...formatOptions, omit_currency_sign: true, returnAria: true }); const result = (0, _useNumberFormat.default)(value, formatOptions); if (!normalizedOptions.returnAria || typeof result !== 'object' || result === null) { return result; } const formatted = result; if (formatted.type !== 'currency') { return { ...formatted, parts: getFallbackParts(formatted.number) }; } if (typeof amountOnly !== 'object' || amountOnly === null) { return { ...formatted, parts: getFallbackParts(formatted.number) }; } const unsignedAmount = amountOnly; const splitAmount = splitLeadingSign(unsignedAmount.number); const splitFull = splitLeadingSign(formatted.number); const amountWithoutSign = splitAmount.value; const fullWithoutSign = splitFull.value; const amountPosition = fullWithoutSign.indexOf(amountWithoutSign); if (amountPosition < 0) { return { ...formatted, parts: { sign: splitAmount.sign, signedNumber: unsignedAmount.number, number: splitAmount.value, currency: null, currencyPosition: null, spaceAfterCurrency: false, spaceBeforeCurrency: false, percent: null, percentSpacing: '' } }; } const beforeAmount = fullWithoutSign.slice(0, amountPosition).trim(); const afterAmount = fullWithoutSign.slice(amountPosition + amountWithoutSign.length).trim(); const hasCurrencyBefore = beforeAmount.length > 0; const currency = hasCurrencyBefore ? beforeAmount : afterAmount; const hasCurrency = Boolean(currency); const usedCurrencyPosition = (_normalizedOptions$cu = normalizedOptions.currencyPosition) !== null && _normalizedOptions$cu !== void 0 ? _normalizedOptions$cu : 'auto'; let renderCurrencyBefore = hasCurrencyBefore; if (normalizedOptions.signDisplay === 'always' && usedCurrencyPosition === 'auto') { renderCurrencyBefore = false; } if (normalizedOptions.forceCurrencyAfterAmount && usedCurrencyPosition === 'auto') { renderCurrencyBefore = false; } const shouldOmitCurrencySpace = normalizedOptions.signDisplay === 'always' && usedCurrencyPosition === 'auto'; const spaceAfterCurrency = renderCurrencyBefore && hasCurrency && !shouldOmitCurrencySpace; const spaceBeforeCurrency = !renderCurrencyBefore && hasCurrency && !shouldOmitCurrencySpace; return { ...formatted, parts: { sign: splitAmount.sign, signedNumber: unsignedAmount.number, number: splitAmount.value, currency: currency || null, currencyPosition: hasCurrency ? renderCurrencyBefore ? 'before' : 'after' : null, spaceAfterCurrency, spaceBeforeCurrency, percent: null, percentSpacing: '' } }; } function getFallbackParts(number) { var _splitNumber$sign; const splitNumber = splitLeadingSign(number); const splitPercent = splitTrailingPercent(splitNumber.value); const hasPercent = Boolean(splitPercent); const valueWithoutPercent = hasPercent ? splitPercent.number : splitNumber.value; return { sign: splitNumber.sign, signedNumber: `${(_splitNumber$sign = splitNumber.sign) !== null && _splitNumber$sign !== void 0 ? _splitNumber$sign : ''}${valueWithoutPercent}`, number: valueWithoutPercent, currency: null, currencyPosition: null, spaceAfterCurrency: false, spaceBeforeCurrency: false, percent: hasPercent ? splitPercent.percent : null, percentSpacing: hasPercent ? splitPercent.spacing : '' }; } function splitTrailingPercent(value) { const match = String(value || '').match(/^(.*?)([\u00a0\s]*[%٪])$/); if (!match) { return null; } const before = match[1]; const suffix = match[2]; const percent = suffix.trim(); return { number: before, percent, spacing: suffix.slice(0, -percent.length) }; } function splitLeadingSign(value) { const normalizedValue = String(value || '').replace(/^[\u200e\u200f\u061c\s]+/, ''); const match = normalizedValue.match(/^([+\-−])\s?(.*)$/); if (!match) { return { sign: null, value: normalizedValue }; } return { sign: match[1], value: match[2] }; } var _default = exports.default = useNumberFormatWithParts; //# sourceMappingURL=useNumberFormatWithParts.js.map