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

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


当前回答

一个简单优雅的解,n是数字,l是长度。

函数nFill (n, l){返回(l > n.toString () . length) ?((数组(l) . join(“0”)+ n) .slice (- l)): n;}

这将保持长度,如果它是超过所需的,而不是改变数字。

N = 500; console.log (nFill (n, 5)); console.log (nFill (n, 2)); 函数nFill (n, l){返回(l > n.toString () . length) ?((数组(l) . join(“0”)+ n) .slice (- l)): n;}

其他回答

现代浏览器现在支持padStart,你现在可以简单地做:

string.padStart(maxLength, "0");

例子:

字符串= "14"; maxLength = 5;// maxLength是最大字符串长度,而不是max #填充 Res =字符串。padStart(最大长度,“0”); console.log (res);//打印"00014" 人数= 14; maxLength = 5;// maxLength是最大字符串长度,而不是max #填充 res = number.toString()。padStart(最大长度,“0”); console.log (res);//打印"00014"

这是我用来填充7个字符的数字。

("0000000" + number).slice(-7)

这种方法可能对大多数人来说已经足够了。

编辑:如果你想让它更通用,你可以这样做:

("0".repeat(padding) + number).slice(-padding)

编辑2:注意,自ES2017以来,你可以使用String.prototype.padStart:

number.toString().padStart(padding, "0")

我使用这个片段来获得一个五位数的表示:

(value+100000).toString().slice(-5) // "00123" with value=123

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

这是我想到的。

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与对数变化)。猜猜哪一个的表现比另外两个好?:)

我真的不知道为什么,但没有人用最明显的方式去做。这是我的实现。

功能:

/** Pad a number with 0 on the left */
function zeroPad(number, digits) {
    var num = number+"";
    while(num.length < digits){
        num='0'+num;
    }
    return num;
}

原型:

Number.prototype.zeroPad=function(digits){
    var num=this+"";
    while(num.length < digits){
        num='0'+num;
    }
    return(num);
};

很简单,我看不出还有什么比这更简单的了。出于某种原因,我在这里已经看到很多次了,人们只是试图不惜一切代价避免“For”和“while”循环。使用regex可能会为这样一个微不足道的8位数填充花费更多的周期。