phi

I'm a Game Programmer and Frontend Engineer passionate about programming education. Math / C / C++ / C# / JavaScript / HTML5 / CSS3 / Python

phiaryjust a creator

JavaScript で文字列フォーマットを実装してみた(sprintf もどき)

13 years ago

JavaScript には C言語の printf や sprintf にあたるメソッドがありません. JavaScript の文字列は ‘+’ でつなげることができるので必要ないっちゃ必要ないんですが視認性があまりよくありません.

そこで, それにあたる関数を自分で実装してみました. 正規表現を使っているので速度は微妙かも.

C言語のような実装にしてしまうと数多くのフォーマット指定子に対応しないといけないので面倒です. なので C# の Format や python 3 の format メソッドのような使い方のできる関数になっております.

format メソッド実装部

String オブジェクトのメンバメソッドに直接追加

// 存在チェック
if (String.prototype.format == undefined) {  
  /**
   * フォーマット関数
   */
  String.prototype.format = function(arg)
  {
    // 置換ファンク
    var rep_fn = undefined;

    // オブジェクトの場合
    if (typeof arg == "object") {
      rep_fn = function(m, k) { return arg[k]; }
    }
    // 複数引数だった場合
    else {
      var args = arguments;
      rep_fn = function(m, k) { return args[ parseInt(k) ]; }
    }

    return this.replace( /\{(\w+)\}/g, rep_fn );
  }
}

グローバル関数として定義

/**
 * フォーマット関数
 */
var $format = function(fmt, a)  
{
    var rep_fn = undefined;

    if (typeof a == "object") {
        rep_fn = function(m, k) { return a[ k ]; }
    }
    else {
        var args = arguments;
        rep_fn = function(m, k) { return args[ parseInt(k)+1 ]; }
    }

    return fmt.replace( /\{(\w+)\}/g, rep_fn);
}

Demo

今後, きっと ECMAScript でちゃんとした format 関数的な機能が追加されると思うので, それまでのつなぎとして使ってみてください.ちょっとだけ楽できると思います.