Подтвердить что ты не робот

Параметрированные строки в Java

Я очень часто хочу писать многократно используемые строки с записями параметров в них, почти так же, как то, что вы нашли бы в 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? Или, есть ли лучший способ решить что-то подобное?

Что я действительно спрашиваю: - этот идеал?

4b9b3361

Ответ 1

String.format()

Начиная с Java 5, вы можете использовать String.format для параметризации строк. Пример:

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.

Ответ 2

Вы можете использовать String.format. Что-то вроде:

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

будет генерировать

"You requested bar but were assigned foo"

Ответ 5

Хорошо, если ваша строка была final, вы наверняка не сможете ее модифицировать позже. Я не знаю, может быть, вы могли бы найти лучший вариант использования для такого рода вещей, как вы могли бы просто сделать:

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

     String warning = "You requested" + requested + " but were assigned " + actual + " instead."     
     e.setText(warning);
}

Ответ 6

Я бы, наверное, сделал что-то вроде:

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.
}

Ответ 7

formatter может сделать это для вас (с некоторыми дополнениями, как добавление ведущих нулей, расстояние между которыми и многое другое)

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();}

}

Ответ 8

Класс String предоставляет следующий формат: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html. Например (в соответствии с исходным сообщением):

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);