Форматування за допомогою printf () на Java

1. Вступ

У цьому посібнику ми продемонструємо різні приклади форматування за допомогою методу printf () .

Метод є частиною класу 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. Правила форматування

Давайте детальніше розглянемо рядок форматування. Він складається з літералів та специфікаторів формату. Специфікатори формату включають прапори, ширину, точність та символи перетворення в такій послідовності:

%[flags][width][.precision]conversion-character

Вказівники в дужках необов’язкові.

Внутрішньо printf () використовує клас java.util.Formatter для синтаксичного аналізу рядка форматування та формування вихідних даних. Додаткові параметри рядка формату можна знайти в форматі Javadoc.

2.2. Символи перетворення

Символ перетворення необхідний і визначає спосіб форматування аргументу . Символи перетворення дійсні лише для певних типів даних. Деякі загальні:

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

Ми розглянемо ці та декілька інших пізніше у статті.

2.3. Необов’язкові модифікатори

В [прапори] визначають стандартні способи для зміни вихідного сигналу і є найбільш поширеними для форматування чисел і чисел з плаваючою точкою.

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

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

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.