Форматирование с помощью printf () в Java
1. Вступление
In this tutorial, we’ll demonstrate different examples of formatting with the printf()method.
Метод является частью классаjava.io.PrintStream и обеспечивает форматирование строки, аналогичное функцииprintf() в C.
2. Синтаксис
Мы можем использовать один из следующих методовPrintStream для форматирования вывода:
System.out.printf(format, arguments);
System.out.printf(locale, format, arguments);
Мы указываем правила форматирования с помощью параметраformat. Правила начинаются с символа‘%'.
Прежде чем углубляться в детали различных правил форматирования, давайте рассмотрим небольшой пример:
System.out.printf("Hello %s!%n", "World");
Это дает следующий вывод:
Hello World!
Как показано выше, строка формата содержит простой текст и два правила форматирования. Первое правило используется для форматирования строкового аргумента. Второе правило добавляет символ новой строки в конец строки.
2.1. Правила формата
Давайте посмотрим на строку формата более внимательно. Он состоит из литералов и спецификаторов формата. Format specifiers include flags, width, precision, and conversion characters в следующей последовательности:
%[flags][width][.precision]conversion-character
Спецификаторы в скобках не являются обязательными.
Внутреннеprintf() использует классjava.util.Formatter для анализа строки формата и генерации вывода. Дополнительные параметры строки формата можно найти вFormatter Javadoc.
2.2. Преобразование символов
The conversion-character is required and determines how the argument is formatted. Символы преобразования действительны только для определенных типов данных. Некоторые из них:
-
s – форматирует строки
-
d - форматирует десятичные целые числа
-
f - форматирует числа с плавающей запятой
-
t– форматирует значения даты / времени
Мы рассмотрим эти и некоторые другие позже в статье.
2.3. Дополнительные модификаторы
The [flags] define standard ways to modify the output и наиболее часто используются для форматирования целых чисел и чисел с плавающей запятой.
The [width] specifies the field width for outputting the argument. Представляет минимальное количество символов, записываемых на вывод.
The [.precision] specifies the number of digits of precision при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки, извлекаемой изString.
3. Разделитель строк
To break the string into separate lines, we have a %n specifier:
System.out.printf("example%nline%nterminator");
Приведенный выше фрагмент кода даст следующий вывод:
example
line
terminator
The %n separator printf() will automatically insert the host system’s native line separator.
4. Логическое форматирование
To format boolean values, we use the %b format. Это работает следующим образом: если входное значениеtrue, выходное -true. В противном случае на выходе будетfalse.
Итак, если мы сделаем:
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. Форматирование строк
To format a simple string, we’ll use the %s combination. Дополнительно мы можем сделать строку заглавной:
printf("'%s' %n", "example");
printf("'%S' %n", "example");
И вывод:
'example'
'example'
Также, чтобы указать минимальную длину, мы можем указатьwidth:
printf("'%15s' %n", "example");
Что дает нам:
' example'
Если нам нужно выровнять нашу строку по левому краю, мы можем использовать ‘-‘ flag:
printf("'%-10s' %n", "example");
И вывод:
'example '
Более того, мы можем ограничить количество символов в нашем выводе, указавprecision:
System.out.printf("%2.2s", "Hi there!");
Первое число‘x' в синтаксисе%x.ys - это заполнение. ‘y' - количество символов.
В нашем примере этоHi.
6. Форматирование диаграммы
Результатом%c является символ Юникода:
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
В случае, если нам нуженto format our number with the thousands separator, we can use the ‘,' flag. И мы также можем отформатировать наши результаты для разных языков:
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
Конечно, первое, что приходит в голову, - это управлятьprecision:
System.out.printf("'%5.2f'%n", 5.1473);
Здесь мы определяемwidth нашего числа как5, а длина десятичной части равна2:
' 5.15'
Здесь у нас есть один пробел от начала числа для поддержки заданной ширины.
Чтобы получить наш выводin scientific notation, we just use the ‘e' conversion character:
System.out.printf("'%5.2e'%n", 5.1473);
И результат следующий:
'5.15e+00'
8. Форматирование даты и времени
Для форматирования даты и времениthe conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Давайте рассмотрим на примерах наиболее распространенные символы суффиксов форматирования даты и времени.
Определенно, для более продвинутого форматирования мы можем использоватьDateTimeFormatter, доступный начиная с Java 8.
8.1. Форматирование времени
Во-первых, давайте посмотрим на список некоторых полезных символов суффикса для форматирования времени:
-
‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second со входаDate
-
‘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
Хотя перечислятьdate несколько раз - это боль. В качестве альтернативыto get rid of multiple arguments, we can use the index reference of our input parameter which is 1$ in our case:
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 для форматирования вывода. Мы рассмотрели различные шаблоны формата, используемые для управления выводом для общих типов данных.
Наконец, как всегда, код, использованный во время обсуждения, можно найтиover on GitHub.