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

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


当前回答

事实上,我最近不得不想出一些类似的东西。 我想肯定有一种不用循环的方法。

这是我想到的。

function zeroPad(num, numZeros) {
    var n = Math.abs(num);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( num < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

然后使用它提供一个数字到零pad:

> zeroPad(50,4);
"0050"

如果该数字大于填充,则该数字将扩展到填充之外:

> zeroPad(51234, 3);
"51234"

小数也可以!

> zeroPad(51.1234, 4);
"0051.1234"

如果你不介意污染全局命名空间,你可以直接将它添加到Number:

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

如果你想让小数在填充中占据空间:

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - n.toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

干杯!



XDR提出了一个对数变化,似乎表现更好。

警告:如果num = 0(例如zeropad(0,2)),该函数将失败。

function zeroPad (num, numZeros) {
    var an = Math.abs (num);
    var digitCount = 1 + Math.floor (Math.log (an) / Math.LN10);
    if (digitCount >= numZeros) {
        return num;
    }
    var zeroString = Math.pow (10, numZeros - digitCount).toString ().substr (1);
    return num < 0 ? '-' + zeroString + an : zeroString + an;
}

说到性能,tomsmeding比较了前3个答案(4与对数变化)。猜猜哪一个的表现比另外两个好?:)

其他回答

我们的测试是假的,因为我的有个错别字。

zeroPad = function (num, count) {
    return ((num / Math.pow(10, count)) + '').substr(2);
};

Paul的是最快的,但我认为.substr比.slice快,即使它多了一个字符;)

不幸的是,对于这个问题,有很多不必要的复杂建议,通常涉及编写自己的函数来进行数学运算或字符串操作或调用第三方实用程序。但是,在基本JavaScript库中有一种标准的方法,只需一行代码就可以做到这一点。将这一行代码打包到一个函数中可能是值得的,以避免必须指定您永远不想更改的参数,如本地名称或样式。

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumIntegerDigits: 3,
    useGrouping: false
});

这将为文本生成值“005”。还可以使用Number的toLocaleString函数将零填充到小数点的右侧。

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumFractionDigits: 2,
    useGrouping: false
});

这将为文本生成值“5.00”。将useGrouping更改为true以使用逗号分隔千位。

请注意,使用带有locale和options参数的toLocaleString()在ECMA-402中是单独标准化的,而不是在ECMAScript中。到目前为止,一些浏览器只实现了基本的支持,即toLocaleString()可能会忽略任何参数。

完整的示例

我只是偶然发现这篇文章寻找一个本地的解决方案。由于没有内置的解决方案,以下是我的看法:

function zerofill(number, width) {
    var num = '';
    while (width-- > 0) {
        num += '0';
    }

    return num.slice(0, - (number + '').length) + number + '';
}

ECMAScript 2017: 使用padStart或padEnd

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"

更多信息:

https://github.com/tc39/proposal-string-pad-start-end https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

最新的方法要简单得多:

var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})

输出:“02”