Перейти к основному содержимому

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

· 7 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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 .