重写数字的tofixed方法 、数字转汉字 、插件math.js

238 阅读1分钟
Number.prototype.myToFixed = function (n) {
    // n为期望保留的位数,超过限定,报错!
    if (n > 20 || n < 0) {
        throw new RangeError('toFixed() digits argument must be between 0 and 20');
    }
    // 获取数字
    const number = this;
    // 如果是NaN,或者数字过大,直接返回'NaN'或者类似'1e+21'的科学计数法字符串
    if (isNaN(number) || number >= Math.pow(10, 21)) {
        return number.toString();
    }
    // 默认保留整数
    if (typeof (n) == 'undefined' || n == 0) {
        return (Math.round(number)).toString();
    }

    // 先获取字符串
    let result = number.toString();
    // 获取小数部分
    const arr = result.split('.');

    // 整数的情况,直接在后面加上对应个数的0即可
    if (arr.length < 2) {
        result += '.';
        for (let i = 0; i < n; i += 1) {
            result += '0';
        }
        return result;
    }

    // 整数和小数
    const integer = arr[0];
    const decimal = arr[1];
    // 如果已经符合要求位数,直接返回
    if (decimal.length == n) {
        return result;
    }
    // 如果小于指定的位数,补上
    if (decimal.length < n) {
        for (let i = 0; i < n - decimal.length; i += 1) {
            result += '0';
        }
        return result;
    }
    // 如果到这里还没结束,说明原有小数位多于指定的n位
    // 先直接截取对应的位数
    result = integer + '.' + decimal.substr(0, n);
    // 获取后面的一位
    let last = decimal.substr(n, 1);
    if (/^\d(9){5,}[89]$/.test(decimal.substr(n))) {
        last += last + 1;
    }
    // 大于等于5统一进一位
    if (parseInt(last, 10) >= 5) {
        // 转换倍数,转换为整数后,再进行四舍五入
        const x = Math.pow(10, n);
        // 进一位后,转化还原为小数
        result = (Math.round((parseFloat(result) * x)) + 1) / x;
        // 再确认一遍
        result = result.toFixed(n);
    }

    return result;
};
// 数字转换
export let handlerConversion = (num) => {
    let changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
    let unit = ["", "十", "百", "千", "万"];
    num = parseInt(num);
    let getWan = (temp) => {
        let strArr = temp.toString().split("").reverse();
        let newNum = "";
        for (var i = 0; i < strArr.length; i++) {
            newNum = (i == 0 && strArr[i] == 0 ? "" : (i > 0 && strArr[i] == 0 && strArr[i - 1] == 0 ? "" : changeNum[strArr[i]] + (strArr[i] == 0 ? unit[0] : unit[i]))) + newNum;

        }
        return newNum;

    }
    let overWan = Math.floor(num / 10000);
    let noWan = num % 10000;
    if (noWan.toString().length < 4) {
        noWan = "0" + noWan;
    }
    return overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(num);
}
const $math = require('mathjs')
export const math = {
    add () {
        return comp('add', arguments)
    },
    //减
    subtract () {
        return comp('subtract', arguments)
    },
    //乘
    multiply () {
        return comp('multiply', arguments)
    },
    //除
    divide () {
        return comp('divide', arguments)
    }
}

function comp (_func, args) {
    let t = $math.chain($math.bignumber(args[0]))
    for (let i = 1; i < args.length; i++) {
        t = t[_func]($math.bignumber(args[i]))
    }
    // 防止超过6位使用科学计数法
    return parseFloat(t.done())
}

// 使用
data.scoreCombinedMode == 2
                        ? math.add(+list[index].teamScore, +(+list[index].orgScore).myToFixed(this.assessmentData.scorePrecision - 1))
                        : math.add(
                              math.multiply(+list[index].teamScore, math.divide(data.personScoreProportion, 100)),
                              math.multiply(+(+list[index].orgScore).myToFixed(this.assessmentData.scorePrecision - 1), math.divide(data.combinedScoreProportion, 100))
                          );