0

作为一项实验,我正在尝试围绕以下方法构建以下层次结构Number

                                     Number
                                       |
                                       |
                                      pad()
                                       /\
                                      /  \
                                     /    \
                                    /      \
                                 left()   right()

准确地说,我想要left()并且right()成为 pad() 的子方法,这样我就可以通过拨打以下电话来填充号码:

var i = 100;
i.pad().left();

这是我正在处理的一个实验性脚本:

/* 
    Javascript to pad zero's to a number at the left or right.
*/
Number.prototype.pad = function()
{
    Number.prototype.pad.left = function(l)
    {
        if(typeof l=='undefined') 
            l = 0;
        p = this+'';
        var r = l - p.length; 
        while((r--)>0)
            p = '0'+p;
        return p;
    }
    Number.prototype.pad.right = function(l)
    {
        if(typeof l=='undefined') 
            l = 0;
        p = this+'';
        var r = l - p.length; 
        while((r--)>0)
            p = p+'0';
        return p;
    }
}
i = 646;
padded = i.pad.left(9); /* Possible calling format*/
alert(padded); 

这在Javascript中怎么可能?

4

3 回答 3

3

已修复的问题:
1) 调用 pad() 而不仅仅是 pad
2) Pad() 返回具有左右成员的对象。
3) 最重要的是,'this' 在新函数中不起作用,因为它们不是数字的一部分。提取函数外的数字。
4) p 无意中被公开(window.p)。在前面放一个var。

看到它工作

  Number.prototype.pad = function() {

    var number = this.valueOf();
    return {
      left: function(l)
      {
        console.log(this);
          if(typeof l=='undefined') 
              l = 0;
          var p = number + '';
          var r = l - p.length; 
          while((r--) > 0)
              p = '0'+ p;
          return p;
      },
      right: function(l)
      {
          if(typeof l=='undefined') 
              l = 0;
          var p = number + '';
          var r = l - p.length; 
          while((r--)>0)
              p = p+'0';
          return p;
      }
  }
}
i = 646;
padded = i.pad().left(9); /* Possible calling format*/
  alert(padded); 
于 2012-12-17T10:41:24.097 回答
1

考虑一些更简单的事情。您可以将 left 和 right 作为参数传递给pad. 例如:

Number.prototype.pad = function( l,r ) {

  l = l || 0; r = r || 0;

  var arr = [ this ], 
      i = 0, j = 0;

  for ( ; i < l; ++i ) arr.unshift(0);
  for ( ; j < r; ++j ) arr.push(0);

  return arr.join('');

};

console.log( (12).pad(2,0) ); //=> 0012
console.log( (12).pad(0,1) ); //=> 120
console.log( (12).pad(3,2) ); //=> 0001200

这是一段更短、更实用、更简洁的代码,也可以:

Number.prototype.pad = function( l,r ) { 
  return this.toString()
    .replace( /\d+/, new Array( ++l ).join('0') +'$&'+
      new Array( ++r||0 ).join('0'));
}
于 2012-12-17T10:35:35.510 回答
0

我的版本

Number.prototype.lpad = function( num ) {

    var padding = new Array( num + 1 ).join("0"),
    result = padding + this.toString( 10 );
    return result.slice( -num );
}

Number.prototype.rpad = function( num ) {

    var padding = new Array( num + 1 ).join("0"),
    result = this.toString( 10 ) + padding;
    return result.slice( 0, num );
}
于 2012-12-17T11:36:27.320 回答