在JavaScript中用前导零填充数字

在JavaScript中用前导零填充数字,javascript,formatting,Javascript,Formatting,在JavaScript中,我需要填充 例如,如果我有数字9,它将是“0009”。如果我有一个数字,比如说10,它将是“0010”。请注意它如何始终包含四位数字 一种方法是将数字减去4,得到需要输入的0的数量 有更巧妙的方法吗?试试: String.prototype.lpad = function(padString, length) { var str = this; while (str.length < length) str = padString

在JavaScript中,我需要填充

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

一种方法是将数字减去4,得到需要输入的0的数量

有更巧妙的方法吗?

试试:

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


在2017年ECMAScript中,我们有了新的方法,其语法如下

所以现在我们可以使用

const str = "5";
str.padStart(4, "0"); // "0005"
功能焊盘四(编号){
if(number number
是一个箭头函数,除其他外,它取代了
函数
,并以其参数作为前缀
  • 如果arrow函数采用单个参数,则可以省略括号(因此
    number=>
  • 如果箭头函数体有一行以
    return
    开头,则可以省略大括号和
    return
    关键字,只需使用表达式即可
  • 为了将函数体降到一行,我作弊并使用了三元表达式
  • ES2017更新 您可以使用内置的

    n=9;
    字符串(n).padStart(4,'0');/'0009'
    n=10;
    字符串(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;
    }
    

    当您使用数字初始化数组时,它会创建一个将
    长度设置为该值的数组,以便该数组似乎包含那么多
    未定义的
    元素。尽管某些数组实例方法跳过没有值的数组元素,
    .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 );
        }
    }
    
    函数ZeroPadNumber(nValue)
    {
    如果(n值<10)
    {
    返回('000'+nValue.toString());
    }
    否则如果(n值<100)
    {
    返回('00'+nValue.toString());
    }
    否则如果(n值<1000)
    {
    返回('0'+nValue.toString());
    }
    其他的
    {
    返回值(nValue);
    }
    }
    

    此函数还根据您的特殊需要硬编码(4位填充),因此它不是通用的。

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

    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 );
    }
    
    这有两件事:

  • 如果数字大于指定的大小,它将简单地返回数字
  • 使用
    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);
    }
    
    String.prototype.padZero=函数(len,c){
    变量s='',c=c | |“0”,len=(len | | 2)-this.length;
    
    虽然(s.length自从你提到它的长度总是为4,我不会做任何错误检查来使它光滑。)

    想法:简单地用提供的数字替换“0000”…问题是,如果
    输入
    为0,我需要硬编码它以返回“0000”。LOL

    这应该足够光滑了


    JSFiddler:

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

    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"
    

    不漂亮,但很有效。

    新数组(需要+1)。加入('0')
    而不是昂贵的求幂法?:-)注意,在数字转换为科学记数法之前,这只适用于低于某个大小的长度。Pointy的数组用法通常更有效。(@Pointy:因为这只是为了好玩:)是的,我知道。这是数组构造函数唯一合法的用法,因此值得一提:-)为了完整起见,您应该从最后一个字符串中提取最后一个
    长度
    字符,以处理
    padString
    是多个符号的情况。您这样做,
    5.lpad(“-”,4)
    将产生“
    --5
    ”而不是“
    --5
    "。不建议将字符串原型扩展为任何其他内置组件。+1用于指出ES8解决方案。这里描述了一个简单的多填充:ES8解决方案应该是当今解决这一问题的答案。你应该将其放在答案的顶部。它很简单,但没有那么新颖;我最近不得不做一些类似的事情,并发现这种方法nline。只进行了投票,因为这不是一种模块化方法(仅适用于4位数字)。当然,它是对特定问题的特定答案,但包含长度选项会更好(与其他答案一样)。我喜欢slice的用法。但是,正如@doubleJ所提到的,请注意,这种方法的一个限制是将数字截断到最后4位。实际上@Jorgorpinel它不会截断。if语句导致slice操作仅对4位或更少数字进行操作。一个5位数字的值至少为10000,这不是。我认为自从
    sprintf(padToFour,“%04d”,number);
    @doubleJ-Pointy's和我的非常相似,如果不是完全相同的话,除了他的特征是能够用0以外的东西进行填充。你可以用他喜欢的
    pad(15,3)
    与我的使用方式大致相同。我首先将num转换为str,然后使用
    返回(数组(Math.max(5-str.length,0)).join(“0”)+str);
    ,如果另一个Q被删除,只需删除它。要处理负数,请使用该数字的绝对值,然后在最终结果上加上负号('-')。
    (数字<0?“-”:“”)+数组(Math.max(数字-字符串(值).length+1,0)).join(0)+value
    其中'value'是
    Math.abs(数字)
    。我非常喜欢这个解决方案@NeilMonroe,
    function pad ( num, size ) {
      if (num.toString().length >= size) return num;
      return ( Math.pow( 10, size ) + Math.floor(num) ).toString().substring( 1 );
    }
    
    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(input) {
        var BASE = "0000";
        return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
    }
    
    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"