在 JavaScript 中对值进行零填充的推荐方法是什么?我想我可以构建一个自定义函数来将零填充到类型转换值上,但我想知道是否有更直接的方法来做到这一点?
注意:我所说的“zerofilled”是指这个词的数据库意义(其中数字 5 的 6 位零填充表示将是“000005”)。
在 JavaScript 中对值进行零填充的推荐方法是什么?我想我可以构建一个自定义函数来将零填充到类型转换值上,但我想知道是否有更直接的方法来做到这一点?
注意:我所说的“zerofilled”是指这个词的数据库意义(其中数字 5 的 6 位零填充表示将是“000005”)。
我无法相信这里所有复杂的答案......只需使用这个:
var zerofilled = ('0000'+n).slice(-4);
简单的方法。您可以为打击垫添加字符串乘法并将其转换为函数。
var pad = "000000";
var n = '5';
var result = (pad+n).slice(-pad.length);
作为一个函数,
function paddy(num, padlen, padchar) {
var pad_char = typeof padchar !== 'undefined' ? padchar : '0';
var pad = new Array(1 + padlen).join(pad_char);
return (pad + num).slice(-pad.length);
}
var fu = paddy(14, 5); // 00014
var bar = paddy(2, 4, '#'); // ###2
读者注意!
正如评论者指出的那样,这个解决方案是“聪明的”,而且通常是聪明的解决方案,它是内存密集型的并且相对较慢。如果您关心性能,请不要使用此解决方案!
可能已过时:ECMAScript 2017 包括String.prototype.padStart和Number.prototype.toLocaleString自 ECMAScript 3.1 以来就存在。例子:
var n=-0.1; n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false})
...将输出“-0000.10”。
// or const padded = (.1+"").padStart(6,"0"); `-${padded}`
...将输出“-0000.1”。
一个简单的功能就是你所需要的
function zeroFill( number, width )
{
width -= number.toString().length;
if ( width > 0 )
{
return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number;
}
return number + ""; // always return a string
}
如果你想保存命名空间或其他什么,你可以将它烘焙到一个库中。就像jQuery 的扩展一样。
我实际上最近不得不想出这样的东西。我认为必须有一种方法可以在不使用循环的情况下做到这一点。
这就是我想出的。
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;
}
然后只需使用它提供一个数字到零填充:
> 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 等于零(例如 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 个与对数变化)。猜猜哪一个主要优于其他两个?:)
这是我用来填充最多 7 个字符的数字。
("0000000" + number).slice(-7)
对于大多数人来说,这种方法可能就足够了。
编辑:如果你想让它更通用,你可以这样做:
("0".repeat(padding) + number).slice(-padding)
编辑 2:请注意,从 ES2017 开始,您可以使用String.prototype.padStart
:
number.toString().padStart(padding, "0")