Java: Форматирование строк
Вспомним, как работает конкатенация. Нужные строки и переменные со строками внутри соединяют знаком +.
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println(greeting + ", " + firstName + "!");
// => Hello, Joffrey!В сложных выражениях по такому коду трудно сразу понять, какой текст получится на выходе. Пробелы, запятые и кавычки начинают мешать восприятию. Даже этот пример требует небольшого усилия, чтобы прочитать итоговую строку.
Поэтому во многих языках есть отдельный способ собрать строку из шаблона и значений. Шаблон задает форму будущей строки, а на места меток подставляются нужные данные. В Java для этого вызывают метод String.format().
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println(String.format("%s, %s!", greeting, firstName));
// => Hello, Joffrey!Первый аргумент String.format() — это шаблон. Внутри шаблона стоят метки %s, на их места по порядку подставляются остальные аргументы. Первый %s заменяется на greeting, второй на firstName. Метка %s означает, что значение подставляется как строка.
String.format("%s, %s!", greeting, firstName)
└┬┘ └┬┘
"Hello" "Joffrey" → "Hello, Joffrey!"В варианте с шаблоном текст читается целиком. Пробелы, запятые и восклицательный знак видны сразу, а в цепочке из + они тонут среди кавычек.
Метод formatted
У того же действия есть второй вид записи. Метод formatted() вызывают прямо у строки-шаблона через точку, а значения передают в скобках.
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println("%s, %s!".formatted(greeting, firstName));
// => Hello, Joffrey!Здесь шаблон "%s, %s!" стоит слева от точки, а formatted() подставляет в него аргументы. Результат такой же, как у String.format(). Эти два способа делают одно и то же, выбирают любой по вкусу.
Пример с числом
Метка %s подставляет не только строки. На ее место можно поставить число, и оно само превратится в строку.
var school = "Hexlet";
var year = 2012;
var about = String.format("%s работает с %s года", school, year);
System.out.println(about); // => Hexlet работает с 2012 годаМетод собрал из шаблона и аргументов готовую строку и вернул ее. Результат сохранили в переменную about и вывели на экран.
Почему это удобно
Шаблон выглядит почти так же, как итоговая строка. Видно, где встанут пробелы и знаки препинания, видно, куда подставятся значения. По такому коду проще понять, что получится на выходе. Поэтому в большинстве задач сборку строки по шаблону предпочитают длинной цепочке конкатенаций.
Задание
Соберите приветствие по шаблону. Подставьте в шаблон "Hello, %s!" слово "World" с помощью метода String.format() и выведите результат на экран.
Ожидаемый вывод:
Hello, World!Java: Форматирование строк
Вспомним, как работает конкатенация. Нужные строки и переменные со строками внутри соединяют знаком +.
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println(greeting + ", " + firstName + "!");
// => Hello, Joffrey!В сложных выражениях по такому коду трудно сразу понять, какой текст получится на выходе. Пробелы, запятые и кавычки начинают мешать восприятию. Даже этот пример требует небольшого усилия, чтобы прочитать итоговую строку.
Поэтому во многих языках есть отдельный способ собрать строку из шаблона и значений. Шаблон задает форму будущей строки, а на места меток подставляются нужные данные. В Java для этого вызывают метод String.format().
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println(String.format("%s, %s!", greeting, firstName));
// => Hello, Joffrey!Первый аргумент String.format() — это шаблон. Внутри шаблона стоят метки %s, на их места по порядку подставляются остальные аргументы. Первый %s заменяется на greeting, второй на firstName. Метка %s означает, что значение подставляется как строка.
String.format("%s, %s!", greeting, firstName)
└┬┘ └┬┘
"Hello" "Joffrey" → "Hello, Joffrey!"В варианте с шаблоном текст читается целиком. Пробелы, запятые и восклицательный знак видны сразу, а в цепочке из + они тонут среди кавычек.
Метод formatted
У того же действия есть второй вид записи. Метод formatted() вызывают прямо у строки-шаблона через точку, а значения передают в скобках.
var firstName = "Joffrey";
var greeting = "Hello";
System.out.println("%s, %s!".formatted(greeting, firstName));
// => Hello, Joffrey!Здесь шаблон "%s, %s!" стоит слева от точки, а formatted() подставляет в него аргументы. Результат такой же, как у String.format(). Эти два способа делают одно и то же, выбирают любой по вкусу.
Пример с числом
Метка %s подставляет не только строки. На ее место можно поставить число, и оно само превратится в строку.
var school = "Hexlet";
var year = 2012;
var about = String.format("%s работает с %s года", school, year);
System.out.println(about); // => Hexlet работает с 2012 годаМетод собрал из шаблона и аргументов готовую строку и вернул ее. Результат сохранили в переменную about и вывели на экран.
Почему это удобно
Шаблон выглядит почти так же, как итоговая строка. Видно, где встанут пробелы и знаки препинания, видно, куда подставятся значения. По такому коду проще понять, что получится на выходе. Поэтому в большинстве задач сборку строки по шаблону предпочитают длинной цепочке конкатенаций.
Задание
Соберите приветствие по шаблону. Подставьте в шаблон "Hello, %s!" слово "World" с помощью метода String.format() и выведите результат на экран.
Ожидаемый вывод:
Hello, World!Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "Hello, World!";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
