0

実験として、次のようなメソッドの階層を構築しようとしていますNumber

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

正確には、次のような呼び出しを行うことで数値をパディングできるように、 and を pad() のサブメソッドにしたいleft()と考えています。right()

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 が誤って public になっていた (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 に答える