Рубрики
Без рубрики

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

Узнайте, как форматировать выходные данные с помощью метода Java PrintStream.printf()

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы продемонстрируем различные примеры форматирования с помощью метода printf () |/.

Метод является частью класса java.io.PrintStream и обеспечивает строгое форматирование, аналогичное функции printf() в C.

Дальнейшее чтение:

Руководство по java.util.Форматирующее устройство

Руководство по DateTimeFormatter

Заполните строку нулями или пробелами в Java

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.Форматер класс для анализа строки формата и создания выходных данных. Дополнительные параметры строки формата можно найти в файле Форматирования Javadoc .

2.2. Символы Преобразования

То преобразование-символ требуется и определяет, как форматируется аргумент.

Символы преобразования допустимы только для определенных типов данных. Вот некоторые из наиболее распространенных:

  • s форматирует строки.
  • d форматирует десятичные целые числа.
  • f форматирует числа с плавающей запятой.
  • t форматирует значения даты/времени.

Мы рассмотрим их и несколько других позже в этом уроке.

2.3. Дополнительные Модификаторы

[Флаги] определяют стандартные способы изменения выходных данных и наиболее распространены для форматирования целых чисел и чисел с плавающей запятой.

[Ширина] задает ширину поля для вывода аргумента. Он представляет минимальное количество символов, записанных в вывод.

[.точность] указывает количество цифр точности при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки для извлечения из Строки .

3. Разделитель Строк

Чтобы разбить строку на отдельные строки, у нас есть спецификатор % new :

System.out.printf("baeldung%nline%nterminator");

Приведенный выше фрагмент кода приведет к следующему результату:

baeldung
line
terminator

То %n разделитель printf() автоматически вставит собственный разделитель строк хост-системы.

4. Логическое Форматирование

Для форматирования логических значений мы используем формат %b . Это работает следующим образом: если входное значение 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. Форматирование Строк

Чтобы отформатировать простую строку, мы будем использовать комбинацию %s . Кроме того, мы можем сделать строку в верхнем регистре:

printf("'%s' %n", "baeldung");
printf("'%S' %n", "baeldung");

И это результат:

'baeldung' 
'BAELDUNG'

Кроме того, чтобы указать минимальную длину, мы можем указать ширину :

printf("'%15s' %n", "baeldung");

что дает нам:

'       baeldung'

Если нам нужно оправдать нашу строку слева, мы можем использовать – флаг :

printf("'%-10s' %n", "baeldung");

Это и есть результат:

'baeldung  '

Более того, мы можем ограничить количество символов в наших выходных данных, указав точность :

System.out.printf("%2.2s", "Hi there!");

Первое x число в %x.y s синтаксис-это заполнение. y – это количество символов.

Для нашего примера здесь выводится Привет .

6. Форматирование Символов

Результатом %c является символ Юникода:

System.out.printf("%c%n", 's');
System.out.printf("%C%n", 's');

Заглавная буква C будет прописной в результате:

s
S

Но если мы дадим ему недопустимый аргумент, то Форматер выдаст Исключение IllegalFormatConversionException .

7. Форматирование Чисел

7.1. Целочисленное Форматирование

Метод printf() принимает все целые числа, доступные в языке — байт , короткий , int , длинный и 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 добавляет форматирование утра/вечера.
  • z выводит смещение часового пояса.

Теперь предположим, что мы хотим распечатать временную часть Даты :

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);

Здесь мы хотим в качестве выходных данных текущее время, утра/вечера, время в миллисекундах и наносекундах, а также смещение часового пояса:

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 .