在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?

注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。


当前回答

function zFill(n,l){
    return 
      (l > n.toString().length) ? 
        ( (Array(l).join('0') + n).slice(-l) ) : n;
}

其他回答

我经常使用这个结构来填充某个值n,已知是一个正的小数:

(offset + n + '').substr(1);

其中偏移量为10^^位。

例如,填充到5位数,其中n = 123:

(1e5 + 123 + '').substr(1); // => 00123

十六进制的版本稍微详细一些:

(0x100000 + 0x123).toString(16).substr(1); // => 00123

注1:我也喜欢@profitehlolz的解决方案,它是这个的字符串版本,使用slice()的漂亮的负索引特性。

可变长度填充功能:

function addPaddingZeroes(value, nLength)
{
    var sValue = value + ''; // Converts to string

    if(sValue.length >= nLength)
        return sValue;
    else
    {
        for(var nZero = 0; nZero < nLength; nZero++)
            sValue = "0" + sValue;
        return (sValue).substring(nLength - sValue.length, nLength);
    }
}

这个方法不是更快,但它相当原生。

zeroPad = function (num, count) {
    return [Math.pow(10, count - num.toString().length), num].join('').substr(1);
};

在测试了这个问题答案中15个不同的函数/方法之后,我现在知道哪个是最好的(最通用和最快的)。

我从这个问题的答案中选取了15个函数/方法,并制作了一个脚本来测量执行100个pad所花费的时间。每个数字垫上2000个零。这看起来有点过分,确实如此,但它让你对函数的缩放有了一个很好的了解。

我使用的代码可以在这里找到: https://gist.github.com/NextToNothing/6325915

您可以自行修改和测试代码。

为了得到最通用的方法,你必须使用循环。这是因为在数量非常大的情况下,其他人可能会失败,而这将会成功。

那么,使用哪个循环呢?这是一个while循环。for循环仍然很快,但while循环只是稍微快一点(几毫秒)——而且更干净。

Wilco, Aleksandar Toplek或Vitim的回答。我们会完美地完成这项工作。

就我个人而言,我尝试了不同的方法。我尝试使用递归函数填充字符串/数字。它比连接数组的方法更好,但仍然没有for循环那么快。

函数是:

function pad(str, max, padder) {
  padder = typeof padder === "undefined" ? "0" : padder;
  return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}

您可以使用我的函数设置填充变量,也可以不设置填充变量。就像这样:

pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'

就我个人而言,在我的测试之后,我会使用一个带有while循环的方法,比如Aleksandar Toplek或vic .us。但是,我将稍微修改它,以便您能够设置填充字符串。

所以,我会使用这段代码:

function padLeft(str, len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    str = str + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
padLeft(1, 3); // Returns '001'
// - Or -
padLeft(1, 3, "x"); // Returns 'xx1'

你也可以使用它作为一个原型函数,通过使用下面的代码:

Number.prototype.padLeft = function(len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    var str = this + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
var num = 1;

num.padLeft(3); // Returns '001'
// - Or -
num.padLeft(3, "x"); // Returns 'xx1'

如果填充数事先知道不超过某个值,还有另一种不循环的方法:

var fillZeroes = "00000000000000000000";  // max number of zero fill ever asked for in global

function zeroFill(number, width) {
    // make sure it's a string
    var input = number + "";  
    var prefix = "";
    if (input.charAt(0) === '-') {
        prefix = "-";
        input = input.slice(1);
        --width;
    }
    var fillAmt = Math.max(width - input.length, 0);
    return prefix + fillZeroes.slice(0, fillAmt) + input;
}

测试用例在这里:http://jsfiddle.net/jfriend00/N87mZ/