String.format ― 2007年04月27日 03時48分37秒
Date / Numberと連携して書式指定子を使えるバージョンをこちらのエントリで公開しました。(2007.5.22)
.NET Framework風の書式指定
はてさて需要があるかはわからんけど、.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; } ); }もともと可変パラメータを想定しているから仮引数をおいていないのでコードだけ見てもちょっとわかりづらいかも。
機能概要
使い方、というか仕様はだいたい次のとおり。
- 第一引数に書式項目を含んだ文字列、第二引数以降に、第一引数の書式項目を置換するパラメータを列挙指定する。
- 書式項目は中括弧'{}'の中に、パラメータインデックスを表す数値をおいた形式で、{0}はパラメータ0、{1}はパラメータ1といった感じ。
- たとえば、以下のコードの結果は"dara-jはだらだらとJavaScriptを書いています"になる。
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'みたいな書き方ができるのでちょっとだけタイプ量が減る。ほんとにちょっとだけどね。
最近のコメント