String.format2007年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")
    
ほんとは{0:#,##0}とか{0:yyyy/MM/dd}みたいに書式指定子をサポートしたほうが使いでがあるんだけど、とりあえずの実装ということで。

おまけ

上のようにスタティックメソッドとして実装していると、案外記述が冗長になるので、以下のように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'
みたいな書き方ができるのでちょっとだけタイプ量が減る。ほんとにちょっとだけどね。

参考:String.Format メソッド (String, Object[]) (System):(MSDN)

コメント

_ pcrice ― 2010年08月01日 03時43分18秒

自分は普段C#使ってるんですが、JavaScriptにもあったらなーって思ってたとこでした。早速使わせてもらいますw

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/04/27/1468311/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。

_ Collection & Copy - 2007年05月07日 03時34分49秒

最終更新 2006/5/7 JsonML (JSON Markup Language) IT戦記 - JsonML を使う高速テンプレートエンジン「JsonML.Template」 JSLT javascript-based XSLT alternative ZParse - Advanced Javascript Templating Nike Templates mjt JsonT - Transforming Json TrimPath - JavaS