1. Обзор
В этом руководстве мы продемонстрируем различные примеры форматирования с помощью `` метода printf() .
****
Этот метод является частью класса java.io.PrintStream
и обеспечивает форматирование строк, аналогичное функции printf()
в C.
2. Синтаксис
Мы можем использовать один из этих методов PrintStream
для форматирования вывода:
System.out.printf(format, arguments);
System.out.printf(locale, format, arguments);
Мы указываем правила форматирования с помощью параметра формата
. Правила начинаются с символа % .
Давайте рассмотрим краткий пример, прежде чем углубляться в детали различных правил форматирования:
System.out.printf("Hello %s!%n", "World");
Это дает следующий результат:
Hello World!
Как показано выше, строка формата содержит обычный текст и два правила форматирования. Первое правило используется для форматирования строкового аргумента. Второе правило добавляет символ новой строки в конец строки.
2.1. Правила формата
Давайте посмотрим на строку формата более внимательно. Он состоит из литералов и спецификаторов формата. Спецификаторы формата включают флаги, ширину, точность и символы преобразования в этой последовательности:
%[flags][width][.precision]conversion-character
Спецификаторы в скобках являются необязательными.
Внутри printf()
использует класс java.util.Formatter для разбора строки формата и создания вывода. Дополнительные параметры строки формата можно найти в Javadoc Formatter .
2.2. Преобразование символов
Символ преобразования
является обязательным и определяет формат аргумента.
Символы преобразования допустимы только для определенных типов данных. Вот некоторые из них:
s
форматирует строки.d
форматирует десятичные целые числа.f
форматирует числа с плавающей запятой.t
форматирует значения даты/времени.
Мы рассмотрим их и некоторые другие позже в этом руководстве.
2.3. Дополнительные модификаторы
[ Флаги `]` определяют стандартные способы изменения вывода и чаще всего используются для форматирования целых чисел и чисел с плавающей запятой.
[width]
указывает ширину поля для вывода аргумента. Он представляет собой минимальное количество символов, записываемых на выходе.
[.precision]
указывает количество разрядов точности при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки для извлечения из String
.
3. Разделитель строк
Чтобы разбить строку на отдельные строки, у нас есть спецификатор % n
:
System.out.printf("foreach%nline%nterminator");
Приведенный выше фрагмент кода выдаст следующий результат:
foreach
line
terminator
Разделитель %n
printf()
автоматически вставит родной разделитель строк хост-системы .
4. Логическое форматирование
Для форматирования логических значений мы используем формат %b
. Это работает следующим образом: если входное значение истинно
, то и выходное значение истинно
. В противном случае вывод будет ложным
.
Итак, если мы сделаем следующее:
System.out.printf("%b%n", null);
System.out.printf("%B%n", false);
System.out.printf("%B%n", 5.3);
System.out.printf("%b%n", "random text");
тогда мы увидим:
false
FALSE
TRUE
true
Обратите внимание, что мы можем использовать %B
для форматирования в верхнем регистре.
5. Форматирование строк
Чтобы отформатировать простую строку, мы будем использовать комбинацию %s .
Кроме того, мы можем сделать строку прописной:
printf("'%s' %n", "foreach");
printf("'%S' %n", "foreach");
И это вывод:
'foreach'
'FOREACH'
Кроме того, чтобы указать минимальную длину, мы можем указать ширину
:
printf("'%15s' %n", "foreach");
что дает нам:
' foreach'
Если нам нужно выровнять нашу строку по левому краю, мы можем использовать флаг –
:
printf("'%-10s' %n", "foreach");
Это результат:
'foreach '
Более того, мы можем ограничить количество символов в нашем выводе, указав точность
:
System.out.printf("%2.2s", "Hi there!");
Первое число x
в синтаксисе %x.ys
является дополнением. y
- количество символов.
Для нашего примера здесь вывод Hi
.
6. Форматирование символов
Результатом %c
является символ Unicode:
System.out.printf("%c%n", 's');
System.out.printf("%C%n", 's');
Заглавная буква C
будет заглавной в результате:
s
S
Но если мы дадим ему недопустимый аргумент, Formatter
выдаст исключение IllegalFormatConversionException
.
7. Форматирование чисел
7.1. Целочисленное форматирование
Метод printf()
принимает все целые числа, доступные в языке — byte
, short
, int
, long
и BigInteger
, если мы используем %d
:
System.out.printf("simple integer: %d%n", 10000L);
С помощью символа d
мы получим такой результат:
simple integer: 10000
Если нам нужно отформатировать наш номер с разделителем тысяч, мы можем использовать флаг
,
.
И мы также можем отформатировать наши результаты для разных локалей:
System.out.printf(Locale.US, "%,d %n", 10000);
System.out.printf(Locale.ITALY, "%,d %n", 10000);
Как мы видим, форматирование в США отличается от форматирования в Италии:
10,000
10.000
7.2. Плавающее и двойное форматирование
Чтобы отформатировать число с плавающей запятой, нам понадобится формат f
:
System.out.printf("%f%n", 5.1473);
который выведет:
5.147300
Конечно, первое, что приходит на ум, это контроль точности
:
System.out.printf("'%5.2f'%n", 5.1473);
Здесь мы определяем ширину
нашего числа как 5
, а длину десятичной части — 2:
' 5.15'
Здесь у нас есть один пробел от начала числа для поддержки предопределенной ширины.
Чтобы вывести результат в экспоненциальном представлении, мы просто используем символ преобразования e
:
System.out.printf("'%5.2e'%n", 5.1473);
И это наш результат:
'5.15e+00'
8. Форматирование даты и времени
Для форматирования даты и времени строка преобразования представляет собой последовательность из двух символов: символа t
или T
и суффикса преобразования.
Давайте рассмотрим наиболее распространенные символы суффикса форматирования времени и даты на примерах.
Определенно, для более сложного форматирования мы можем использовать DateTimeFormatter
, который доступен с Java 8.
8.1. Форматирование времени
Во-первых, давайте посмотрим список некоторых полезных символов суффикса для форматирования времени:
Символы H
,M
,S
отвечают за извлечение часов, минут и секунд из введеннойдаты
.L
,N
представляют время в миллисекундах и наносекундах соответственно.p
добавляет форматирование am/pm.z
выводит смещение часового пояса.
Теперь предположим, что мы хотим распечатать временную часть Date
:
Date date = new Date();
System.out.printf("%tT%n", date);
Приведенный выше код вместе с комбинацией %tT
дает следующий результат:
13:51:15
Если нам нужно более подробное форматирование, мы можем вызвать разные временные отрезки:
System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);
Используя H
, M
и S
, мы получаем такой результат:
hours 13: minutes 51: seconds 15
Тем не менее, перечисление даты
несколько раз — это боль.
В качестве альтернативы, чтобы избавиться от нескольких аргументов, мы можем использовать индексную ссылку нашего входного параметра, которая в нашем случае равна 1$
:
System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);
Здесь мы хотим получить в качестве вывода текущее время, am/pm, время в миллисекундах и наносекундах и смещение часового пояса:
13:51:15 pm 061 061000000 +0400
8.2. Форматирование даты
Как и при форматировании времени, у нас есть специальные символы форматирования для форматирования даты:
A
выводит полный день недели.d
форматирует двузначный день месяца.B
для полного названия месяца.m
форматирует двузначный месяц.Y
выводит год в виде четырех цифр.y
выводит две последние цифры года.
Предположим, мы хотим показать день недели, за которым следует месяц:
System.out.printf("%1$tA, %1$tB %1$tY %n", date);
Затем, используя A
, B
и Y
, мы получим этот вывод:
Thursday, November 2018
Чтобы все наши результаты были в числовом формате, мы можем заменить буквы A
, B
, Y на
d
, m
, y
:
System.out.printf("%1$td.%1$tm.%1$ty %n", date);
что приведет к:
22.11.18
9. Заключение
В этой статье мы обсудили, как использовать метод PrintStream#printf
для форматирования вывода. Мы рассмотрели различные шаблоны формата, используемые для управления выводом для распространенных типов данных.
Наконец, как всегда, код, использованный во время обсуждения, можно найти на GitHub .