Mach3.laBlog

細かすぎて伝わらない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コードを数値比較した方がコストが低いみたいです。 勉強になりました。

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

mach32ac00a19d261ed2dfb9c3434899a1ce9
エラーからわかる通り、$.format がきちんと宣言されていないのだと思われます。関数を使用する前に、記事内にあるコードで $.format を宣言しておく必要があります。
また、jQuery拡張として書かれているのでjQueryの読み込みも必要です。
もりf959d174cd21bc72a0ad373a4e529630
実行すると TypeError: $.format is not a function とエラーが表示されます。
どういうことですか?