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

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

2.2. Преобразование символов

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

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

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

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

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

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

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

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

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

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

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

baeldung line terminator

% П Сепаратор Е () будет автоматически вставлять родной разделитель линии принимающей системы .

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", "baeldung"); printf("'%S' %n", "baeldung");

И вывод:

'baeldung' 'BAELDUNG'

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

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

Что дает нам:

' baeldung'

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

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

И вывод:

'baeldung '

Even more, we can limit the number of characters in our output by specifying a precision:

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

The first ‘x' number in %x.ys syntax is the padding. ‘y' is the number of chars.

For our example here, the output is Hi.

6. Char Formatting

The result of %c is a Unicode character:

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

The capital letter C will uppercase the result:

s S

But, if we give it an invalid argument, then Formatter will throw IllegalFormatConversionException.

7. Number Formatting

7.1. Integer Formatting

The printf() method accepts all the integers available in the language; byte, short, int, long and BigInteger if we use %d:

System.out.printf("simple integer: %d%n", 10000L);

With the help of the ‘d' character, we'll have:

simple integer: 10000

In case we need to format our number with the thousands separator, we can use the ‘,'flag. And we can also format our results for different locales:

System.out.printf(Locale.US, "%,d %n", 10000); System.out.printf(Locale.ITALY, "%,d %n", 10000);

As we see, the formatting in the US is different than in Italy:

10,000 10.000

7.2. Float and Double Formatting

To format a float number, we'll need the ‘f' format:

System.out.printf("%f%n", 5.1473);

Which will output:

5.147300

Of course, the first thing that comes to mind is to control the precision:

System.out.printf("'%5.2f'%n", 5.1473);

Here we define the width of our number as 5, and the length of the decimal part is 2:

' 5.15'

Here we have one space padding from the beginning of the number to support the predefined width.

To have our output in scientific notation, we just use the ‘e' conversion character:

System.out.printf("'%5.2e'%n", 5.1473);

And the result is the following:

'5.15e+00'

8. Date and Time Formatting

For date and time formatting, the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Let's explore the most common time and date formatting suffix characters with the examples.

Definitely, for more advanced formatting we can use DateTimeFormatter which has been available since Java 8.

8.1. Time Formatting

First, let's see the list of some useful suffix characters for Time Formatting:

  • ‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second from the input Date
  • ‘L', ‘N' – to represent the time in milliseconds and nanoseconds accordingly
  • ‘p' – adds am/pm formatting
  • ‘z' – prints out the timezone offset

Now, let's say we wanted to print out the time part of a Date:

Date date = new Date(); System.out.printf("%tT%n", date);

The code above along with ‘%tT' combination produces the following output:

13:51:15

In case we need more detailed formatting, we can call for different time segments:

System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);

Having used ‘H', ‘M', and ‘S' we get:

hours 13: minutes 51: seconds 15

Though, listing date multiple times is a pain. Alternatively, 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);

Here we want as an output the current time, am/pm, time in milliseconds, nanoseconds and the timezone offset:

13:51:15 pm 061 061000000 +0400

8.2. Date Formatting

Like time formatting, we have special formatting characters for date formatting:

  • ‘A' – prints out the full day of the week
  • ‘d' – formats a two-digit day of the month
  • ‘B' – is for the full month name
  • ‘m' – formats a two-digit month
  • ‘Y' – outputs a year in four digits
  • ‘y' – outputs the last two digits of the year

So, if we wanted to show the day of the week, followed by the month:

System.out.printf("%1$tA, %1$tB %1$tY %n", date);

Then using ‘A', ‘B', and ‘Y', we'd get:

Thursday, November 2018

To have our results all in numeric format, we can replace the ‘A', ‘B', ‘Y ‘ letters with ‘d', ‘m', ‘y':

System.out.printf("%1$td.%1$tm.%1$ty %n", date);

Which will result in:

22.11.18

9. Summary

В этой статье мы обсудили, как использовать метод PrintStream # printf для форматирования вывода. Мы рассмотрели различные шаблоны формата, используемые для управления выводом общих типов данных.

Наконец, как всегда, код, использованный во время обсуждения, можно найти на GitHub.