Java - Включаючи змінні в рядки?


114

Гаразд, тому ми всі повинні знати, що ви можете включати змінні в рядки, виконуючи:

String string = "A string " + aVariable;

Чи є спосіб зробити це так:

String string = "A string {aVariable}";

Іншими словами: без закриття лапок та додавання знаків плюс. Це дуже непривабливо.


10
@Chandra Будь ласка, не запитуйте чому, а краще поясніть, якщо це можливо. Просто я вважаю за краще це зробити. Дякую.
Сірий Адамс

3
Використовуйте Groovy, тоді ви зможете зробити "string $ {aVariable}" все, що вам потрібно.
Калеб Брезе

2
У цьому питанні розглядаються цілі різноманітні методики подібних речей , але String.format()вони вбудовані в мову.
ig0774

@KalebBrasee Це звучить ідеально, але я завжди вагаюся, коли мова йде про зміну мов. Я не хочу повертати себе назад.
Сірий Адамс

1
@GrayAdams Groovy не повертає вас, він звільняє вас! : D
Калеб Брезе

Відповіді:


123

Ви завжди можете використовувати String.format (....). тобто

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

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


2
Я знаю, що це питання думки, але я не бачу, наскільки formatце привабливіше, ніж просте вираження конкатенації String. Де formatвступає в свої права , коли вам потрібно зробити відступи форматування чисел, і так далі.
Стівен C

1
@StephenC: Я з вами зовсім не згоден. Але це корисна альтернатива для форматування рядків, особливо коли потрібно робити прокладки, як ви говорите, і як я вже говорив вище (тобто показувати табличні числові дані). Я використав це досить небагато для форматування хімії крові та звітів про результати CBC.
Hovercraft Full Of Eels

@StephenC Мені подобається формат з кількох причин: насамперед, "% d" використовує роздільник ліній платформи. По-друге, ви можете легко знайти всі змінні в кінці. Ви можете легко переформатувати або навіть змінити порядок введених змінних. Простіше уникнути помилок (наприклад 1 + "oops"), особливо якщо ви використовуєте FindBugs (який аналізує рядки формату та параметри введення). І, як каже запитувач, у багатьох випадках це читабельніше. Звичайно, прикро, що formatметод був зроблений статичним, це була досить дурна помилка дизайну.
Maarten Bodewes

@owlstead - "Звичайно, шкода, що метод формату став статичним, це була досить дурна помилка дизайну". . Так? Як би formatставитися до цільового рядка? Звичайно, ви не припускаєте, що від нас слід очікувати, що ми пишемо "A String %s %2d".format(aStringVar, anIntVar)... чи не так?
Стівен C

1
@owlstead - "asFormat" не буде правильним. Це означає, що метод створює і повертає об'єкт формату.
Стівен С

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 #.
Мойтаба

0

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

Я використовую цей код для включення 2 змінної у рядку:

String myString = String.format ("це мій рядок% s% 2d", змінний1Name, змінний2Name);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.