2020-08-18测试过的工具函数

/**
 * 判断原始数据是否是数字,包括整数和小数,以及省略 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341