NSLog の文字列フォーマットは C言語の printf と同じです。この文字列フォーマットには引数を文字列内に入れる順番を指定することができます。

NSLog(@"%@, %@, %@", @"one", @"two", @"three");

上記の実行結果は “one, two, three” です。
次に下記のように実行すると

NSLog(@"%3$@, %2$@, %1$@, %2$@", @"one", @"two", @"three");

実行結果は “three, two, one, two” となります。”n$” と指定することにより、何番目の引数を入れるかを指定することができます。また同じ引数を何度でも指定することができます。

まあ、実際に NSLog ではこんな使い方をすることはないと思います。
しかし、これを知っておくと動的に出力する文字列をローカライズするときに役立ちます。

例えば、次のような日本語を出力したいとします。
(あまりいい例文が思いつかなかったw)

  • 「太郎は2010年5月20日に花子と会った」

英語にローカライズすると

  • “Taro met hanako on May 20, 2010.”

この文章の中で「太郎」「花子」「2010年5月20日」が動的に変わるとすると困るのが語順が違うことです。
この時こそ、先程の文字列フォーマットの順番指定が聞いてきます。

.strings に下記のように指定してします。

"HogeFormat" = @"%1$@は%3$@に%2$@と会った";
"HogeFormat" = @"%1$@ met %2$@ on %3$@.";

実際に出力する際は語順を気にせずに全ての言語で同じ語順で指定すれば正しく出力されます。

format = NSLocalizedString(@"HogeFormat", nil);
formattedString = [NSString stringWithFormat:format, name, name2, date];

もちろん、日付のローカライズはその前に必要です。日付のローカライズに関しては下記エントリもご参照ください。
[iPhone] 日付をローカライズして表示する | Sun Limited Mt.

関連する投稿