UNPKG

dtable-utils

Version:

dtable common utils

261 lines (245 loc) 8.09 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var index = require('../helper/number-precision/index.js'); var number = require('../number.js'); var duration = require('./duration.js'); var column = require('../constants/column.js'); var formula = require('../constants/formula.js'); var separatorMap = { comma: ',', dot: '.', no: '', space: ' ' }; var _getDecimalDigits = function _getDecimalDigits(number) { if (Number.isInteger(number)) { return 0; } var valueArr = String(number).split('.'); var digitsLength = valueArr[1] ? valueArr[1].length : 8; return digitsLength > 8 ? 8 : digitsLength; }; /** * Get fixed number by precision * @param {number} number * @param {object} formats e.g. { enable_precision, precision, ... } * @returns fixed number, string */ var getPrecisionNumber = function getPrecisionNumber(number, formats) { var _ref = formats || {}, _ref$precision = _ref.precision, precision = _ref$precision === void 0 ? 2 : _ref$precision, _ref$enable_precision = _ref.enable_precision, enable_precision = _ref$enable_precision === void 0 ? false : _ref$enable_precision; var type = Object.prototype.toString.call(number); if (type !== '[object Number]') { if (type === '[object String]' && formula.DISPLAY_INTERNAL_ERRORS.includes(number)) { return number; } return null; } var decimalDigits = enable_precision ? precision : _getDecimalDigits(number); return number.toFixed(decimalDigits); }; /** * removeZerosFromEnd('0.0100') // '0.01' * @param {string} sNumber string of numbers */ var removeZerosFromEnd = function removeZerosFromEnd(sNumber) { if (typeof sNumber !== 'string') return ''; if (sNumber.endsWith('0')) { return sNumber.replace(/(?:\.0*|(\.\d+?)0+)$/, '$1'); } return sNumber; }; /** * e.g. 1.23 // 2 * @param {number} number * @returns digital length */ var getDecimalDigitsFromNumber = function getDecimalDigitsFromNumber(number) { if (Number.isInteger(number)) { return 0; } var decimalPart = String(number).split('.')[1]; var digitsLength = decimalPart ? decimalPart.length : 8; return digitsLength > 8 ? 8 : digitsLength; }; var toThousands = function toThousands(number$1, _ref2) { var formats = _ref2.formats, _ref2$isCurrency = _ref2.isCurrency, isCurrency = _ref2$isCurrency === void 0 ? true : _ref2$isCurrency; var _ref3 = formats || {}, _ref3$decimal = _ref3.decimal, decimal = _ref3$decimal === void 0 ? 'dot' : _ref3$decimal, _ref3$thousands = _ref3.thousands, thousands = _ref3$thousands === void 0 ? 'no' : _ref3$thousands, _ref3$precision = _ref3.precision, precision = _ref3$precision === void 0 ? 2 : _ref3$precision, _ref3$enable_precisio = _ref3.enable_precision, enable_precision = _ref3$enable_precisio === void 0 ? false : _ref3$enable_precisio; // handle numbers in scientific notation if (String(number$1).includes('e')) { if (number$1 < 1 && number$1 > -1) { // 1.convert to non-scientific number var numericString = number$1.toFixed(enable_precision ? precision : 8); // 2.remove 0 from end of the number which not set precision. e.g. 0.100000 if (!enable_precision) { numericString = removeZerosFromEnd(numericString); } // 3.remove minus from number which equal to 0. e.g. '-0.00' if (parseFloat(numericString) === 0) { return numericString.startsWith('-') ? numericString.substring(1) : numericString; } return numericString; } return String(number$1); } var decimalString = separatorMap[decimal]; var thousandsString = separatorMap[thousands]; var decimalDigits = enable_precision ? precision : getDecimalDigitsFromNumber(number$1); var floatNumber = parseFloat(number.round(number$1, decimalDigits).toFixed(decimalDigits)); var isMinus = floatNumber < 0; var integer = Math.trunc(floatNumber); // format decimal part var decimalPart = String(Math.abs(index.NPminus(floatNumber, integer)).toFixed(decimalDigits)).slice(1); if (!enable_precision) { decimalPart = removeZerosFromEnd(decimalPart); } if (isCurrency) { if (!enable_precision) { decimalPart = decimalPart.length === 2 ? decimalPart = decimalPart.padEnd(3, '0') : (decimalPart.substring(0, 3) || '.').padEnd(3, '0'); } } decimalPart = decimalPart.replace(/./, decimalString); // format integer part var integerNumbers = []; var counter = 0; integer = Math.abs(integer).toString(); for (var i = integer.length - 1; i > -1; i--) { counter += 1; integerNumbers.unshift(integer[i]); if (!(counter % 3) && i !== 0) { integerNumbers.unshift(thousandsString); } } return "".concat(isMinus ? '-' : '').concat(integerNumbers.join('')).concat(decimalPart); }; /** * Get formatted number * @param {number} number e.g. 123 * @param {object} formats e.g. { format: 'number', decimal: 'dot', ... } * @returns formatted number, string */ var getNumberDisplayString = function getNumberDisplayString(number, formats) { var type = Object.prototype.toString.call(number); if (type !== '[object Number]') { // return formula internal errors directly. if (type === '[object String]' && number.startsWith('#')) { return number; } return ''; } if (isNaN(number) || number === Infinity || number === -Infinity) return String(number); // formats: old version maybe 'null' var _ref4 = formats || {}, _ref4$format = _ref4.format, format = _ref4$format === void 0 ? column.DEFAULT_NUMBER_FORMAT : _ref4$format; switch (format) { case 'number': { return toThousands(number, { formats: formats, isCurrency: false }); } case 'percent': { return "".concat(toThousands(Number.parseFloat((number * 100).toFixed(8)), { formats: formats, isCurrency: false }), "%"); } case 'yuan': { return "\uFFE5".concat(toThousands(number, { formats: formats })); } case 'dollar': { return "$".concat(toThousands(number, { formats: formats })); } case 'euro': { return "\u20AC".concat(toThousands(number, { formats: formats })); } case 'duration': { return duration.getDurationDisplayString(number, formats); } case 'custom_currency': { if (formats.currency_symbol_position === 'after') { return "".concat(toThousands(number, { formats: formats })).concat(formats.currency_symbol || ''); } return "".concat(formats.currency_symbol || '').concat(toThousands(number, { formats: formats })); } default: { return String(number); } } }; /** * Remove illegal characters * @param {string} sNum e.g. "1。23" * @param {string} format e.g. "number" * @param {string} currencySymbol custom symbol * @returns legal characters, string */ var replaceNumberNotAllowInput = function replaceNumberNotAllowInput(sNum, format, currencySymbol) { if (!sNum) { return ''; } var fixedSNum = sNum.replace(/。/g, '.'); switch (format) { case 'percent': { return fixedSNum.replace(/[^.-\d,%]/g, ''); } case 'yuan': { return fixedSNum.replace(/[^.-\d¥¥,]/g, ''); } case 'dollar': { return fixedSNum.replace(/[^.-\d$,]/g, ''); } case 'euro': { return fixedSNum.replace(/[^.-\d€,]/g, ''); } case 'custom_currency': { var reg = new RegExp('[^.-\\d' + currencySymbol + ',]', 'g'); return fixedSNum.replace(reg, ''); } default: { // default as number format return fixedSNum.replace(/[^.-\d,]/g, ''); } } }; exports.getNumberDisplayString = getNumberDisplayString; exports.getPrecisionNumber = getPrecisionNumber; exports.replaceNumberNotAllowInput = replaceNumberNotAllowInput;