UNPKG

@taiga-ui/core

Version:

Core library for creating Angular components and applications using Taiga UI

47 lines 7.61 kB
import { CHAR_HYPHEN } from '@taiga-ui/cdk/constants'; import { tuiRoundWith } from '@taiga-ui/cdk/utils/math'; import { TUI_DEFAULT_NUMBER_FORMAT, } from '@taiga-ui/core/tokens'; import { tuiGetFractionPartPadded } from './get-fractional-part-padded'; /** * Formats number adding a thousand separators and correct decimal separator * padding decimal part with zeroes to given length * * @param value the input number * @param settings See {@link TuiNumberFormatSettings} * @return the formatted string */ export function tuiFormatNumber(value, settings = {}) { const { precision, decimalSeparator, thousandSeparator, decimalMode, rounding } = { ...TUI_DEFAULT_NUMBER_FORMAT, decimalMode: 'always', precision: Infinity, ...settings, }; const rounded = Number.isFinite(precision) ? tuiRoundWith({ value, precision, method: rounding }) : value; const integerPartString = String(Math.floor(Math.abs(rounded))); let fractionPartPadded = tuiGetFractionPartPadded(rounded, precision); const hasFraction = Number(fractionPartPadded) > 0; if (Number.isFinite(precision)) { if (decimalMode === 'always' || (hasFraction && decimalMode === 'pad')) { const zeroPaddingSize = Math.max(precision - fractionPartPadded.length, 0); const zeroPartString = '0'.repeat(zeroPaddingSize); fractionPartPadded = `${fractionPartPadded}${zeroPartString}`; } else { fractionPartPadded = fractionPartPadded.replace(/0*$/, ''); } } const remainder = integerPartString.length % 3; const sign = value < 0 ? CHAR_HYPHEN : ''; let result = sign + integerPartString.charAt(0); for (let i = 1; i < integerPartString.length; i++) { if (i % 3 === remainder && integerPartString.length > 3) { result += thousandSeparator; } result += integerPartString.charAt(i); } return fractionPartPadded ? result + decimalSeparator + fractionPartPadded : result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LW51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvdXRpbHMvZm9ybWF0L2Zvcm1hdC1udW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQ0gseUJBQXlCLEdBRTVCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFdEU7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzNCLEtBQWEsRUFDYixXQUE2QyxFQUFFO0lBRS9DLE1BQU0sRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBQyxHQUFHO1FBQzVFLEdBQUcseUJBQXlCO1FBQzVCLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLFNBQVMsRUFBRSxRQUFRO1FBQ25CLEdBQUcsUUFBUTtLQUNkLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEUsSUFBSSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRW5ELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM1QixJQUFJLFdBQVcsS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sZUFBZSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQ3BDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQ3JDLENBQUMsQ0FDSixDQUFDO1lBQ0YsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVuRCxrQkFBa0IsR0FBRyxHQUFHLGtCQUFrQixHQUFHLGNBQWMsRUFBRSxDQUFDO1NBQ2pFO2FBQU07WUFDSCxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO0tBQ0o7SUFFRCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckQsTUFBTSxJQUFJLGlCQUFpQixDQUFDO1NBQy9CO1FBRUQsTUFBTSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QztJQUVELE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NIQVJfSFlQSEVOfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge3R1aVJvdW5kV2l0aH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9tYXRoJztcbmltcG9ydCB7XG4gICAgVFVJX0RFRkFVTFRfTlVNQkVSX0ZPUk1BVCxcbiAgICB0eXBlIFR1aU51bWJlckZvcm1hdFNldHRpbmdzLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuXG5pbXBvcnQge3R1aUdldEZyYWN0aW9uUGFydFBhZGRlZH0gZnJvbSAnLi9nZXQtZnJhY3Rpb25hbC1wYXJ0LXBhZGRlZCc7XG5cbi8qKlxuICogRm9ybWF0cyBudW1iZXIgYWRkaW5nIGEgdGhvdXNhbmQgc2VwYXJhdG9ycyBhbmQgY29ycmVjdCBkZWNpbWFsIHNlcGFyYXRvclxuICogcGFkZGluZyBkZWNpbWFsIHBhcnQgd2l0aCB6ZXJvZXMgdG8gZ2l2ZW4gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSBpbnB1dCBudW1iZXJcbiAqIEBwYXJhbSBzZXR0aW5ncyBTZWUge0BsaW5rIFR1aU51bWJlckZvcm1hdFNldHRpbmdzfVxuICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVpRm9ybWF0TnVtYmVyKFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgc2V0dGluZ3M6IFBhcnRpYWw8VHVpTnVtYmVyRm9ybWF0U2V0dGluZ3M+ID0ge30sXG4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHtwcmVjaXNpb24sIGRlY2ltYWxTZXBhcmF0b3IsIHRob3VzYW5kU2VwYXJhdG9yLCBkZWNpbWFsTW9kZSwgcm91bmRpbmd9ID0ge1xuICAgICAgICAuLi5UVUlfREVGQVVMVF9OVU1CRVJfRk9STUFULFxuICAgICAgICBkZWNpbWFsTW9kZTogJ2Fsd2F5cycsXG4gICAgICAgIHByZWNpc2lvbjogSW5maW5pdHksXG4gICAgICAgIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBjb25zdCByb3VuZGVkID0gTnVtYmVyLmlzRmluaXRlKHByZWNpc2lvbilcbiAgICAgICAgPyB0dWlSb3VuZFdpdGgoe3ZhbHVlLCBwcmVjaXNpb24sIG1ldGhvZDogcm91bmRpbmd9KVxuICAgICAgICA6IHZhbHVlO1xuICAgIGNvbnN0IGludGVnZXJQYXJ0U3RyaW5nID0gU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5hYnMocm91bmRlZCkpKTtcblxuICAgIGxldCBmcmFjdGlvblBhcnRQYWRkZWQgPSB0dWlHZXRGcmFjdGlvblBhcnRQYWRkZWQocm91bmRlZCwgcHJlY2lzaW9uKTtcbiAgICBjb25zdCBoYXNGcmFjdGlvbiA9IE51bWJlcihmcmFjdGlvblBhcnRQYWRkZWQpID4gMDtcblxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocHJlY2lzaW9uKSkge1xuICAgICAgICBpZiAoZGVjaW1hbE1vZGUgPT09ICdhbHdheXMnIHx8IChoYXNGcmFjdGlvbiAmJiBkZWNpbWFsTW9kZSA9PT0gJ3BhZCcpKSB7XG4gICAgICAgICAgICBjb25zdCB6ZXJvUGFkZGluZ1NpemU6IG51bWJlciA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiAtIGZyYWN0aW9uUGFydFBhZGRlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB6ZXJvUGFydFN0cmluZyA9ICcwJy5yZXBlYXQoemVyb1BhZGRpbmdTaXplKTtcblxuICAgICAgICAgICAgZnJhY3Rpb25QYXJ0UGFkZGVkID0gYCR7ZnJhY3Rpb25QYXJ0UGFkZGVkfSR7emVyb1BhcnRTdHJpbmd9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyYWN0aW9uUGFydFBhZGRlZCA9IGZyYWN0aW9uUGFydFBhZGRlZC5yZXBsYWNlKC8wKiQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5kZXIgPSBpbnRlZ2VyUGFydFN0cmluZy5sZW5ndGggJSAzO1xuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA8IDAgPyBDSEFSX0hZUEhFTiA6ICcnO1xuICAgIGxldCByZXN1bHQgPSBzaWduICsgaW50ZWdlclBhcnRTdHJpbmcuY2hhckF0KDApO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnRlZ2VyUGFydFN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAlIDMgPT09IHJlbWFpbmRlciAmJiBpbnRlZ2VyUGFydFN0cmluZy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhvdXNhbmRTZXBhcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgKz0gaW50ZWdlclBhcnRTdHJpbmcuY2hhckF0KGkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcmFjdGlvblBhcnRQYWRkZWQgPyByZXN1bHQgKyBkZWNpbWFsU2VwYXJhdG9yICsgZnJhY3Rpb25QYXJ0UGFkZGVkIDogcmVzdWx0O1xufVxuIl19