Formatarea cu printf () în Java

1. Introducere

În acest tutorial, vom demonstra diferite exemple de formatare cu printf () metoda .

Metoda face parte din clasa java.io.PrintStream și oferă formatarea șirului similar funcției printf () din C.

2. Sintaxă

Putem utiliza una dintre următoarele metode PrintStream pentru a formata ieșirea:

System.out.printf(format, arguments); System.out.printf(locale, format, arguments);

Specificăm regulile de formatare folosind parametrul format . Regulile încep cu caracterul „%” .

Să vedem un exemplu rapid înainte de a ne arunca cu capul în detaliile diferitelor reguli de formatare:

System.out.printf("Hello %s!%n", "World");

Aceasta produce următoarea ieșire:

Hello World!

După cum se arată mai sus, șirul de format conține text simplu și două reguli de formatare. Prima regulă este utilizată pentru a formata argumentul șir. A doua regulă adaugă un caracter de linie nouă la sfârșitul șirului.

2.1. Reguli de formatare

Să aruncăm o privire mai atentă asupra șirului de formate. Se compune din literali și specificatori de format. Specificatorii de format includ steaguri, lățime, precizie și caractere de conversie în următoarea succesiune:

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

Specificațiile din paranteze sunt opționale.

Pe plan intern, printf () folosește clasa java.util.Formatter pentru a analiza șirul de format și a genera ieșirea. Opțiuni suplimentare de șiruri de format pot fi găsite în Formatter Javadoc.

2.2. Caracterele de conversie

Caracterul de conversie este necesar și determină modul în care este formatat argumentul . Caracterele de conversie sunt valabile numai pentru anumite tipuri de date. Unele comune sunt:

  • s - formează șiruri
  • d - formatează numere întregi zecimale
  • f - formatează numerele cu virgulă mobilă
  • t - formată valorile datei / orei

Vom explora acestea și câteva altele mai târziu în articol.

2.3. Modificatori opționali

Cele [steaguri] definesc metode standard pentru a modifica modul de afișare și sunt cele mai comune pentru formatare și numere întregi plutitoare numere de puncte.

[Width] specifică lățimea câmpului pentru ieșirea argumentului. Reprezintă numărul minim de caractere scrise la ieșire.

[.Precizia] specifică numărul de cifre de precizie la ieșirea valorilor în virgulă mobilă. În plus, îl putem folosi pentru a defini lungimea unui șir de extras dintr-un șir .

3. Separator de linie

Pentru a sparge șirul în linii separate, avem un specificator % n :

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

Fragmentul de cod de mai sus va produce următoarea ieșire:

baeldung line terminator

% N separatorul printf () va insera automat linia de separare nativă a sistemului gazdă .

4. Formatare booleană

Pentru a formata valori booleene, folosim formatul % b . Funcționează în felul următor: Dacă valoarea de intrare este adevărată , ieșirea este adevărată . În caz contrar, ieșirea este falsă .

Deci, dacă facem:

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

Apoi vom vedea:

false FALSE TRUE true 

Observați că putem folosi % B pentru formatarea cu majuscule.

5. Formatarea șirurilor

Pentru a formata un șir simplu, vom folosi combinația % s . În plus, putem face șirul cu majuscule:

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

Iar rezultatul este:

'baeldung' 'BAELDUNG'

De asemenea, pentru a specifica o lungime minimă, putem specifica o lățime :

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

Ceea ce ne oferă:

' baeldung'

Dacă trebuie să ne justificăm stânga șirul, putem folosi steagul „-” :

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

Iar rezultatul este:

'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

În acest articol, am discutat despre modul de utilizare a metodei PrintStream # printf pentru formatarea ieșirii. Am analizat diferitele tipare de format utilizate pentru a controla ieșirea pentru tipurile de date obișnuite.

În cele din urmă, ca întotdeauna, codul utilizat în timpul discuției poate fi găsit pe GitHub.