Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Текстовые блоки и форматирование

Многострочный текст и аккуратный вывод чисел — частые задачи. Для первой в 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,50

String.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 = """Привет,
                     ^

Начинайте содержимое блока со следующей строки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.