Formatage avec printf () en Java

Formater avec printf () en Java

1. introduction

In this tutorial, we’ll demonstrate different examples of formatting with the printf()method.

La méthode fait partie de la classejava.io.PrintStream et fournit un formatage de chaîne similaire à la fonctionprintf() en C.

2. Syntaxe

Nous pouvons utiliser l'une des méthodesPrintStreamuivantes pour formater la sortie:

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

Nous spécifions les règles de formatage à l'aide du paramètreformat. Les règles commencent par le caractère‘%'.

Prenons un exemple rapide avant de plonger dans les détails des différentes règles de mise en forme:

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

Cela produit la sortie suivante:

Hello World!

Comme indiqué ci-dessus, la chaîne de formatage 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. Format specifiers include flags, width, precision, and conversion characters dans l'ordre suivant:

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

Les spécificateurs entre parenthèses sont facultatifs.

En interne,printf() utilise la classejava.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 lesFormatter Javadoc.

2.2. Caractères de conversion

The conversion-character is required and determines how the argument is formatted. Les caractères de conversion ne sont valables que pour certains types de données. Quelques communes sont:

  • – formate les chaînes

  • d - formate les entiers décimaux

  • f - formate les nombres à virgule flottante

  • t– formate les valeurs de date / heure

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

2.3. Modificateurs facultatifs

The [flags] define standard ways to modify the output et sont les plus courants pour le formatage des entiers et des nombres à virgule flottante.

The [width] specifies the field width for outputting the argument. Il représente le nombre minimum de caractères écrits dans la sortie.

The [.precision] specifies the number of digits of precision 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'unString.

3. Séparateur de ligne

To break the string into separate lines, we have a %n specifier:

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

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

example
line
terminator

The %n separator printf() will automatically insert the host system’s native line separator.

4. Formatage booléen

To format boolean values, we use the %b format. Cela fonctionne de la manière suivante: Si la valeur d'entrée esttrue, la sortie esttrue. Sinon, la sortie estfalse.

Donc, si nous le 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 de chaîne

To format a simple string, we’ll use the %s combination. De plus, nous pouvons rendre la chaîne en majuscule:

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

Et le résultat est:

'example'
'example'

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

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

Ce qui nous donne:

'       example'

Si nous avons besoin de justifier à gauche notre chaîne, nous pouvons utiliser les '-‘ flag:

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

Et le résultat est:

'example  '

Encore plus, nous pouvons limiter le nombre de caractères dans notre sortie en spécifiant unprecision:

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

Le premier nombre‘x' dans la syntaxe%x.ys est le remplissage. ‘y' est le nombre de caractères.

Pour notre exemple ici, la sortie estHi.

6. Formatage des caractères

Le résultat de%c est un caractère Unicode:

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

La lettre majusculeC mettra en majuscule le résultat:

s
S

Mais, si nous lui donnons un argument invalide, alorsFormatter lanceraIllegalFormatConversionException.

7. Formatage des nombres

7.1. Formatage entier

La méthodeprintf() accepte tous les entiers disponibles dans la langue; byte, short, int, long etBigInteger  si nous utilisons%d:

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

À l'aide du caractère‘d', nous aurons:

simple integer: 10000

Au cas où nous aurions besoin deto format our number with the thousands separator, we can use the ‘,' flag. Et nous pouvons également formater nos résultats pour différents paramètres régionaux:

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

Comme on le voit, le formatage aux États-Unis est différent de celui en Italie:

10,000
10.000

7.2. Formatage flottant et double

Pour mettre en forme un nombre flottant, nous aurons besoin du format «f»:

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

Quel sera le résultat:

5.147300

Bien sûr, la première chose qui vient à l'esprit est de contrôler lesprecision:

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

Ici, nous définissons leswidth de notre nombre comme5, et la longueur de la partie décimale est2:

' 5.15'

Nous avons ici un espace de remplissage à partir du début du nombre pour prendre en charge la largeur prédéfinie.

Pour avoir notre sortiein scientific notation, we just use the ‘e' conversion character:

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

Et le résultat est le suivant:

'5.15e+00'

8. Formatage de la date et de l'heure

Pour le formatage de la date et de l'heure,the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Explorons les caractères de suffixe de mise en forme de l'heure et de la date les plus courants avec les exemples.

Décidément, pour un formatage plus avancé, nous pouvons utiliserDateTimeFormatter qui est disponible depuis Java 8.

8.1. Formatage de l'heure

Tout d'abord, voyons la liste de quelques caractères de suffixe utiles pour la mise en forme de l'heure:

  • ‘H', ‘M', ‘S'  – characters are responsible for extracting the hours, minutes and second de l'entréeDate

  • ‘L', ‘N' - pour représenter le temps en millisecondes et nanosecondes en conséquence

  • ‘p' - ajoute le formatage am / pm

  • ‘z' - imprime le décalage du fuseau horaire

Maintenant, disons que nous voulions imprimer la partie temporelle d'unDate:

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

Le code ci-dessus avec la combinaison‘%tT' produit la sortie suivante:

13:51:15

Au cas où nous aurions besoin d’un formatage plus détaillé, nous pouvons faire appel à différents segments de temps:

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

Après avoir utilisé‘H',‘M' et‘S', nous obtenons:

hours 13: minutes 51: seconds 15

Cependant, listerdate plusieurs fois est une douleur. Alternativement,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);

Ici nous voulons comme sortie l'heure actuelle, am / pm, heure en millisecondes, nanosecondes et le décalage horaire:

13:51:15 pm 061 061000000 +0400

8.2. Formatage de la date

Comme le formatage dans le temps, nous avons des caractères spéciaux pour le formatage de la date:

  • ‘A' - imprime le jour entier de la semaine

  • ‘d' - formate un jour à deux chiffres du mois

  • ‘B' - correspond au nom complet du mois

  • ‘m' - formate un mois à deux chiffres

  • ‘Y' - affiche une année sur quatre chiffres

  • ‘y' - affiche les deux derniers chiffres de l'année

Donc, si nous voulions afficher le jour de la semaine, suivi du mois:

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

Ensuite, en utilisant‘A',‘B' et‘Y', nous obtiendrons:

Thursday, November 2018

Pour avoir tous nos résultats au format numérique, nous pouvons remplacer les lettres «A', ‘B', ‘Y» par «d', ‘m', ‘y':

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

Ce qui entraînera:

22.11.18

9. Sommaire

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

Enfin, comme toujours, le code utilisé lors de la discussion se trouveover on GitHub.