在JavaScript中,我需要填充。

例如,如果我有数字9,它将是“0009”。如果我有一个数字,比如10,它将是“0010”。注意它总是包含四位数字。

一种方法是用这个数减去4得到我需要放0的个数。

有没有更巧妙的方法?


当前回答

ES2017更新

你可以使用内置的String.prototype.padStart()

n = 9;
String(n).padStart(4, '0'); // '0009'

n = 10;
String(n).padStart(4, '0'); // '0010'

到目前为止,还没有太多“圆滑”的事情发生:

function pad(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

当您用一个数字初始化一个数组时,它会创建一个长度设置为该值的数组,以便数组看起来包含许多未定义的元素。虽然一些Array实例方法跳过不带值的数组元素,但.join()不会,或者至少不会完全跳过;它将它们的值视为空字符串。因此,在每个数组元素之间,你得到了一个0字符(或无论“z”是什么)的副本;这就是为什么这里有+ 1。

使用示例:

pad(10, 4);      // 0010
pad(9, 4);       // 0009
pad(123, 4);     // 0123

pad(10, 4, '-'); // --10

其他回答

你可以这样做:

function pad ( num, size ) {
  return ( Math.pow( 10, size ) + ~~num ).toString().substring( 1 );
}

编辑:这只是一个函数的基本思想,但是为了增加对更大数字(以及无效输入)的支持,这可能会更好:

function pad ( num, size ) {
  if (num.toString().length >= size) return num;
  return ( Math.pow( 10, size ) + Math.floor(num) ).toString().substring( 1 );
}

这有两件事:

如果该数字大于指定的大小,它将简单地返回该数字。 使用Math.floor(num)代替~~num将支持更大的数字。

为了好玩,我们不用循环来创建额外的0:

function zeroPad(n,length){
  var s=n+"",needed=length-s.length;
  if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
  return s;
}

ES2017更新

你可以使用内置的String.prototype.padStart()

n = 9;
String(n).padStart(4, '0'); // '0009'

n = 10;
String(n).padStart(4, '0'); // '0010'

到目前为止,还没有太多“圆滑”的事情发生:

function pad(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

当您用一个数字初始化一个数组时,它会创建一个长度设置为该值的数组,以便数组看起来包含许多未定义的元素。虽然一些Array实例方法跳过不带值的数组元素,但.join()不会,或者至少不会完全跳过;它将它们的值视为空字符串。因此,在每个数组元素之间,你得到了一个0字符(或无论“z”是什么)的副本;这就是为什么这里有+ 1。

使用示例:

pad(10, 4);      // 0010
pad(9, 4);       // 0009
pad(123, 4);     // 0123

pad(10, 4, '-'); // --10

Try:

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}

现在测试:

var str = "5";
alert(str.lpad("0", 4)); //result "0005"
var str = "10"; // note this is string type
alert(str.lpad("0", 4)); //result "0010"

DEMO


在ECMAScript 2017中,我们有了新的方法padStart和padEnd,其语法如下。

“弦”。padStart (targetLength, padString]):

现在我们可以用

const str = "5";
str.padStart(4, "0"); // "0005"

因为你提到了它的长度总是4,我不会做任何错误检查来让这个光滑。;)

function pad(input) {
    var BASE = "0000";
    return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}

想法:简单地替换'0000'与数字提供…问题是,如果输入是0,我需要硬编码它返回'0000'。哈哈

这应该够光滑了。

JSFiddler: http://jsfiddle.net/Up5Cr/