使用js實現,仿Excel ,數字格式化

主要要實現四個符號

  “#”:數字佔位符。只顯有意義的零而不顯示無意義的零。小數點後數字如大於”#”的數量,則按”#”的位數四捨五入。
  ”0”:數字佔位符。如果單元格的內容大於佔位符,則顯示實際數字,如果小於點位符的數量,則用0補足。
   ”.”:小數點
   ”,”:千位分隔符

後來因爲業務調整,千分位符不用實現了,見三個就打逗號, 0 和# 差不多也一併處理了,小數點,作爲核心 ,直接處理了
話不多說 ,直接上代碼

    let formatNumber = (template = '###', number = '') => {
            template = String(template);
            number = String(number);

            let modifiedNum,
                target,
                tempStr,
                reTemp,
                result,
                tepRadixLocal = template.indexOf('.'),
                numRadixLocal = number.indexOf('.'),
                tepZeroLenght = template.slice(tepRadixLocal + 1).length;
                 //模板的小數點的後位數
                numZeroLenght = number.slice(numRadixLocal + 1).length;

				//先判斷是否有小數點 
				//根據小數點的位置不同 有無 做不同處理
            if (tepRadixLocal != -1 && numRadixLocal == -1) {
                tempStr = "0";
                modifiedNum = number + '.';
                for (let i = 0; i < tepZeroLenght; i++) {
                    modifiedNum = String(modifiedNum) + tempStr
                }

            } else if (tepRadixLocal != -1 && numRadixLocal != -1) {

                if (tepZeroLenght < numZeroLenght) {
                    //四捨五入後的值                   
          modifiedNum = number.substring(0, numRadixLocal + 1) + roundRadix(number.substring(numRadixLocal + 1), tepZeroLenght);
                } else if (tepZeroLenght > numZeroLenght) {
                    modifiedNum = number;
                    for (let i = 0; i < tepZeroLenght - numZeroLenght; i++) {
                        modifiedNum = modifiedNum + '0';
                    }
                } else if (tepZeroLenght == numZeroLenght) {
                    modifiedNum = number;
                }
            } else if (tepRadixLocal == -1 && numRadixLocal != -1) {
                modifiedNum = number.slice(0, numZeroLenght);
            } else if (tepRadixLocal == -1 && numRadixLocal == -1) {
                modifiedNum = number;
            }
            target = modifiedNum.split('');
            reTemp = target.slice(0, target.indexOf('.'));
            //第一個數不用看
            for (let i = reTemp.length - 2; i > 0; i--) {
                if (i % 3 == 0) {
                    reTemp.splice(i, 0, ',');
                }

            }

            result = reTemp.concat(target.slice(target.indexOf('.'))).join('');

            return result;

        }
        //返回四捨五入
        function roundRadix(number, target = '') {
            number = String(number)
            let arr = number.split('');
            let str = '';
                arr[target] >= 5 ? (arr[target - 1] = Number(arr[target - 1]) + 1) : '';
                arr = arr.slice(0, target);
            for (let i = 0; i < arr.length; i++) {
                str += arr[i]
            }
            return str;

        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章