Форматирование с помощью printf () в Java

Форматирование с помощью 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. Символы преобразования действительны только для определенных типов данных. Некоторые из них:

  • – форматирует строки

  • 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.