細かすぎて伝わらないjQuery拡張 (9) “$.format” – Advent Calendar 2016
この記事は賞味期限切れです。(更新から1年が経過しています)
$.format は、”%s%d” 形式のフォーマットに則って整形された文字列を返す関数です。 sprintf のような物です。
$.format(format, value, value…)
使い方
$.format("%s,%s,%s", "foo", "bar", "baz"); // => "foo,bar,baz"
$.format("%s,%s,%s", "foo"); // => "foo,,"
$.format("%d years old", 23); // => "23 years old"
$.format("%d years old", "foo"); // => "NaN years old"
- 第一引数がフォーマット、第二引数以降はフォーマットに差し込む文字列または数値です
- 引数が不足している場合は空白で補います
- “%d” は数値化して差し込まれるので、数値でも数値文字列でもない場合は NaN になります
コード
$.format = function(format){
var i = 0,
j = 0,
r = "",
next = function(args){
j += 1; i += 1;
return args[j] !== void 0 ? args[j] : "";
};
for(i=0; i<format.length; i++){
if(format.charCodeAt(i) === 37){
switch(format.charCodeAt(i+1)){
case 115: r += next(arguments); break;
case 100: r += Number(next(arguments)); break;
default: r += format[i]; break;
}
} else {
r += format[i];
}
}
return r;
};
node の util.format を参考にしています。 なんなら、browserify で util を require した方が断然話は早いです。
var util = require("util");
util.format(...);
ただし、util には format 以外にも多くの機能が実装されているので、 format 以外にも何か活用できる機能があるなら良いのですが、 format の為だけに require するにはちょっと太りすぎかな、という気がします。
ちなみに正規表現で replace した方がコードはずっと短くて済みますが、パフォーマンスが大きく落ちます。 また、文字列比較より charCodeAt() でUnicodeコードを数値比較した方がコストが低いみたいです。 勉強になりました。
コメント
また、jQuery拡張として書かれているのでjQueryの読み込みも必要です。
どういうことですか?