dtable-utils
Version:
dtable common utils
261 lines (245 loc) • 8.09 kB
JavaScript
;
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;