[iOS][Android] フォーマット文字列のパラメータ代入位置を指定する方法

2016.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

n$

フォーマット文字列のパラメータの代入位置を指定するためには n$ という書式指示子を利用します。(n は数字)
これは iOS, Android どちらも同じです。

("%3$s %1$s %2$s.", "I", "have", "failed")
// -> failed I have.

サンプルコード

iOS

NSString *lastName = @"Tanaka";
NSString *firstName = @"Keisuke";

NSLog(@"私は %@ %@ です。", lastName, firstName);
// -> 私は Tanaka Keisuke です。

NSLog(@"私は %2$@ %1$@ です。", lastName, firstName);
// -> 私は Keisuke Tanaka です。

Android

Formatter formatter;
String lastName = "Tanaka";
String firstName = "Keisuke";

formatter = new Formatter();
formatter.format("I am %s %s.", lastName, firstName);
System.out.println(formatter);
// -> I am Tanaka Keisuke.

formatter = new Formatter();
formatter.format("I am %2$s %1$s.", lastName, firstName);
System.out.println(formatter);
// -> I am Keisuke Tanaka.

使いどころ

私が経験した、使えるポイントは「ローカライズ時の文字列」です。
年月日 の表示など日本語と英語で順序が違う場合、言語ごとのフォーマット文字列を用意するだけで、コードを分岐することなく期待する項目を表示することができます。

例(iOS)

Localizable.strings(日本語用)

"ReleaseDate" = "%1$d 年 %2$d 月 %3$d 日";

Localizable.strings(英語用)

"ReleaseDate" = "%2$d / %3$d, %1$d";

実装

NSInteger year = 2016;
NSInteger month = 6;
NSInteger day = 28;

NSLog(NSLocalizedString(@"ReleaseDate", nil), year, month, day);

実行結果

日本語環境: 2016 年 6 月 28 日
英語環境: 6 / 28, 2016

このようにパラメータの順序は固定のまま代入する箇所を変更することができます。
覚えておくといいことがあるかもしれません。

リンク

ミレニアム・ファルコン製作日記 #18

18 号 表紙

mfd_18_1

パーツ

mfd_18_2

mfd_18_3

mfd_18_4

成果

mfd_18_5

mfd_18_6

今回の作業は以下の 2 つでした。

  • 外殻フレームを展開する
  • 通路アーチを組み立てる

これまで取り付けた外殻フレームに 3 つのフレームを追加しました。
これで船体下部フレームの 3 分の 1 が出来上がりました。
たまにビスがフレームと噛み合わない部分があって怖いですが、すぐに取れそうという感じでもないので大丈夫でしょう、きっと。

出ました、通路アーチの組み立て。
細かいクッションに接着剤を付けて、という例のアレです。
面倒だと思いながらもこれまで数をこなしてきたおかげで、かなりスムーズに作業を進められるようになりました。
もう「通路アーチマスター」を名乗ってもいいでしょう。(心はダークサイドに堕ちてきましたが・・・)

LEGO®スター・ウォーズ/フォースの覚醒

今回の例題で出した 2016 年 6 月 28 日 という日付は、海外における LEGO®スター・ウォーズ/フォースの覚醒 の発売日です。
日本での発売日は 2016 年 10 月 13 日 なので、一刻も早く遊びたい人は海外版を買ってみるのもいいと思います。

それではまた次回。

May the Force be with you!