Правильная строка формата для String.format или аналогичной
Я уверен, что раньше я использовал String.format
:
String.format("Some {1}, {2}, {3}", var1, var2, var3);
Позволяет ли это звонить кому угодно? Может быть, я думаю о С#, есть ли способ добиться того же в java?
Я знаю, что вы можете сделать что-то вроде:
String.format("Some %s, %d, %s", aString, aNumber, aString)
но синтаксис, который я за ним, для первого...
Ответы
Ответ 1
То, что вы ищете, это MessageFormat
, который использует заданный формат и входные параметры, например
MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);
И как уже упоминалось, String.format
все еще может выполнять задание с использованием альтернативного синтаксиса, но он менее эффективен в функциональности, а не в том, что вы запросили.
Ответ 2
Да, это типичная строка format в С#. В Java вы можете использовать последнее, то есть String.format("%s %d %d", ...)
.
Альтернативой является использование MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3)
, в котором используется нотация фигурных скобок .NET, как упоминается @Tobias, хотя для этого требуется импортировать java.text.MessageFormat
. Они также более подходят для использования локализованных ресурсов, где обычно есть внешние файлы .properties
с сообщениями в формате Error {0} ocurred due to {1}
.
Ответ 3
Мне не нравится указывать как индекс параметра, так и его тип - в основном при метании исключения и подготовке сообщения для него. Мне нравится способ 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));
}