/**
* 判断原始数据是否是数字,包括整数和小数,以及省略 0 的小数
*
* ```javascript
* isNumber(+123); // true
* isNumber(-123); // true
* isNumber(0.12); // true
* isNumber(-0.12); // true
* isNumber('abc'); // false
* isNumber(''); // false
* ```
*
* @param value 原始数据
* @return 如果是数字返回 true,否则返回 false
*/
function isNumber(value) {
if ((typeof value === 'string' || typeof value === 'number') &&
value !== '') {
return /^[-+]?\d*(\.\d+)?$/.test(value.toString());
}
else {
return false;
}
}
/**
* 判断原始数据是否是小数
*
* ```javascript
* isDecimal(12.3); // true
* isDecimal(-12.3); // true
* isDecimal(-0.3); // true
* isDecimal(-0.3); // true
* isDecimal(1234); // false
* ```
*
* @param value 原始数据
* @return 如果是小数返回 true,否则返回 false
*/
function isDecimal(value) {
if (isNumber(value)) {
return /\./.test(value.toString());
}
else {
return false;
}
}
/**
* 判断是否是手机号
*
* ```javascript
* isMobile('12345678901'); // true
* isMobile('15678901'); // false
* ```
*
* @param value
* @return 如果是手机号返回 true,否则返回 false
*/
function isMobile(value) {
if (typeof value !== 'string') {
throw new Error('参数必须是字符串');
}
var phone = value.toString().replace(/\s/g, '');
return /^1\d{10}$/.test(phone);
}
/**
* 对数字进行补零操作,默认是两个小数位f
* 1. 参数类型不正确,直接返回 '0'
* 2. 小数位个数设置为负数,直接返回数字参数对应的字符串
* 3. 整数直接增加小数点并补零
* 4. 保留小数位的长度小于实际数字的小数位长度,不做处理
*
* ```javascript
* addZero(12.123, -10)); // 12.123
* addZero(12, 0); // 12
* addZero(12); // 12.00
* addZero(12.1234, 3); // 12.1234
* addZero(12.12, 6); // 12.120000
* ```
*
* @param value 原始数据
* @param decimalLen 保留小数位的长度,默认 2 位
* @return 返回数字对应的字符串
*/
function addZero(value, decimalLen) {
if (decimalLen === void 0) { decimalLen = 2; }
// 参数不能转成数字,直接返回
if (!isNumber(value) || !isNumber(decimalLen)) {
return '0';
}
var resStr = value.toString();
var tmpDecimalLen = Number(decimalLen);
// 小数位个数小于 0,直接返回数字对应的字符串
if (tmpDecimalLen < 0) {
return resStr;
}
// 如果不是小数,直接做补零操作
var zeroStr = '';
if (!isDecimal(value)) {
zeroStr = new Array(tmpDecimalLen + 1).join('0');
return "" + resStr + (!tmpDecimalLen ? '' : '.') + zeroStr;
}
// 如果保留小数的个数小于等于实际小数长度,直接返回数字对应的字符串
var decimalCount = resStr.length - (resStr.indexOf('.') + 1);
if (tmpDecimalLen <= decimalCount) {
return resStr;
}
// 如果保留小数的个数大于实际小数的长度,执行补零操作
zeroStr = new Array(tmpDecimalLen - decimalCount + 1).join('0');
resStr += zeroStr;
return resStr;
}
/**
* 获取数字中小数的个数,如果参数为非数字,返回 0
*
* ```javascript
* countDecimal(12); // 0
* countDecimal(12.1); // 1
* countDecimal(-12.11); // 2
* ```
*
* @param value 原始数据
* @return 小数的个数
*/
function countDecimal(value) {
if (!isNumber(value)) {
return 0;
}
var arr = value.toString().split('.');
return arr[1] ? arr[1].length : 0;
}
/**
* @ignore
*
* 执行操作的方法,其中有一个参数不可以转成数字,返回 0
*
* @param { Number | String } num1 运算数
* @param { Number | String } num2 运算数
* @param { String } op 运算类型,有加减乘除(add/subtract/multiply/divide)
* @return 操作之后的结果
*/
function operation(num1, num2, op) {
if (!isNumber(num1) || !isNumber(num2)) {
return 0;
}
var maxLen = countDecimal(num1) + countDecimal(num2);
var num1Str = addZero(num1, maxLen).replace('.', '');
var num2Str = addZero(num2, maxLen).replace('.', '');
switch (op) {
case 'add':
return (Number(num1Str) + Number(num2Str)) / Math.pow(10, maxLen);
break;
case 'subtract':
return (Number(num1Str) - Number(num2Str)) / Math.pow(10, maxLen);
break;
case 'multiply':
return (Number(num1Str) * Number(num2Str)) / Math.pow(10, maxLen * 2);
break;
case 'divide':
return Number(num1Str) / Number(num2Str);
break;
default:
return 0;
break;
}
}
/**
* 加法操作,运算数不能转成数字,抛出异常
*
* ```javascript
* add(0.1, 0.2); // 0.3
* add(19.98, 0.01); // 19.99
* add(19.98, 0.01, 0.01); // 20
* ```
*
* @param arr 可变参数,可以传递一个到多个数字或能转成数字的字符串
* @return 返回操作后的结果数字
*/
function add() {
var arr = [];
for (var _i = 0; _i < arguments.length; _i++) {
arr[_i] = arguments[_i];
}
var validateFlag = true;
for (var i = 0; i < arr.length; i++) {
if (!isNumber(arr[i])) {
validateFlag = false;
}
}
if (!validateFlag) {
throw new Error('参数必须能转成数字');
}
var result = 0;
for (var i = 0; i < arr.length; i++) {
result = operation(result, arr[i], 'add');
}
return result;
}
/**
* 减法操作,运算数不能转成数字,抛出异常
*
* ```javascript
* subtract(0.3, 0.2); // 0.1
* subtract(19.99, 0.01); // 19.98
* subtract(19.99, 0.01, 0.01); // 19.97
* ```
*
* @param arr 可变参数,可以传递一个到多个数字或能转成数字的字符串
* @return 返回操作后的结果数字
*/
function subtract() {
var arr = [];
for (var _i = 0; _i < arguments.length; _i++) {
arr[_i] = arguments[_i];
}
var validateFlag = true;
for (var i = 0; i < arr.length; i++) {
if (!isNumber(arr[i])) {
validateFlag = false;
}
}
if (!validateFlag) {
throw new Error('参数必须能转成数字');
}
var result = 0;
for (var i = 0; i < arr.length; i++) {
// 如果是第一个数,减去一个 0;不是第一个数,正常做减法
if (i === 0) {
result = operation(arr[i], result, 'subtract');
}
else {
result = operation(result, arr[i], 'subtract');
}
}
return result;
}
/**
* 乘法操作,运算数不能转成数字,抛出异常
*
* ```javascript
* multiply(0.1, 0.2); // 0.02
* multiply(19.99, 100); // 1999
* multiply(1, 2, 3, 4); // 24
* ```
*
* @param arr 可变参数,可以传递一个到多个数字或能转成数字的字符串
* @return 返回操作后的结果数字
*/
function multiply() {
var arr = [];
for (var _i = 0; _i < arguments.length; _i++) {
arr[_i] = arguments[_i];
}
var validateFlag = true;
for (var i = 0; i < arr.length; i++) {
if (!isNumber(arr[i])) {
validateFlag = false;
}
}
if (!validateFlag) {
throw new Error('参数必须能转成数字');
}
var result = 1;
for (var i = 0; i < arr.length; i++) {
result = operation(result, arr[i], 'multiply');
}
return result;
}
/**
* 除法操作,运算数不能转成数字,抛出异常
*
* ```javascript
* divide(0.3, 0.1); // 3
* divide(0.69, 10); // 0.069
* divide(27, 3, 3, 3); // 1
* ```
*
* @param arr 可变参数,可以传递一个到多个数字或能转成数字的字符串
* @return 返回操作后的结果数字
*/
function divide() {
var arr = [];
for (var _i = 0; _i < arguments.length; _i++) {
arr[_i] = arguments[_i];
}
var validateFlag = true;
for (var i = 0; i < arr.length; i++) {
if (!isNumber(arr[i])) {
validateFlag = false;
}
}
if (!validateFlag) {
throw new Error('参数必须能转成数字');
}
var result = 1;
for (var i = 0; i < arr.length; i++) {
// 如果是第一个数,除以 1;不是第一个数,正常做除法
if (i === 0) {
result = operation(arr[i], result, 'divide');
}
else {
result = operation(result, arr[i], 'divide');
}
}
return result;
}
/**
* 对数字进行四舍五入操作,会根据保留的小数位自动补零
* > 银行的四舍五入:四舍六入五成双。当舍去的值小于等于 4 时,舍去;大于等于 6 时,向前进 1;等于 5 时,如果前位为奇数,向前进 1,如果前位为偶数,舍去。
*
* ```javascript
* // 常规的四舍五入
* handleRound(1.234, 2, false); // '1.23'
* handleRound(1.345, 2, false); // '1.35'
* handleRound(1.355, 2, false); // '1.36'
* handleRound(1.366, 2, false); // '1.37'
* handleRound(2, 2, false); // '2.00'
*
* // 银行四舍五入
* handleRound(1.234, 2, true); // '1.23'
* handleRound(1.345, 2, true); // '1.34'
* handleRound(1.355, 2, true); // '1.36'
* handleRound(1.366, 2, true); // '1.37'
* handleRound(2, 2, true); // '2.00'
* ```
*
* @param value 原始数据
* @param decimalLen 保留小数位的个数
* @param isBank 是否执行银行的四舍五入,默认为 true
* @return 操作成功后返回的数字字符串
*/
function handleRound(value, decimalLen, isBank) {
if (decimalLen === void 0) { decimalLen = 2; }
if (isBank === void 0) { isBank = true; }
if (!isNumber(value) || !isNumber(decimalLen)) {
throw new Error('参数必须能转成数字');
}
if (Number(decimalLen) < 0) {
throw new Error('小数位个数不能小于 0');
}
var resStr = addZero(value, decimalLen);
if (!isDecimal(value)) {
return resStr;
}
// 如果保留小数的个数大于等于实际小数长度,不做操作
var decimalCount = resStr.length - (resStr.indexOf('.') + 1);
if (Number(decimalLen) >= decimalCount) {
return resStr;
}
// 如果保留小数的个数小于实际小数的长度,做四舍五入操作
resStr = resStr.substr(0, resStr.indexOf('.') + decimalLen + 2);
var lastNum = Number(resStr.substr(-1));
var handleDecimal = !+decimalLen ? 1 : divide(1, Math.pow(10, decimalLen));
var tmpArr = resStr.split('');
tmpArr.pop();
resStr = tmpArr.join('');
if ((!isBank && lastNum >= 5) || (isBank && lastNum > 5)) {
resStr = add(resStr, handleDecimal).toString();
}
if (isBank && lastNum === 5 && +resStr.substr(-1) % 2 !== 0) {
resStr = add(resStr, handleDecimal).toString();
}
return resStr;
}
/**
* 对金额格式化,主要是增加千分位,本身带有千分位的金额不支持再次格式化
*
* ```javascript
* formatAmount(12345678); // 12,345,678
* formatAmount(12345678.12345); // 12,345,678.12345
* formatAmount(12); // 12
* ```
*
* @param money 待格式化的金额
* @return 增加千分位之后的金额
*/
function formatAmount(money) {
if (!isNumber(money)) {
return '0';
}
var arr = money.toString().split('.');
arr[0] = arr[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return arr.join('.');
}
/**
* 立即执行的防抖函数
* @param fn 实际执行的函数体
* @param delay 间隔时间,默认是 200 毫秒
*/
function debounce(fn, delay) {
if (delay === void 0) { delay = 200; }
var timer;
return function () {
// @ts-ignore
var _this = this;
var args = arguments;
if (timer) {
clearTimeout(timer);
}
var callNow = !timer;
timer = setTimeout(function () {
timer = null;
}, delay);
callNow && fn.apply(_this, args);
};
}
/**
* 深拷贝,如果是对象就进行拷贝,不是对象直接赋值
* @param target 任意类型的参数
* @return 返回值是对参数深拷贝的结果
*/
function deepClone(target) {
var result;
if (typeof target === 'object') {
// 如果是一个数组的话
if (Array.isArray(target)) {
result = []; // 将result赋值为一个数组,并且执行遍历
for (var i in target) {
// 递归克隆数组中的每一项
result.push(deepClone(target[i]));
}
// 判断如果当前的值是null的话;直接赋值为null
}
else if (target === null) {
result = null;
// 判断如果当前的值是一个 RegExp 对象的话,直接赋值
}
else if (target.constructor === RegExp) {
result = target;
}
else {
// 否则是普通对象,直接 for in 循环,递归赋值对象的所有值
result = {};
for (var i in target) {
result[i] = deepClone(target[i]);
}
}
}
else {
result = target;
}
// 返回最终结果
return result;
}
/**
* 判断 APP 版本号
*
* ```javascript
* compareVersion('3.0.9', '3.0.8'); // 1
* compareVersion('3.0.8', '3.0.8'); // 0
* compareVersion('3.0.8', '3.0.9'); // -1
* ```
*
* @param srcVersion
* @param baseVersion
* @return 版本相等返回 0,;前一个大于后一个返回 1,;前一个小于后一个返回 -1
*/
function compareVersion(srcVersion, baseVersion) {
if (!srcVersion || !baseVersion) {
throw new Error('请输入正常的版本号');
}
// 判断版本号是否符合要求
var srcArr = srcVersion.toString().split('.');
var baseArr = baseVersion.toString().split('.');
var srcFlag = false, baseFlag = false;
srcArr.forEach(function (srcItem) {
if (!isNumber(srcItem)) {
srcFlag = true;
}
});
baseArr.forEach(function (baseItem) {
if (!isNumber(baseItem)) {
baseFlag = true;
}
});
if (srcFlag || baseFlag) {
throw new Error('请输入正常的版本号');
}
// 判断版本
var minLen = Math.min(srcArr.length, baseArr.length);
var pos = 0, diff = 0;
while (pos < minLen) {
diff = Number(srcArr[pos]) - Number(baseArr[pos]);
if (Math.abs(diff) !== 0) {
break;
}
pos++;
}
// 返回信息
if (diff < 0) {
return -1;
}
else if (diff > 0) {
return 1;
}
else {
return 0;
}
}
/**
* 手机号增加 * 号
*
* ```javascript
* maskMobile('15678459632'); // 156****9632
* ```
*
* @param value 手机号
* @return 前面三位,最后四位,中间为 * 号
*/
function maskMobile(value) {
if (!isMobile(value)) {
throw new Error('手机号格式不正确');
}
var phone = value.toString().replace(/\s/g, '');
return phone.replace(/^(\d{3})\d*(\d{4})$/, '$1****$2');
}
// 正则表达式相关
export { isNumber, isDecimal, isMobile, addZero, countDecimal, add, subtract, multiply, divide, handleRound, formatAmount, debounce, deepClone, compareVersion, maskMobile };
//# sourceMappingURL=ytlife-utils.es5.js.map
2020-08-18测试过的工具函数
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...