/**
* NumberUtil 客户端数值工具类
* @author cls
* @date 2021-01-30
* import { NumberUtil } from "@birt/funclib/NumberUtil"
*/
// import { statSync } from "fs";
export const NumberUtil = {
/**
* showdoc
* @catalog API/工具/Number
* @title 除法函数,用来得到精确的除法结果
* @description 除法函数,用来得到精确的除法结果
* @url accDiv(arg1,arg2)
* @method $instance.accDiv(arg1,arg2)
* @param arg1 必选 Number 被除数
* @param arg2 必选 Number 除数
* @return float
* @number 60
*/
accDiv: function (arg1, arg2) {
var t1 = 0, t2 = 0, r1, r2;
try {
t1 = arg1.toString().split(".")[1].length
} catch (e) {
t1 = 0;
}
try {
t2 = arg2.toString().split(".")[1].length
} catch (e) {
t2 = 0;
}
r1 = Number(arg1.toString().replace(".", ""))
r2 = Number(arg2.toString().replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);
},
/**
* showdoc
* @catalog API/工具/Number
* @title 乘法函数,用来得到精确的乘法结果
* @description 乘法函数,用来得到精确的乘法结果
* @url accDiv(arg1,arg2)
* @method $instance.accDiv(arg1,arg2)
* @param arg1 必选 Number 乘数
* @param arg2 必选 Number 乘数
* @return float
* @number 60
*/
accMul: function (arg1, arg2) {
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try {
m += s1.split(".")[1].length
} catch (e) {
m = 0;
}
try {
m += s2.split(".")[1].length
} catch (e) {
m += 0;
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", ""))
/ Math.pow(10, m)
},
/**
* showdoc
* @catalog API/工具/Number
* @title 加法函数,用来得到精确的加法结果
* @description 加法函数,用来得到精确的加法结果
* @url accAdd(arg1,arg2)
* @method $instance.accAdd(arg1,arg2)
* @param arg1 必选 Number 加数
* @param arg2 必选 Number 加数
* @return float
* @number 60
*/
accAdd: function (arg1, arg2) {
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split(".")[1].length
} catch (e) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2))
return (NumberUtil.accMul(arg1, m) + NumberUtil.accMul(arg2, m)) / m
},
toFixed(number, d) {
if (d < 0) {
d = 0;
}
let s = number + "";
if (!d)
d = 0;
if (s.indexOf(".") == -1)
s += ".";
s += new Array(d + 1).join("0");
if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) {
let ss = "0" + RegExp.$2, pm = RegExp.$1, a = RegExp.$3.length, b = true;
if (a == d + 2) {
a = statSync.match(/\d/g);
if (parseInt(a[a.length - 1]) > 4) {
for (let i = a.length - 2; i >= 0; i--) {
a[i] = parseInt(a[i]) + 1;
if (a[i] == 10) {
a[i] = 0;
b = i != 1;
} else
break;
}
}
ss = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"),
"$1.$2");
}
if (b)
ss = s.substr(1);
return (pm + ss).replace(/\.$/, "");
}
return this + "";
},
/**
* showdoc
* @catalog API/工具/Number
* @title 中文数字格式化
* @description 中文数字格式化
* @url formatCn(n)
* @method $instance.formatCn(n)
* @param n 必选 Number 数字
* @return string
* @number 60
*/
formatCn(n) {
let fraction = ['角', '分'];
let digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
let unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']];
let head = n < 0 ? '欠' : '';
n = Math.abs(n);
let s = '';
for (let i = 0; i < fraction.length; i++) {
s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
n = Math.floor(n);
for (let i = 0; i < unit[0].length && n > 0; i++) {
let p = '';
for (let j = 0; j < unit[1].length && n > 0; j++) {
p = digit[n % 10] + unit[1][j] + p;
n = Math.floor(n / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
},
/**
* showdoc
* @catalog API/工具/Number
* @title 数值格式化
* @description 数值格式化
* @url formatString(v,formatstring)
* @method $instance.formatString(v,formatstring)
* @param v 必选 Number 数字
* @param strign 必选 string 格式化
* @return string
* @number 60
*/
format: function (v, formatString) {
if (!formatString) {
formatString = "000,0.00";
//return v;
}
if (formatString.indexOf("¥") > -1) {
formatString = "¥000,0.00";
}
if (isFinite(v)) {
v = parseFloat(v);
}
if (formatString.indexOf('%') > -1) {
v = v * 100;
}
v = !isNaN(v) ? v : NaN;
if (isNaN(v)) {
return '';
}
let formatCleanRe = /[^\d\.]/g;
let comma = ",", dec = '.', neg = v < 0, hasComma, psplit, fnum, cnum, parr, j, m, n, i;
v = Math.abs(v);
// if (formatString.substr(formatString.length - 2) == '/i') {
// I18NFormatCleanRe = new RegExp('[^\\d\\'
// + UtilFormat.decimalSeparator + ']', 'g');
// formatString = formatString.substr(0, formatString.length - 2);
// hasComma = formatString.indexOf(comma) != -1;
// psplit = formatString.replace(I18NFormatCleanRe, '').split(dec);
// } else
hasComma = formatString.indexOf(',') != -1;
psplit = formatString.replace(formatCleanRe, '').split('.');
if (psplit.length > 2) {
alert("对比格式无效")
// alert("瀵规瘮璧锋棤鏁堟牸寮忥紒");
// </debug>
} else if (psplit.length > 1) {
let precision = psplit[1].length || 0;
let pow = Math.pow(10, precision);
v = Number((Math.round(v * pow) / pow)).toFixed(precision);
} else {
let precision = psplit[0].length || 0;
let pow = Math.pow(10, precision);
v = Number((Math.round(v * pow) / pow)).toFixed(0);
}
fnum = v.toString();
psplit = fnum.split('.');
if (hasComma) {
cnum = psplit[0];
parr = [];
j = cnum.length;
m = Math.floor(j / 3);
n = cnum.length % 3 || 3;
for (i = 0; i < j; i += n) {
if (i !== 0) {
n = 3;
}
parr[parr.length] = cnum.substr(i, n);
m -= 1;
}
fnum = parr.join(comma);
if (psplit[1]) {
fnum += dec + psplit[1];
}
} else {
if (psplit[1]) {
fnum = psplit[0] + dec + psplit[1];
}
}
if (neg) {
neg = fnum.replace(/[^1-9]/g, '') !== '';
}
return (neg ? '-' : '') + formatString.replace(/[\d,?\.?]+/, fnum);
}
}