Formattazione con printf () in Java

1. Introduzione

In questo tutorial, mostreremo diversi esempi di formattazione con il metodo printf () .

Il metodo fa parte della classe java.io.PrintStream e fornisce una formattazione String simile alla funzione printf () in C.

2. Sintassi

Possiamo utilizzare uno dei seguenti metodi PrintStream per formattare l'output:

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

Specifichiamo le regole di formattazione utilizzando il parametro format . Le regole iniziano con il carattere "%" .

Diamo un'occhiata a un rapido esempio prima di immergerci nei dettagli delle varie regole di formattazione:

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

Questo produce il seguente output:

Hello World!

Come mostrato sopra, la stringa di formato contiene testo normale e due regole di formattazione. La prima regola viene utilizzata per formattare l'argomento stringa. La seconda regola aggiunge un carattere di nuova riga alla fine della stringa.

2.1. Regole di formato

Diamo un'occhiata più da vicino alla stringa di formato. È costituito da valori letterali e specificatori di formato. Gli identificatori di formato includono flag, larghezza, precisione e caratteri di conversione nella sequenza seguente:

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

Gli specificatori tra parentesi sono facoltativi.

Internamente, printf () utilizza la classe java.util.Formatter per analizzare la stringa di formato e generare l'output. Ulteriori opzioni di stringa di formato possono essere trovate nel Formatter Javadoc.

2.2. Caratteri di conversione

Il carattere di conversione è obbligatorio e determina la modalità di formattazione dell'argomento . I caratteri di conversione sono validi solo per determinati tipi di dati. Alcuni comuni sono:

  • s - formatta le stringhe
  • d - formatta interi decimali
  • f - formatta i numeri in virgola mobile
  • t - formatta i valori di data / ora

Esploreremo questi e alcuni altri più avanti nell'articolo.

2.3. Modificatori opzionali

I [flag] definiscono modi standard per modificare l'output e sono più comuni per la formattazione di interi e numeri in virgola mobile.

La [larghezza] specifica la larghezza del campo per l'output dell'argomento. Rappresenta il numero minimo di caratteri scritti nell'output.

Il [.precision] specifica il numero di cifre di precisione durante l'output di valori a virgola mobile. Inoltre, possiamo usarlo per definire la lunghezza di una sottostringa da estrarre da una stringa .

3. Separatore di riga

Per rompere la stringa in linee separate, abbiamo un% n identificatore :

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

Lo snippet di codice sopra produrrà il seguente output:

baeldung line terminator

Il separatore % n printf () inserirà automaticamente il separatore di riga nativo del sistema host .

4. Formattazione booleana

To format boolean values, we use the %b format. It works the following way: If the input value is true, the output is true. Otherwise, the output is false.

So, if we do:

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

Then we'll see:

false FALSE TRUE true 

Notice that we can use %B for uppercase formatting.

5. String Formatting

To format a simple string, we'll use the %s combination. Additionally, we can make the string uppercase:

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

And the output is:

'baeldung' 'BAELDUNG'

Also, to specify a minimum length, we can specify a width:

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

Which gives us:

' baeldung'

If we need to left-justify our string, then we can use the ‘-‘ flag:

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

And the output is:

'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

In questo articolo, abbiamo discusso come utilizzare il metodo PrintStream # printf per formattare l'output. Abbiamo esaminato i diversi modelli di formato utilizzati per controllare l'output per i tipi di dati comuni.

Infine, come sempre, il codice utilizzato durante la discussione può essere trovato su GitHub.