使用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;

        }
发布了7 篇原创文章 · 获赞 6 · 访问量 1102

猜你喜欢

转载自blog.csdn.net/qq_28223195/article/details/105190677