Javascriptでsprintf「風」

Javascriptのreplace関数は第二引数に無名関数をとって、それをコールバック関数にして文字列の置換ができることを知った.それを試すためにsprintfみたいなのを書いた。あくまでsprintf「風」ね. %sを文字列で置き換えるだけ

function sprintf(){
  var format = arguments[0]; // format
  var args   = arguments;
  var i=1;
  return format.replace(/%s/g, function(){
    return args[i++];
  });
}

sprintf("%s is %s" , 'cinnamon' , 'dog'); // "cinnamon is dog"


もうちょっと「ぽく」してみる。

//argumentsにArrayのプロトタイプの関数を適用させるタイプ
function sprintf2(){
  var format = Array.prototype.shift.apply(arguments);
  var args   = arguments;
  var i=0;
  return format.replace(/%s/g, function(){
    return args[i++];
  });
}

sprintf2("%s is not %s" , 'hiboma' , 'dog'); // "hiboma is not dog"

//例えば
url = "http://example.com/search?id=%s&word=%s";
sprintf2(url ,  100 , encodeURI("hogehog hogehoge"));

//"http://example.com/search?id=100&word=hogehog%20hogehoge"
  • 引数の数が合わないとundefinedでうまる
  • argumentsオブジェクトを使ってるので引数の数を心配しなくていい

ところで「Javascript sprintf」でググる


いっぱいでてくる。....まずはググれと。

とっても参考になった記事

  • replaceの高度な使い方

sawatの日記 Unicodeエスケープ

  • argumentsを配列っぽくほげほげする

IT戦記 arguments を直接的に配列化