首页 > 解决方案 > 如何用更少的行数优化下面的代码?

问题描述

我编写了以下代码,它处理大于 999 的数字并在其中添加逗号。例如 1,000 和 1,000,000。当数字增加时,逗号将被放置在正确的位置。我使用了 DRY 原则,我觉得还有另一种简单的方法来处理它。现在,我想知道是否有比我做的更好的方法。等待您的意见。

谢谢。

function seperate_num_by_comma() {

  var num = '199228754645.25',
    withOutComma = num.split('.'),
    addNewCommaAfter = 3,
    x = withOutComma[0].length % addNewCommaAfter,
    lenOfWithOutComma_0 = withOutComma[0].length,
    length_1 = withOutComma[0].length - x,
    starter = 0,
    wholeNumber = ' ';

  for (var i = 0; i < lenOfWithOutComma_0; i++) {

    function run_first_func() {
      wholeNumber += withOutComma[0].substr(starter, addNewCommaAfter);
    };

    function run_second_fun() {
      wholeNumber += withOutComma[0].substr(starter, addNewCommaAfter) + ",";
      starter += addNewCommaAfter;
      length_1 -= addNewCommaAfter;
    };

    if (x > 0) {
      if (length_1 == 0) {
        run_first_func();
        break;
      } else if (wholeNumber == ' ') {
        wholeNumber += withOutComma[0].substr(starter, x) + ",";
        length_1 -= addNewCommaAfter;
        starter = x;
      } else {
        run_second_fun();
      }
    } else if (x == 0) {
      if (length_1 == 3) {
        run_first_func();
        break;
      }
      run_second_fun();
    }
  }
  console.log(wholeNumber + '.' + withOutComma[1]);
}
seperate_num_by_comma();

标签: javascript

解决方案


一条线:

165B缩小版(无IE):seperate_by_comma=t=>(x=(""+t).split("."),z=x[0].replace(/((\d{3})*?)(\.|$)/,"|$1").split("|"),x[0]=z[0]+z[1].replace(/(.{3})/g,",$1").slice(!z[0].length),x.join("."))

或 180B,对 IE 友好:seperate_by_comma=function(t){x=(""+t).split(".");z=x[0].replace(/((\d{3})*?)(\.|$)/,"|$1").split("|");x[0]=z[0]+z[1].replace(/(.{3})/g,",$1").slice(!z[0].length);return x.join(".")}

解释:

seperate_num_by_comma = function(number){//12345678.9
  var str = String(t);
  
  var withoutDot = str.split("."); //["12345678", "9"]
  
  var chunksOfThree = withoutDot[0].replace(/((\d{3})*?)(\.|$)/,"|$1");//"12|345678"
  chunksOfThree = chunksOfThree.split("|");//["12", "345678"]
  
  chunksOfThree[1] = chunksOfThree[1].replace(/(.{3})/g,",$1") //",345,678"
  
  if(chunksOfThree[0].length==0){
    chunksOfThree[1] = chunksOfThree[1].slice(1); //Fix for specific cases
  }
  
  withoutDot[0] = chunksOfThree[0] /*"12"*/ + chunksOfThree[1] /*",345,678"*/
  return withoutDot.join(".") //"12,345,678.9"
}

推荐阅读