代码之家  ›  专栏  ›  技术社区  ›  David Hellsing

长度小于时加零

  •  1
  • David Hellsing  · 技术社区  · 14 年前

    有没有一种聪明的方法可以将数字转换成字符串并自动加零,使长度与最大值相同?

    这样地:

    for (var i=0; i<30; i++) {
        var c = i.toString();
        if (c.length == 1) {
            c = '0'+=c;
        }
    }
    

    但更聪明

    10 回复  |  直到 12 年前
        1
  •  4
  •   Sean Kinsey    14 年前

    有无数种方法,这就是其中之一,而且实际上它也相当有效。

    更新2 这是“OP问题的第三种解释”的代码

    这将输出[“00”、“01”、“02”……“30”

    var max = 30, i = max, maxLength = max.toString().length, num,  zeroes=[];
    while (i--) zeroes.push("0");
    zeroes = zeroes.join();
    
    for (i=0; i < max ; i++) {
        num = i.toString();
        console.log(zeroes.substring(0, maxLength - num.length) + num);
    }
    

    更新1 对代码进行了调整,以便对OP问题进行“可能”的解释。

    如果您想要的代码是基于n=5,max=30生成29个“0”,后跟“5”,那么这就是您想要的代码

    var n = 5, max = 30;
    
    var a = n.toString().split(), zeroesToAdd = max - a.length;
    while(zeroesToAdd--) a.unshift("0");
    var num = a.join("");
    
    alert(num);​
    

    如果您想要的是基于n=5的代码,max=30生成2(长度为30.ToString())“0”s,后跟“5”,那么这就是您想要的代码

    var n = 5, maxLength = (30).toString().length;
    
    var a = n.toString().split(), zeroesToAdd = maxLength - a.length;
    while(zeroesToAdd--) a.unshift("0");
    var num = a.join("");
    
    alert(num);​
    

    这里唯一的区别是在第一行。

    它们不使用字符串连接(非常低效),而是使用 Array.unshift Array.join

        2
  •  4
  •   steveax    12 年前

    我认为最快的方法是不使用循环。 像这样:

    var pad="000000";
    var str="182"; //or any desired number here
    
    var result=pad.slice(str.length)+str;
    

    结果将是000182。让我知道。

    迈克尔

        3
  •  1
  •   oezi    14 年前

    您可以向Google先生请求 sprintf() wich在其他一些情况下可能很有用——但是如果您只需要执行这个操作,那么这样的函数将有点开销过大。

        4
  •  1
  •   Pops Atula    14 年前

    我不完全确定我明白你所说的“更聪明”是什么意思,但我确实找到了这个灵活的零填充方法(由于@sean的评论,稍微修改了一下;我的代码注释中):

    function PadDigits(n, totalDigits)
    {
        n = n.toString();
        var pd = '';
        // Figure out if we need to pad at all
        if (totalDigits > n.length)
        {
            // Construct a string of as many leading zeroes as needed
            for (i = 0; i < (totalDigits-n.length); i++)
            {
                pd += '0'; // String concat for EACH leading zero; inefficient
            }
        }
        // Add the leading zeroes to the string representing the original number
        return pd + n; // Removed unnecessary toString() here
    }
    

    来源: http://classicasp.aspfaq.com/general/how-do-i-pad-digits-with-leading-zeros.html

        5
  •  0
  •   Romain Deveaud    14 年前
    for (var i=0; i<30; i++)
      var c = i < 10 ? '0'+i.toString() : i.toString() ;
    
        6
  •  0
  •   kennebec    14 年前
    var c=i.toString(), len=30-c.length;
    while(len>0){
       c='0'+c;
       --len;
      }
    
        7
  •  0
  •   sworoc    14 年前
    var zeroPad = "000";
    
    for(var i=0; i<30; i++) {
     var output = zeroPad + i.toString();
     output.substr(output.length - 2);
    }
    

    如果您在零位中改变“0”的数字,并改变您的长度偏移量,这将适用于您想要的任何大小(显然是有原因的)。不是最好的,但它很有效而且很简单。

        8
  •  0
  •   Gabriele Petrioli    14 年前

    以下是如何操作(参数化)

    // number is the number you need to convert, and maxdigits is the total number of digits including the number
    function leadingZeros( number, maxdigits )
    {
     var number_text = number.toString();
     var number_len = number_text.length;
    
     for (var i=0;i<maxdigits-number_len;i++)
         number_text = '0'+number_text;
    
     return number_text;
    }
    // example leadingZeros(3,5)   will return 00003
    // example leadingZeros(194,5) will return 00194
    
        9
  •  0
  •   Filburt kukabuka    14 年前

    出于礼貌 4GuysFromRolla ,对于用于vbscript的对象:

    var padd = "000000000000000000000000000000";
    var sourceval = 100;
    
    alert(Right(padd + sourceval, 30));
    
    function Right(str, n)
    {
        if (n <= 0)
        {
            return "";
        }
    
        if (n > String(str).length)
        {
            return str;
        }
    
        var iLen = String(str).length;
        return String(str).substring(iLen, iLen - n);
    }
    
        10
  •  0
  •   whatsisname    14 年前

    如果你想确定你需要多少个数字,那么就把你要转换成字符串的最大数字的上限(log10)设置为一个上限,这样就可以知道,假设你在小数点右边没有任何东西。