Framework風、再び以前のエントリ「String.format」でやりたいと思っていた、書式指定子のサポートをとりあえずやってみた。ダウンロードこちらから。Frameworkの劣化コピー的な発想なので、DateとNumberに書式指定可能なformatメソッドを追加し、String.formatのプレースホルダに指定した書式指定子をそのまま各クラスのformatに渡すように考えた。Dateはdateformat.jsを使わせてもらえば楽だったんだけど、クリエイティブ・コモンズのライセンス適用範囲に不安があったので結局自前で実装することにした。書式指定文字のエスケープができない、パーサの実装がないなどの面であきらかにdateformat.jsより劣っているのでorz、たいていはそちらを使ったほうがよいと思われる。(あと、組み込みオブジェクトの拡張が嫌いな場合とか)なくても実装は可能だったが、prototype.jsを前提に実装したため、prototype.jsを必要とする。完全に確認はしていないが、1.4.0以降なら問題ないはず。後述の通り、Date#format、Number#formatの実装に加え、String.formatも書式指定子サポートを追加して実装しなおした。FormattableインターフェイスDate、Numberとも似たようなことをするので、formatメソッドはFormattableオブジェクトに実装し、Date.prototoyep、Number.prototypeへ重ねるようにした。書式指定子の定義をそれぞれのコンストラクタ関数のメンバ「formatters」として定義し、formatメソッド内からthis.constructor経由で参照させている。具体的な実装は以下の通り。);}}書式指定子の基本設計pattern(RegExp)プロパティとformatメソッドをメンバに持つオブジェクトを定義した。formatメソッドの第一引数はフォーマット対象の値、第二引数以降にpatternプロパティの正規表現でexecした結果が渡される。pattern.length);}}と定義してあり、formatの第二引数patternに一致文字列全体が渡されるので、1文字かそれ以上かを判断して0詰を行うかそのままtoStringするかなどの分岐をしている。Date、Numberとも同一の設計のフォーマット情報を配列で持たせ、それをループ処理で適用している。yyyyは4桁、yyは下2桁、yは桁詰なしになる。MMは2桁、Mは桁詰なしになる。MMは2桁、Mは桁詰なしになる。HHは2桁、Hは桁詰なしになる。常に24時間書式になる。mmは2桁、mは桁詰なしになる。ssは2桁、sは桁詰なしになる。桁数はfの桁数に一致し、実際のgetMilliseconds()よりも指定桁数が少ない場合は丸められるが、丸め方は処理系依存になる(みたい。IEとFirefox/Operaで(0.150).toFixed(2)の結果が違う)。3桁ごとにカンマで区切る書式で、オプションで小数部を指定できる。小数部は0を必要桁数だけ指定する。小数点以下第4位まで必要な場合は"#,##0.0000"とする。指定桁数分だけ0詰を行う書式。オプションで小数部の指定も可能。整数部の桁数は書式指定子の0の桁数と実際の整数部の桁数の大きいほうが採用される。nで指定した桁数になるようゼロ詰される。xの大文字小文字の違いは9より大きい数のアルファベット文字に反映される。12時22分36秒dankogai氏の釣果がものすごい昨日のコネタでも触れたそろそろPHPに関して一言いっとくかだが、さすがの影響力でトラバもコメントもなかなか香ばしいことになっている。(さすがにそろそろ落ち着いてきたみたいだけど)まぁ、ヘタレなdara-jは普段はJavaScriptとかC#とかユル系の言語ばかりなので、リファレンスの「関数」群を見ただけで辟易するんですけど。仕事に使う奴は呪われるべきです。Web担当者Forumこれ、楽しいなぁ。目盛が表示されるだけなんだけど。引きずってむやみに画像のサイズ計測したり。Firebug立ち上げりゃすむのにね。ぐる先生の地図もそうだけど、ずるずると引きずるのはなんか気持ちいい。おっと、もうネタぎれかよ。16時21分11秒Ext.jsにString.formatあるじゃん「String.format.apply」という変わったキーワードでこのブログにたどり着いた人がいたみたいで、他にどんなんひっかかるかなと思ってぐーぐる先生に尋ねてみた。JS(旧:yui-ext)関連が引っかかる。おりょ?最初に目に付いたyui-ext0.40-alpha時の「yutil.js」を覗いたら、なんか、まんま「String.format」メソッドてのがあるじゃないですか。);とかなんとかって使うやつ。モロにここに書いたのと似てるやつですよ。JS)でどうなってるか探したら、「Ext.js」中にやっぱりまんま定義されてるし。まいったなー、こんな有名ドコのライブラリとモロかぶるとは...まあ、おおもとの発想は.NETだし、あるっちゃあるものなのかなぁ。ちなみにExtのやつはここの以前のバージョンと同じく書式指定子はなく、単純にパラメータ位置に対するプレースホルダ置換のみなんだけどね。17時55分04秒またEnjoy*Studyさんの後追いかよ...Date#formatのミリ秒フォーマットの実装部分で疑問を持ったのだが、Number#toFixedの丸め方が実装依存みたいだ。気になって検索したら、dateformat.jsの作者さんがやはり「Number#toFixedがブラウザによって結果が異なる場合がある」なんてエントリをあげておられた。俺まあ、がんばって調べてみるか。Editionを一生懸命読んでみる一旦読んで「さっぱりだぜ」とあきらめていたがもう一度Nuber.prototype.toFixedのところを読み直し、Enjoy*Studyさんが例示しておられたパターンでどうなるかを確認してみた。