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форматирует панель состояния игры.


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

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.