Source: lib/number.js

'use strict';

/* 数字和金额操作 */
/** @module number */

/**
 * 加函数
 * @param {Number|String} num1 - 被加数
 * @param {Number|String} num2 - 加数
 * @return {Number} 得到的值.
 */
function add(num1, num2) {
    let sq1, sq2, m;
    try {
        sq1 = num1.toString().split('.')[1].length;
    } catch (e) {
        sq1 = 0;
    }
    try {
        sq2 = num2.toString().split('.')[1].length;
    } catch (e) {
        sq2 = 0;
    }

    m = Math.pow(10, Math.max(sq1, sq2));
    return (num1 * m + num2 * m) / m;
}

/**
 * 减函数
 * @param {Number|String} num1 - 被加数
 * @param {Number|String} num2 - 减数
 * @return {Number} 得到的值
 */
function sub(num1, num2) {
    let r1, r2, m;
    try {
        r1 = num1.toString().split('.')[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = num2.toString().split('.')[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return ((num1 * m - num2 * m) / m);
}

/**
 * 乘函数
 * @param {Number|String} num1 - 被乘数
 * @param {Number|String} num2 - 乘数
 * @return {Number} 得到的值
 */
function mul (num1, num2) {
    let m = 0, s1, s2;

    try {
        s1 = num1.toString();
        let splits = s1.split('.');
        m += splits[1] ? splits[1].length : 0;
    } catch (e) {
        s1 = 'NaN';
    }
    try {
        s2 = num2.toString();
        let splits = s2.split('.');
        m += splits[1] ? splits[1].length : 0;
    } catch (e) {
        s2 = 'NaN';
    }
    return (Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m));
}

/**
 * 除函数
 * @param {Number|String} num1 - 被除数
 * @param {Number|String} num2 - 除数
 * @return {Number} 得到的值
 */
function div(num1, num2) {
    let t1 = 0,
        t2 = 0,
        r1, r2;
    try {
        t1 = num1.toString().split('.')[1].length;
    } catch (e){
        // error
    }
    try {
        t2 = num2.toString().split('.')[1].length;
    } catch (e){
        // error
    }
    r1 = Number((num1 + '').replace('.', ''));
    r2 = Number((num2 + '').replace('.', ''));
    return (r1 / r2) * Math.pow(10, t2 - t1);
}

/**
 * 补0
 * @param {Number|String} num - 原数字
 * @param {Number} total - 补0的个数, 默认为0
 * @param {Boolean} atBegin - 补0是否前面
 * @return {String} 拼接好的字符串
 */
function padZero(num, total = 0, atBegin = false) {
    let i = 0;
    let zeros = '';
    while (i < total) {
        i++;
        zeros += '0';
    }
    return atBegin ? zeros + num : num + zeros ;
}

/**
 * formatMoney,格式化金额
 * @param {Number} num - 原金额数字
 * @param {Number} digit - 保留小数位数,默认3位, 只能取0,1,2,3,其他数字等同于3
 * @param {Boolean} cut  多余的数是否四舍五入,否则为舍去
 * @return {String} 格式化后的金额字符串
 */
function formatMoney(num, digit = 3, cut = false) {
    num = parseFloat(num);
    if (isNaN(num)) {
        return 0;
    }
    let flag = num < 0 ? '-' : ''; // 负数标志
    num = Math.abs(num);
    digit = (typeof digit == 'number' && digit <= 3 && digit >= 0) ? Math.floor(digit) : 3;//保留位数  0 - 3 //默认3位
    let powNum = Math.pow(10, digit);

    // console.log(num, powNum)
    num = mul(num, powNum);
    // console.log(num, powNum)

    if (!cut) {//舍弃
        num = Math.floor(num);// 去掉小数点后面的位数
    } else {
        num = Math.floor(num.toFixed(0));  //四舍五入 再取整
    }

    let numstr = '' + num / powNum;

    let l = numstr.split('.')[0].split('').reverse();
    let r = numstr.split('.')[1];
    if (r == undefined) {
        r = '';
    }
    r = (r + '000').substr(0, digit);
    let t = '';
    for (let i = 0; i < l.length; i++) {
        t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? ',' : '');
    }
    return flag + t.split('').reverse().join('') + (r === '' ? '' : ('.' + r));
}

/**
 * formatMoneyZhCN,格式化为中文金额字符串
 * @param {Number} num - 金额数字
 * @return {String} 格式化后的字符串
 */
function formatMoneyZhCN(num) {
    let nums = Number(num) || 0;
    let y = Math.floor(num / 1e8);
    let t = Math.floor((nums - y * 1e8) / 1e4);
    let fillNum = padZero(t, 4, true);
    return y + '亿' + fillNum.substr(fillNum.length - 4, 4) + '万';
}


export {
    add,
    sub,
    mul,
    div,
    padZero,
    formatMoney,
    formatMoneyZhCN
};