Browse Source

重写numberFormat方法,处理科学计数法的数子

zhuth 6 years ago
parent
commit
80016dc966
1 changed files with 44 additions and 16 deletions
  1. 44 16
      src/utils/baseUtils.js

+ 44 - 16
src/utils/baseUtils.js

@@ -218,33 +218,61 @@ function RGBToHex(rgb) {
  * thousands_sep:是否添加千分位符号
  * */
 function numberFormat(number, decimals, thousands_sep) {
-    if(!/\d/.test(number)) {
+    if (!/\d/.test(number)) {
         return number;
     }
-    number = (number + '').replace(/[^0-9+-Ee.]/g, '');
-    var dlength = (number + '').split('.')[1] || 0;
-    var n = !isFinite(+number) ? 0 : +number,
-        prec = !isFinite(+decimals) ? (dlength > 2 ? 2 : dlength) : (Math.abs(decimals) > dlength ? dlength : Math.abs(decimals)),
+    number = _scientificNotationToString(number); // 将科学计数法处理的数字摊开
+    var narr = (number + '').split('.');
+    var n1 = narr[0],
+        n2 = narr[1] || '',
+        prec = !isFinite(+decimals) ? 2 : +decimals,
         s = '',
-        toFixedFix = function (n, prec) {
-            var k = Math.pow(10, prec);
-            return '' + Math.round(n * k) / k;
+        toDecimal = function (n1, n2, p) {
+            var num =  n1 + '.' + (n2.length > p ? (
+                n2[p] >= 5 ? (
+                    n2.substring(0, p - 1) + (Number(n2[p-1]) + 1)
+                ) : (
+                    n2.substring(0, p)
+                )
+            ) : (
+                n2
+            ));
+            return num;
         };
 
-    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
     var re = /(-?\d+)(\d{3})/,
         sep = ',';
-    while (!!thousands_sep && re.test(s[0])) {
-        s[0] = s[0].replace(re, "$1" + sep + "$2");
+    while (!!thousands_sep && re.test(n1)) {
+        n1 = n1.replace(re, "$1" + sep + "$2");
     }
 
-    if ((s[1] || '').length < prec) {
-        s[1] = s[1] || '';
-        s[1] += new Array(prec - s[1].length + 1).join('0');
-    }
-    return s.join('.');
+    s = toDecimal(n1, n2, prec);
+    s = s.replace(/\.0*$/, '').replace(/[+-]{1}0+$/, '0');
+    return s;
 };
 
+function _scientificNotationToString(param) {
+    let strParam = String(param);
+    let flag = /e/.test(strParam)
+    if (!flag) return strParam
+
+    let positive = true; // 正数
+    let sysbol = true; // 指数符号 true: 正,false: 负
+    if (/^-/.test(strParam)) {
+        positive = false;
+    }
+    if (/e-/.test(strParam)) {
+        sysbol = false
+    }
+    // 指数
+    let index = Number(strParam.match(/\d+$/)[0])
+    // 基数
+    let basis = strParam.match(/^[+-]{0,1}[\d\.]+/)[0].replace(/[+-.]/g, '');
+
+    let absNum = sysbol ? basis.padEnd(index + 1, 0) : basis.padStart(index + basis.length, 0).replace(/^0/, '0.');
+    return (positive ? '' : '-') + absNum;
+}
+
 ;exports = module.exports = (function(){
     return { remove, isEqual, getUrlParam, hashcode, delay, dateFormat, arrayToTree, ArrayEquals, deepAssign,
         HexToRGB, RGBToHex, numberFormat