はてさて需要があるかはわからんけど、.NET FrameworkのString.Formatメソッドをちょっと真似た実装。
String.format = function() { var args = []; for(var i = 0; i < arguments.length; i++) args[i] = arguments[i]; var format = args.shift(); var reg = /\{((\d)|([1-9]\d+))\}/g; return format.replace( reg, function() { var index = Number( arguments[1] ); var result = args[ index ]; if( typeof( result ) == "undefined" ) throw new Error( "arguments[ " + index + " ] is undefined." ); return result; } ); }もともと可変パラメータを想定しているから仮引数をおいていないのでコードだけ見てもちょっとわかりづらいかも。
使い方、というか仕様はだいたい次のとおり。
String.format( "{0}はだらだらと{1}を書いています", "dara-j", "JavaScript" )
String.format("{0}こ{0}", "ぱんだ")
String.format("{0}, {2}", "a", "b")
上のようにスタティックメソッドとして実装していると、案外記述が冗長になるので、以下のようにString.prototypeを拡張しちゃうのもアリかと。
String.prototype.format = function() { var args = []; for(var i = 0; i < arguments.length; i++) args[i] = arguments[i]; return String.format.apply( String, [ this ].concat( args ) ); }こうすると、
"{0}, {1}, {2}".format( "zero", "one", "two" ); // → 'zero, one, two'みたいな書き方ができるのでちょっとだけタイプ量が減る。ほんとにちょっとだけどね。
セコメントをする