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 .