Текстовые блоки и форматирование
Многострочный текст и аккуратный вывод чисел — частые задачи. Для первой в Java есть текстовые блоки, для второй — форматирование по шаблону.
Текстовый блок
Текстовый блок начинается тремя кавычками """ и переводом строки, а заканчивается тремя кавычками. Переводы строк внутри сохраняются, и экранировать обычные кавычки не нужно:
void main() {
String poem = """
Роза красная,
Небо синее,
"Java" — лучшая!
""";
IO.print(poem);
}Результат:
Роза красная,
Небо синее,
"Java" — лучшая!Общий отступ слева Java убирает сама: он отсчитывается по самой левой строке и по положению закрывающих """.
Отступы внутри блока
Дополнительный отступ отдельных строк сохраняется. Это удобно для JSON, HTML и SQL прямо в коде:
void main() {
String json = """
{
"name": "Анна",
"age": 30
}""";
IO.println(json);
}Результат:
{
"name": "Анна",
"age": 30
}Здесь закрывающие кавычки стоят сразу после }, поэтому в конце блока нет перевода строки.
formatted и String.format
Метод formatted() подставляет значения в шаблон. В шаблоне %s обозначает место для строки, %d — для целого числа, %.2f — для дробного с двумя знаками после запятой:
void main() {
String name = "Олег";
int cups = 3;
double total = 10.5;
String text = "%s заказал %d чашки на $%.2f".formatted(name, cups, total);
IO.println(text);
}Результат:
Олег заказал 3 чашки на $10,50String.format(шаблон, значения) делает то же самое. Обратите внимание на запятую в 10,50: дробная часть оформляется по региональным настройкам системы. В русской локали это запятая, в английской — точка.
printf
System.out.printf() форматирует и сразу выводит. Перевод строки в шаблоне пишут как %n:
void main() {
System.out.printf("Товар: %s, цена: %.1f%n", "чай", 2.456);
System.out.printf("%d%% выполнено%n", 75);
}Результат:
Товар: чай, цена: 2,5
75% выполнено%.1f округляет до одного знака. Чтобы вывести сам знак процента, его удваивают: %%.
Ширина поля
Число между % и буквой задаёт минимальную ширину. По умолчанию значение прижимается вправо, а минус прижимает его влево. Так получаются ровные таблицы:
void main() {
String format = "%-10s|%6d%n";
System.out.printf(format, "Яблоки", 12);
System.out.printf(format, "Груши", 7);
System.out.printf(format, "Апельсины", 150);
}Результат:
Яблоки | 12
Груши | 7
Апельсины | 150Частая ошибка
После открывающих """ текст на той же строке писать нельзя — сразу должен идти перевод строки:
void main() {
String text = """Привет,
мир""";
IO.println(text);
}Результат (первая ошибка; за ней компилятор выводит ещё четыре — её следствия):
Main.java:2: error: illegal text block open delimiter sequence, missing line terminator
String text = """Привет,
^Начинайте содержимое блока со следующей строки.