如何在JavaScript中输出带前导零的数字?

如何在JavaScript中输出带前导零的数字?,javascript,text-formatting,number-formatting,Javascript,Text Formatting,Number Formatting,有没有一种方法可以将前导零前置到数字,从而生成一个固定长度的字符串?例如,如果我指定2个位置,则5变为05 注:可能已过时。ECMAScript 2017包括: 您必须将数字转换为字符串,因为数字对前导零没有意义。大概是这样的: function pad(num, size) { num = num.toString(); while (num.length < size) num = "0" + num; return num; } 如果你关

有没有一种方法可以将前导零前置到数字,从而生成一个固定长度的字符串?例如,如果我指定2个位置,则5变为05

注:可能已过时。ECMAScript 2017包括:

您必须将数字转换为字符串,因为数字对前导零没有意义。大概是这样的:

function pad(num, size) {
    num = num.toString();
    while (num.length < size) num = "0" + num;
    return num;
}
如果你关心负数,你必须去掉-并阅读它。

更新:使用ES2017方法的小单线性函数:

const zeroPad=num,places=>Stringnum.padStartplaces,“0” console.logzeropad 5,2;//05 console.logzeropad 5,4;//0005 console.logzeropad 5,6;//000005
console.logzeropad 1234,2;//1234只是为了好玩,我有时间消磨时间,这是一个更复杂的实现,可以缓存零字符串:

pad.zeros = new Array(5).join('0');
function pad(num, len) {
    var str = String(num),
        diff = len - str.length;
    if(diff <= 0) return str;
    if(diff > pad.zeros.length)
        pad.zeros = new Array(diff + 1).join('0');
    return pad.zeros.substr(0, diff) + str;
}
如果填充计数很大,并且调用该函数的频率足够高,那么它的性能实际上优于其他方法…

谨此陈辞:

function pad(
  a, // the number to convert 
  b // number of resulting characters
){
  return (
    1e15 + a + // combine with large number
    "" // convert to string
  ).slice(-b) // cut leading "1"
}
您可以扩展Number对象:



您没有考虑负数组大小;例如zeroPad1234,2->RangeError:Invalid array Length根据这个基准测试,这个方法比公认的解决方案慢5倍:我喜欢这个代码,但在Chrome中看起来确实慢了。对查看其他浏览器的结果感兴趣:对于Node.js,这是最好的工作解决方案。Gjill1234,3==234函数zFilln,l{return l>n.toString.length?Arrayl.join'0'+n.slice-l:n;}这很好,但它有一个致命的缺陷。例如,pad1234,3==234!这显然是不可接受的。如果你想要填充长度超过15,它也会被破坏。优雅,但相当不灵活。@dave1010我在pad1234上得到了一个坏结果,产生1000000000134。参数pad1234,20产生1000000000001234谢谢@BrockAdams@JamesThomasMoon1979看见它不仅可以正常工作,而大多数其他答案在许多测试用例中都失败了,而且它的性能明显优于其他方法——特别是如果你使用注释中链接的对数变化。出于我的需要,我非常喜欢它。易于理解的另一种看待事物的方式。不像每个人。别这么想!以上所有的方法都有其优缺点,我发现我猜哪个更简单:00+h.slice-3@保罗布诺00+1234.5-3;给出234,即放弃最重要的数字。@DanielEarwicker确实如此,但您应该根据预期的数字数量进行调整。000+1234.slice-4、0000+12345.slice-5等等…如果还想限制数字的长度,可以使用以下命令:返回num/Math.pow10,size.toFixedsize.split'.[1];现在javascript支持:5.toString.padStart3,0.Second函数;shorter:function padnum,size{return'000000000'+num.substr-size;}^负值在很多版本的IE中都不起作用。啊,显然slice在IE中使用负值:也许有一个示例如何调用函数和结果?解决了:value=padvalue,18;=>总是返回18个字符,所以如果你加10个零的大小应该是10。我想这正是我需要的。参数“size”指的是最终的字符数,而不是要添加的零的总数,对吗?是的,它会检查总长度并进行比较。是的,这取决于使用它的位置。这本身并不是坏事,但如果在有大量第三方参与的空间中使用,可能会有覆盖功能的风险。9.pad和7.pad3与parens!这个问题无法与globals相比,也与IE6没有任何关系。这个问题是永恒的。它是多年前被发现的事实并不能使它消失。问题是语言本身在进化。谁能说你的.pad会像本地版本一样工作呢?我找不到我最初的评论。希望这只是堆栈溢出中的一个bug。如果它被删除,这将是一个糟糕的反映周围事物的状态。
function pad(a, b){
  return(1e15 + a + '').slice(-b);
}
function pad(
  a, // the number to convert 
  b // number of resulting characters
){
  return (
    1e15 + a + // combine with large number
    "" // convert to string
  ).slice(-b) // cut leading "1"
}
function zfill(num, len) {return (Array(len).join("0") + num).slice(-len);}
Number.prototype.pad = function(size) {
    var s = String(this);
    while (s.length < (size || 2)) {s = "0" + s;}
    return s;
}
(9).pad();  //returns "09"

(7).pad(3);  //returns "007"