Formatage avec printf () en Java

1. Introduction

Dans ce didacticiel, nous présenterons différents exemples de mise en forme avec la méthode printf () .

La méthode fait partie de la classe java.io.PrintStream et fournit un formatage String similaire à la fonction printf () en C.

2. Syntaxe

Nous pouvons utiliser l'une des méthodes PrintStream suivantes pour formater la sortie:

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

Nous spécifions les règles de mise en forme à l'aide du paramètre format . Les règles commencent par le caractère «%» .

Regardons un exemple rapide avant de plonger dans les détails des différentes règles de formatage:

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

Cela produit la sortie suivante:

Hello World!

Comme indiqué ci-dessus, la chaîne de format contient du texte brut et deux règles de formatage. La première règle est utilisée pour formater l'argument de chaîne. La deuxième règle ajoute un caractère de nouvelle ligne à la fin de la chaîne.

2.1. Règles de format

Examinons de plus près la chaîne de format. Il se compose de littéraux et de spécificateurs de format. Les spécificateurs de format incluent les indicateurs, la largeur, la précision et les caractères de conversion dans l'ordre suivant:

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

Les spécificateurs entre parenthèses sont facultatifs.

En interne, printf () utilise la classe java.util.Formatter pour analyser la chaîne de format et générer la sortie. Des options de chaîne de format supplémentaires peuvent être trouvées dans le Javadoc du formateur.

2.2. Caractères de conversion

Le caractère de conversion est requis et détermine la manière dont l'argument est formaté . Les caractères de conversion ne sont valides que pour certains types de données. Certains des plus courants sont:

  • s - formate les chaînes
  • d - formate les entiers décimaux
  • f - formate les nombres à virgule flottante
  • t - met en forme les valeurs de date / heure

Nous les explorerons et quelques autres plus tard dans l'article.

2.3. Modificateurs facultatifs

Les [indicateurs] définissent des méthodes standard pour modifier la sortie et sont les plus courants pour le formatage des entiers et des nombres à virgule flottante.

La [largeur] spécifie la largeur du champ pour la sortie de l'argument. Il représente le nombre minimum de caractères écrits dans la sortie.

[.Precision] spécifie le nombre de chiffres de précision lors de la sortie de valeurs à virgule flottante. De plus, nous pouvons l'utiliser pour définir la longueur d'une sous-chaîne à extraire d'une chaîne .

3. Séparateur de ligne

Pour diviser la chaîne en lignes séparées, nous avons un spécificateur % n :

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

L'extrait de code ci-dessus produira la sortie suivante:

baeldung line terminator

Le séparateur % n printf () insérera automatiquement le séparateur de ligne natif du système hôte .

4. Formatage booléen

Pour formater les valeurs booléennes, nous utilisons le format % b . Cela fonctionne de la manière suivante: Si la valeur d'entrée est vraie , la sortie est vraie . Sinon, la sortie est fausse .

Donc, si nous faisons:

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

Ensuite, nous verrons:

false FALSE TRUE true 

Notez que nous pouvons utiliser % B pour le formatage des majuscules.

5. Formatage des chaînes

Pour formater une chaîne simple, nous utiliserons la combinaison % s . De plus, nous pouvons mettre la chaîne en majuscule:

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

Et le résultat est:

'baeldung' 'BAELDUNG'

Aussi, pour spécifier une longueur minimale, nous pouvons spécifier une largeur :

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

Ce qui nous donne:

' baeldung'

Si nous devons justifier à gauche notre chaîne, nous pouvons utiliser le drapeau ' -' :

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

Et le résultat est:

'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

Dans cet article, nous avons expliqué comment utiliser la méthode PrintStream # printf pour formater la sortie. Nous avons examiné les différents modèles de format utilisés pour contrôler la sortie des types de données courants.

Enfin, comme toujours, le code utilisé lors de la discussion se trouve à l'adresse over sur GitHub.