42

SQL PreparedStatement で見られるものとほとんど同じように、パラメーター プレースホルダーを含む再利用可能な文字列を書きたいと思うことがよくあります。

これが例です

private static final String warning = "You requested ? but were assigned ? instead.";

public void addWarning(Element E, String requested, String actual){

     warning.addParam(0, requested);
     warning.addParam(1, actual);
     e.setText(warning);
     //warning.reset() or something, I haven't sorted that out yet.
}

このようなものはすでに Java に存在しますか? または、このような問題に対処するためのより良い方法はありますか?

私が本当に求めているのは、これは理想的ですか?

4

8 に答える 8

78

String.format()

String.formatJava 5 以降、文字列のパラメータ化に使用できます。例:

String fs;
fs = String.format("The value of the float " +
                   "variable is %f, while " +
                   "the value of the " + 
                   "integer variable is %d, " +
                   " and the string is %s",
                   floatVar, intVar, stringVar);

http://docs.oracle.com/javase/tutorial/java/data/strings.htmlを参照してください。

Stringまたは、より凝った処理を行うためのラッパーを作成することもできます。

MessageFormat

MaxのコメントとAffeの回答に従って、パラメータ化された文字列をMessageFormatクラスでローカライズできます。

于 2012-04-04T21:03:35.033 に答える
15

を使用できますString.format。何かのようなもの:

String message = String.format("You requested %2$s but were assigned %1$s", "foo", "bar");

発生します

"You requested bar but were assigned foo"
于 2012-04-04T21:04:10.157 に答える
7

組み込みです、はい。探しているクラスはjava.text.MessageFormatです

于 2012-04-04T21:05:43.967 に答える
2

Java 文字列フォーマッタ

于 2012-04-04T21:03:42.160 に答える
1

String クラスは、http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.htmlという format メソッドを提供します。例(元の投稿による):

private final static String string = "You requested %s but were assigned %s instead.";

public void addWarning(Element e, String requested, String actual) {
String warning = String.format(string, requested, actual);
e.setText(warning);
于 2012-04-04T21:43:58.383 に答える
0

私はおそらく次のようなことをします:

private final String warning = String.format("You requested %s but were assigned %s instead.", requested, actual);

文字列をフォーマットする呼び出しの前にパラメータ化された文字列を配置したい場合は、以下に示すようなことを行うことができますが、これはあまり明確ではありません。

これらのソリューションはいずれも、本質的にローカライズ可能ではありません。英語以外のロケールをサポートしたい場合は、.properties ファイルのようなものを検討することをお勧めします。

private static final String warning = "You requested %s but were assigned %s instead.";

public void addWarning(Element E, String requested, String actual){
     e.setText(String.format(warning, requested, actual);
     //warning.reset() or something, I haven't sorted that out yet.
}
于 2012-04-04T21:08:35.417 に答える
0

フォーマッタはこれを行うことができます(先頭にゼロを追加してスペースを空けるなどの追加機能があります)

private static final String warning = "%1$s を要求しましたが、代わりに %2$s が割り当てられました。";

public void addWarning(Element E, String requested, String actual){
     Formatter f = new Formatter();//you'll need to recreate it each time
     try{
         f.format(warning,requested,actual);
         e.setText(f.out().toString());
    }finally{f.close();}

}
于 2012-04-04T21:17:00.007 に答える
-1

あなたの String がだっfinalたら、後でそれを変更することはできません。単純にできるように、そのようなことのより良いユースケースを見つけることができるかどうかはわかりません:

public void addWarning(Element E, String requested, String actual){

     String warning = "You requested" + requested + " but were assigned " + actual + " instead."     
     e.setText(warning);
}
于 2012-04-04T21:05:38.053 に答える