Два способа форматирования
Java форматирует строки на основе шаблона, содержащего спецификаторы формата (заполнители %), плюс значения для подстановки. Есть две точки входа, и у них одинаковый синтаксис:
String.format(template, values...)возвращает новыйString.System.out.printf(template, values...)выводит результат напрямую.
Оба дают один и тот же текст. String.format возвращает его, чтобы вы могли сохранить; printf пишет его в консоль. Обратите внимание на %n в конце шаблона printf - это платформонезависимый перевод строки (в форматных строках предпочитайте его вместо \n).
Распространённые спецификаторы
Каждый спецификатор начинается с % и заканчивается буквой, которая указывает, какой тип значения ожидается:
Три повседневных - это %s (любое значение, через его toString), %d (целые числа) и %f (десятичные). Используйте %%, чтобы вывести буквальный знак процента. Передача неправильного типа - скажем, String в %d - выбрасывает IllegalFormatConversionException во время выполнения.
Управление десятичными знаками
%f по умолчанию использует шесть десятичных знаков, что редко вам нужно. Поставьте .N перед f, чтобы зафиксировать точность (значение округляется):
Добавьте флаг запятой для разделителей групп в больших числах:
Ширина и выравнивание
Число между % и буквой типа задаёт минимальную ширину поля, заполняя пробелами, чтобы столбцы выравнивались. Ведущий - выравнивает по левому краю; ведущий 0 дополняет числа нулями:
Именно это делает отформатированные таблицы и выровненные отчёты читаемыми:
%-8s выравнивает имена по левому краю в столбце шириной 8, а %5d выравнивает баллы по правому краю в столбце шириной 5, поэтому числа выстраиваются ровно независимо от количества цифр.
Порядок аргументов
По умолчанию спецификаторы потребляют значения слева направо. Вы можете повторить или переставить значение с помощью N$ (индекс с единицы), что удобно, когда одно и то же значение встречается дважды:
%1$s оба раза ссылается на первый аргумент, поэтому echo выводится дважды.
Метод formatted()
Начиная с Java 15, у каждой строки есть метод экземпляра formatted - тот же движок, что и у String.format, только записанный как вызов метода на шаблоне:
Он особенно хорошо сочетается с text blocks (многострочными строками в тройных кавычках) при построении более крупного отформатированного вывода.
Когда не стоит использовать String.format
Для простых разовых соединений обычная конкатенация через + понятнее и быстрее:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
Прибегайте к String.format / printf, когда вам нужно настоящее форматирование - фиксированные десятичные знаки, выравнивание, отступы, группировка, - а не просто склейка пары значений.
Далее: Операторы
Форматирование превращает значения в текст. Чтобы сначала вычислить эти значения, вам нужны операторы Java - арифметические, сравнения и логические. Это следующая страница.
Часто задаваемые вопросы
Как форматировать строку в Java?
Используйте String.format(template, values...), который возвращает новую строку, где каждый спецификатор формата заменён значением: String.format("%s is %d", name, age). Чтобы выводить напрямую, а не собирать строку, используйте System.out.printf(...) с тем же шаблоном. Начиная с Java 15 также можно вызвать template.formatted(values...).
Как форматировать число до двух десятичных знаков в Java?
Используйте спецификатор %.2f: String.format("%.2f", 3.14159) даёт "3.14". Число после точки указывает, сколько десятичных знаков сохранить, а значение округляется. Для разделителей тысяч добавьте флаг запятой: %,.2f даёт "1,234.57".
В чём разница между String.format и printf в Java?
Они используют абсолютно одинаковые спецификаторы формата. String.format(...) возвращает отформатированный текст как новый String, который можно сохранить или передать дальше. System.out.printf(...) пишет отформатированный текст прямо в стандартный вывод и не возвращает ничего полезного. Используйте String.format, чтобы собрать строку, и printf, чтобы её вывести.