web-dev-qa-db-ja.com

String.formatなどの正しいフォーマット文字列

見たことがあると思いますString.format以前は次のように使用しました:

String.format("Some {1}, {2}, {3}", var1, var2, var3);

これは誰かのために鐘を鳴らしますか?多分私はC#を考えています、Javaで同じことを達成する方法はありますか?

私はあなたが次のようなことをできることを知っています:

String.format("Some %s, %d, %s", aString, aNumber, aString)

しかし、私が求めている構文は前者のものです...

30
auser

あなたが探しているのは MessageFormat です。これは、指定された形式と入力パラメーターを使用します。

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);

そしてすでに述べたように、 String.format でも代替構文を使用してジョブを実行できますが、機能的にはそれほど強力ではなく、要求したものとは異なります。

37
Tobias N. Sasse

はい、それは典型的な formatC#の文字列です。 Javaでは、後者、つまりString.format("%s %d %d", ...)を使用できます。

alternativeMessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3)を使用することです。これは、@ Tobiasによって言及されているように、。インポートするには Java.text.MessageFormat 。また、ローカライズされたリソースを扱う場合にも適しています。通常、外部の.propertiesファイルにError {0} ocurred due to {1}形式のメッセージが含まれます。

12
João Silva

パラメータのインデックスとそのタイプの両方を指定するのは好きではありません-主に例外をスローしてメッセージを準備するときです。私はSLF4jがそれを行う方法が好きです。だから私はorg.slf4j.helpers.MessageFormatterを次のようにラップしました:

public static String subst(String string, Object...objects) {
    return MessageFormatter.arrayFormat(string, objects).getMessage();
}

その後、次のように使用できます。

public void main(String[] args) {
    throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}
10
Jaroslav Kuboš