'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
};