在JavaScript中用前导零填充一个数字
在JavaScript中,我需要有padding。
例如,如果我有数字9,它将是 "0009"。如果我有一个数字,例如10,它将是 "0010"。请注意,它总是包含四个数字。
有一种方法是用数字减去4,得到我需要放的0的数量。
是否有更巧妙的方法来做这件事呢?
('000' + num).slice(-4)
就够了;)
- Martin Schneider 2017-04-13
String(n).padStart(4, '0')
- bpceee 2018-03-14
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
元素。尽管一些数组实例方法跳过了没有值的数组元素,但.join()
没有,或者至少没有完全跳过;它把它们当作其值是空字符串。因此,你会在每个数组元素之间得到一个零字符的拷贝(或者不管"z"是什么);这就是为什么那里有一个+ 1
。
用法举例:
pad(10, 4); // 0010
pad(9, 4); // 0009
pad(123, 4); // 0123
pad(10, 4, '-'); // --10
length
属性,并加入了length
次迭代。对未定义属性的访问总是返回undefined
。参见"5" in Array(5)
与"0" in [1]
- Benjamin Gruenbaum 2014-07-24
function pad(n, width, z) { while(n.length<width) n = '' + z + n; return n;}
- Paolo 2016-02-18
function pad(n, width=3, z=0) {return (String(z).repeat(width) + String(n)).slice(String(n).length)}
- Gui LeFlea 2016-06-01
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
关键字,只需使用表达式即可。 - 为了将函数体缩减到一行,我作弊使用了一个三元表达式
sprintf (padToFour, "%04d", number);
的时代以来,我们已经取得了倒退的进展。
- gregn3 2019-08-07
试试吧:
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"
在ECMAScript 2017中,我们有新的方法padStart
和padEnd
,它的语法如下。
"string".padStart(targetLength [,padString]):
因此,现在我们可以使用
const str = "5";
str.padStart(4, "0"); // "0005"
length
个字符,以处理padString
是一个以上的符号的情况。
- DCoder 2012-04-09
"5".lpad("--", 4)
会产生"----5
",而不是"---5
"。
- DCoder 2012-04-09
有趣的是,我最近不得不这样做了。
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"
不是很美,但很有效。
pad(15, 3)
。
- Peter C 2013-11-06
return (Array(Math.max(5-str.length, 0)).join("0") + str);
,只是把这个丢掉,以防其他Q被删除了
- ajax333221 2014-01-17
(number < 0 ? '-' : '') + Array(Math.max(digits - String(value).length + 1, 0)).join(0) + value
其中'值'为Math.abs(number)
。
- Neil Monroe 2015-02-20
你确实说过你有一个号码--
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 );
}
编辑:这只是一个函数的基本想法,但为了增加对更大的数字(以及无效输入)的支持,这可能会更好:
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
将支持更大的数字。
pad(1111111111111, 10)
返回714581447
- Serkan Yersen 2014-03-31
这其实并不 "聪明",但做整数运算比为每个填充物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位数的填充),所以它不是通用的。
((x < 10) ? '000' : (x < 100) ? '00' : (x < 1000) ? '0' : '')+(+x)
- AlexChaffee 2018-03-20
为了好玩,不使用循环来创造额外的零,而是使用循环:
function zeroPad(n,length){
var s=n+"",needed=length-s.length;
if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
return s;
}
new Array(needed + 1).join('0')
来代替那昂贵的指数运算如何? :-)
- Pointy 2012-04-09
既然你提到它的长度总是为4,那么我就不会做任何错误检查来使其变得更加灵活。)
function pad(input) {
var BASE = "0000";
return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}
主意:简单地用所提供的数字替换'0000'......这样做的问题是,如果input
是0,我需要用硬编码来返回'0000'。大笑。
这应该是够滑稽的了。
JSFiddler:http://jsfiddle.net/Up5Cr/
4-Math.ceil(...)
部分改为4-`${input}`.length()
- bvdb 2019-01-20