用JavaScript中的前导零填充数字

可能重复:
我如何使用JavaScript创buildZerofilled值?

在JavaScript中,我需要填充。

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

一种方法是减去数字减去4,得到我需要的0的数量。

是否有这样做的一个狡猾的方式?

到目前为止,还没有很多“光鲜”

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

当用数字初始化一个数组时,它将创build一个length设置为该值的数组,以便该数组看起来包含许多undefined元素。 虽然有些数组实例方法跳过没有值的数组元素,但.join()不会,或者至less不完全是。 它把它们看作是它们的值是空string。 因此,你得到每个数组元素之间的零字符(或任何“z”是)的副本; 这就是为什么有一个+ 1

用法示例:

 pad(10, 4); // 0010 pad(9, 4); // 0009 pad(123, 4); // 0123 pad(10, 4, '-'); // --10 
 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是一个块范围variables(与var的function范围相反)
  • =>是一个箭头函数,用来replacefunction ,并由其参数作为前缀
  • 如果一个箭头函数采用单个参数,则可以省略括号(因此number =>
  • 如果一个箭头函数体有一行以return开头的行,那么可以省略大括号和return关键字,并简单地使用expression式
  • 为了将函数体下到一行,我欺骗并使用了一个三元expression式

尝试:

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

现在testing:

 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


在ES8中,我们有新的方法padStartpadEnd ,它具有下面的语法。

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

所以现在我们可以使用

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

好笑,我最近不得不这样做。

 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" 

不漂亮,但有效。

你确实说过你有一个数字 –

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

你可以做这样的事情:

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

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

 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将支持更大的数字。

为了好玩,而不是使用循环来创build额外的零:

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

这不是真的“光滑”,但是做整数操作比为每个填充0进行string连接要快。

 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位填充)进行硬编码的,所以它不是通用的。

既然你提到它总是会有4的长度,我不会做任何错误检查,使这种浮油。 ;)

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

想法:只需用提供的号码replace“0000”…问题是,如果input为0,我需要硬编码返回“0000”。 大声笑。

这应该是光滑的。

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