Java - включение переменных в строки?

114

Итак, мы все должны знать, что вы можете включать переменные в строки, выполнив:

String string = "A string " + aVariable;

Есть ли способ сделать это, например:

String string = "A string {aVariable}";

Другими словами: без закрытия кавычек и добавления знаков плюса. Это очень непривлекательно.

Грей Адамс
источник
10
@Chandra Пожалуйста, не спрашивайте почему, а объясните, если возможно. Просто так я бы предпочел это сделать. Спасибо.
Gray Adams
3
Используйте Groovy, и тогда вы сможете делать "A string $ {aVariable}" все, что захотите.
Kaleb Brasee
2
В этом вопросе обсуждается целый ряд техник для подобных вещей , но они String.format()встроены в язык.
ig0774
@KalebBrasee Звучит идеально, но я всегда колеблюсь, когда дело касается изменения языков. Я не хочу отступать.
Gray Adams
1
@GrayAdams Groovy не отбрасывает вас назад, а освобождает! : D
Калеб Брэйси

Ответы:

124

Вы всегда можете использовать String.format (....). т.е.

String string = String.format("A String %s %2d", aStringVar, anIntVar);

Я не уверен, что это достаточно привлекательно для вас, но это может быть весьма кстати. Синтаксис такой же, как у printf и java.util.Formatter. Я часто его использовал, особенно если хочу показать табличные числовые данные.

Судно на воздушной подушке, полное угрей
источник
2
Я знаю, что это вопрос личного мнения, но я не понимаю, что formatможет быть привлекательнее простого выражения конкатенации строк. Само собой formatразумеется, когда вам нужно выполнить заполнение, форматирование чисел и т. Д.
Stephen C
1
@StephenC: Я с вами совершенно не согласен. Но это полезная альтернатива для форматирования строк, особенно когда необходимо выполнить заполнение, как вы говорите и как я сказал выше (например, для отображения табличных числовых данных). Я довольно часто использовал его для форматирования отчетов о биохимии крови и результатов анализа крови.
Судно на воздушной подушке Full Of Eels
@StephenC Мне нравится формат по нескольким причинам: во-первых, "% d" использует разделитель строк платформы. Во-вторых, вы можете легко найти все переменные в конце. Вы можете легко переформатировать или даже изменить порядок вводимых переменных. Легче избежать ошибок (например, 1 + "oops"), особенно если вы используете FindBugs (который анализирует строки формата и входные параметры). И, как говорит спрашивающий, во многих случаях это более читабельно. Конечно, обидно, что formatметод сделали статичным, это была довольно глупая дизайнерская ошибка.
Maarten Bodewes
@owlstead - «Конечно, жаль, что метод форматирования стал статическим, это была довольно глупая дизайнерская ошибка». . А? Как бы formatотноситься к целевой строке? Вы, конечно же, не предполагаете, что мы должны написать "A String %s %2d".format(aStringVar, anIntVar)... а вы?
Stephen C
1
@owlstead - "asFormat" было бы неправильно. Это означает, что метод создает и возвращает объект формата.
Stephen C
70

Это называется строковой интерполяцией; он не существует как таковой в Java.

Один из подходов - использовать String.format:

String string = String.format("A string %s", aVariable);

Другой подход - использовать библиотеку шаблонов, такую ​​как Velocity или FreeMarker .

Джейкоб Мэттисон
источник
38

Также учтите java.text.MessageFormat, что использует связанный синтаксис с числовыми индексами аргументов. Например,

String aVariable = "of ponies";
String string = MessageFormat.format("A string {0}.", aVariable);

приводит к stringсодержанию следующего:

A string of ponies.

Чаще всего этот класс используется для числового и временного форматирования. Пример JFreeChartформатирования этикетки описан здесь ; класс RCInfoформатирует панель состояния игры.

trashgod
источник
1
Для тех, кто пришел из CSharp, этот способ более прост, поскольку он похож на string.Format в C #.
Mojtaba
0

вы можете использовать формат String для включения переменных в строки

Я использую этот код для включения 2 переменных в строку:

String myString = String.format («это моя строка% s% 2d», variable1Name, variable2Name);

Alinn
источник