shineout
Version:
A components library for React
96 lines (94 loc) • 2.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getNumberPrecision = getNumberPrecision;
exports.isE = isE;
exports.range = range;
exports.split = split;
exports.sub = sub;
exports.toPrecision = toPrecision;
exports.validateNumber = validateNumber;
var _hooks = require("@sheinx/hooks");
var devUseWarning = _hooks.util.devUseWarning;
function range(end) {
var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var delta = end - start;
if (typeof delta !== 'number' || Number.isNaN(delta)) {
devUseWarning.error('end can not computed with start');
}
return Array.from({
length: end - start
}, function (_v, k) {
return k + start;
});
}
function split(total, nums) {
if (typeof total !== 'number' || total === 0) {
devUseWarning.error('total mast be a number(not equal 0)');
}
var remain = 1;
var nilCount = 0;
var ratios = nums.map(function (n) {
if (n) {
var r = n / total;
remain -= n;
return r;
}
nilCount += 1;
return null;
});
return ratios.map(function (r) {
if (!r) r = remain / nilCount;
return total * r;
});
}
function toPrecision(num) {
var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 12;
return +parseFloat(num.toPrecision(precision));
}
function validateNumber(num) {
if (typeof num === 'number') {
return !Number.isNaN(num);
}
// Empty
if (!num) {
return false;
}
return (
// Normal type: 11.28
/^\s*-?\d+(\.\d+)?\s*$/.test(String(num)) ||
// Pre-number: 1.
/^\s*-?\d+\.\s*$/.test(String(num)) ||
// Post-number: .1
/^\s*-?\.\d+\s*$/.test(String(num))
);
}
function isE(number) {
var str = String(number);
return !Number.isNaN(Number(str)) && str.includes('e');
}
function getNumberPrecision(number) {
var numStr = String(number);
if (isE(number)) {
var precision = Number(numStr.slice(numStr.indexOf('e-') + 2));
var decimalMatch = numStr.match(/\.(\d+)/);
if (decimalMatch && decimalMatch[1]) {
precision += decimalMatch[1].length;
}
return precision;
}
return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0;
}
function sub(num1, num2) {
var number = Number(num1) + Number(num2);
if (Number.isNaN(number)) return NaN;
if (number > Number.MAX_SAFE_INTEGER) {
return Number.MAX_SAFE_INTEGER;
}
if (number < Number.MIN_SAFE_INTEGER) {
return Number.MIN_SAFE_INTEGER;
}
var maxPrediction = Math.max(getNumberPrecision(num1), getNumberPrecision(num2));
return Number(number.toFixed(maxPrediction));
}