在JavaScript中用前导零填充数字

在JavaScript中,我需要填充。

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

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

有没有更巧妙的方法?

691074 次浏览

试一试:

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中,我们有了新的方法padStartpadEnd,它们的语法如下。

"string".padStart(targetLength [,padString]):

现在我们可以用

const str = "5";
str.padStart(4, "0"); // "0005"
function padToFour(number) {
if (number<=9999) { number = ("000"+number).slice(-4); }
return number;
}

是这样的吗?

额外的难以理解但更流畅的单行ES6版本:

let padToFour = number => number <= 9999 ? `000${number}`.slice(-4) : number;

ES6isms:

  • let是一个块作用域变量(与var的函数作用域相反)
  • =>是一个箭头函数,除其他功能外,它替代了function,并且前面有它的参数
  • 如果一个箭头函数只有一个参数,你可以省略括号(因此是number =>)
  • 如果一个箭头函数体只有一行以return开头,那么可以省略大括号和return关键字,只使用表达式
  • 为了将函数体压缩到一行,我作弊使用了三元表达式

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;
}

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

使用示例:

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


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

这不是真正的“光滑”,但它更快地做整数操作比做字符串连接每个填充0

function ZeroPadNumber ( nValue )
{
if ( nValue < 10 )
{
return ( '000' + nValue.toString () );
}
else if ( nValue < 100 )
{
return ( '00' + nValue.toString () );
}
else if ( nValue < 1000 )
{
return ( '0' + nValue.toString () );
}
else
{
return ( nValue );
}
}

这个函数也根据您的特殊需要(4位填充)进行了硬编码,所以它不是通用的。

为了好玩,我们不用循环来创建额外的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;
}

你可以这样做:

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 );
}

这有两件事:

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

你说过你有个号码

String.prototype.padZero= function(len, c){
var s= '', c= c || '0', len= (len || 2)-this.length;
while(s.length<len) s+= c;
return s+this;
}
Number.prototype.padZero= function(len, c){
return String(this).padZero(len,c);
}

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

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

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

这应该够光滑了。

JSFiddler: # EYZ0

有趣的是,我最近不得不这么做。

function padDigits(number, digits) {
return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}

使用:

padDigits(9, 4);  // "0009"
padDigits(10, 4); // "0010"
padDigits(15000, 4); // "15000"

不漂亮,但很有效。