ICS3U

Accueil > Programmer avec Java > Les bases de Java >

Afficher des messages à la console - partie 2

Survol et attentes

Parfois on a besoin de plus de contrôle sur le format de messages ou simplement une façon plus efficace d’afficher plusieurs informations à la console. Cette leçon vous montre comment utiliser la méthode printf pour afficher des messages formatés en Java.

Définitions
printf()
méthode de l’objet System.out qui affiche un message formaté. Il prend un nombre variable d’arguments : le premier est le message formaté, les autres sont les valeurs à insérer dans le message :
1
  System.out.printf("message avec drapeaux pour les valeurs", valeur1, valeur2, ...);
drapeaux de formatage
caractères spéciaux dans un message formaté qui gardent une place pour une valeur de type spécifique. Par exemple, %s pour une valeur de type String, %d pour une valeur de type int et %f pour une valeur de type double.
concaténation
coller du texte ensemble. En Java, l’opérateur + agit comme opérateur de concaténation si au moins un des opérandes est un String. L’autre opérande sera converti automatiquement en String pour l’opération. La concaténation se propage de gauche à droite, alors l’expression "a" + 1 + 2 donne "a12"; pour obtenir "a3", il faut utiliser des parenthèses autour de l’addition : "a" + (1 + 2).

Objectifs d’apprentissage

À la fin de cette leçon vous devrez être en mesure de :

Critères de succès

Messages formatés : printf

Vous pouvez utiliser la méthode printf() pour afficher des messages formatés. C’est utile quand vous :

  • essayez de coller plusieurs valeurs ensemble dans une phrase.
  • voulez contrôler le nombre de chiffres après la virgule pour un nombre décimal.
  • voulez afficher des valeurs en colonnes de largeur fixe.

Vous verrez que pour la plupart des situations, vous pouvez utiliser des print, des println et de la concaténation pour afficher ces messages au lieu d’utiliser printf : dans ces cas, c’est une préférence personnelle. Par contre, pour l’affichage uniforme des valeurs décimales ou pour l’alignement du texte, printf est la seule solution raisonnable.

Exemple - Coller des valeurs dans une phrase

Reproduire cet exemple dans un fichier nommé PrintGlue.java et tester la sortie.

Rappel : c’est toujours mieux de taper les exemples vous-même (et découvrir ce que vos outils vous aident à compléter, où se trouvent les symboles sur le clavier, etc.) que de copier-coller l’exemple. Vous gagnerez plus de confiance avec votre capacité à produire du code. C’est la différence entre CRÉER (taper) et UTILISER (copier-coller) du code, même si le code final est le même.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main() {
    String name = "Malcolm";
    int age = 16;

    // AVEC PLUSIEURS PRINT ET PRINTLN (sans concaténation des valeurs)
    System.out.print("Mon nom est ");
    System.out.print(name);
    System.out.print(" et j'ai ");
    System.out.print(age);
    System.out.println(" ans.");

    // AVEC PRINTLN (et concaténation des valeurs)
    System.out.println("Mon nom est " + name + " et j'ai " + age + " ans.");

    // AVEC PRINTF
    System.out.printf("Mon nom est %s et j'ai %d ans.\n", name, age);
}

et la sortie identique pour les trois approches :

1
2
3
Mon nom est Malcolm et j'ai 16 ans.
Mon nom est Malcolm et j'ai 16 ans.
Mon nom est Malcolm et j'ai 16 ans.

Structure de la méthode printf

La méthode printf accepte un nombre variable d’arguments. Le premier argument est toujours le String qui définit le format du message à afficher, incluant le texte de base et des drapeaux de formatage pour les valeurs à insérer dans le message. Les prochains arguments sont les valeurs à insérer dans le message, remplaçant chaque drapeau.

1
System.out.printf("message avec drapeaux pour les valeurs", valeur1, valeur2, ...);

Dans dans l’exemple System.out.printf("Mon nom est %s et j'ai %d ans.\n", name, age); :

  • Le String de formatage est "Mon nom est %s et j'ai %d ans.\n".
    • il y a deux drapeaux de formatage : %s pour une valeur de type String et %d pour une valeur de type int.
    • Il y a aussi le caractère d’échappement pour le retour de ligne, \n, parce que printf ne l’inclut pas; c’est comme print.
  • Le prochain argument est name (de type String qui s’évalue à “Malcolm”). Sa valeur remplacera le %s, le premier drapeau de formatage.
  • Le dernier argument est age (de type int qui s’évalue à 16). Sa valeur remplacera le %d, soit le dernier drapeau de formatage.

Voici un tableau de quelques drapeaux de formatage communs :

Drapeau Type de valeur Exemple
%s String "Bonjour %s"
%S String en majuscules "Bonjour %S"
%d int en décimal "La valeur du rouge est %d"
%x int en hexadécimal "La valeur du rouge est #%x"
%f double "Le prix est de %f"

Exemple - Contrôler le nombre de chiffres après la virgule pour un nombre décimal

Voici quelques exemples que vous pouvez tester dans une session jshell. Lancez la commande jshell dans un terminal pour ouvrir une session jshell. Quittez la sesssion avec la commande \exit.

1
2
3
double PI = 3.141592653589793; // constante pour la valeur de pi
System.out.printf("La valeur de pi est %f.\n", PI);
System.out.printf("La valeur de pi est %.2f.\n", PI);

sortie :

1
2
La valeur de pi est 3.141593.
La valeur de pi est 3.14.

Comme le premier exemple, le premier argument est le String qui définit le format du message. Dans ce cas on utilise le drapeau %f pour une valeur de type double. La valeur à insérer est 3.141592653589793. Par défaut, printf affiche 6 chiffres après la virgule pour les nombres décimaux. Pour contrôler le nombre de chiffres après la virgule, on peut ajouter un point et un nombre entre le % et le f.

Dans le deuxième exemple, on a ajouté .2 pour afficher seulement 2 chiffres après la virgule. Le .2 est un élément optionnel dans le drapeau de formatage pour les valeurs décimales. On peut remplacer 2 par n’importe quel nombre pour afficher ce nombre de chiffres après la virgule.

Voici un tableau présentant quelques options pour le formatage des valeurs décimales :

Drapeau Exemple Sortie
%f "La valeur de pi est %f" 3.141593
%.2f "La valeur de pi est %.2f" 3.14
%.0f "La valeur de pi est %.0f" 3

Exemple - Afficher des colonnes de valeurs alignées

1
2
3
4
// Afficher des valeurs en colonnes de largeur fixe
System.out.printf("%-10s %10s\n", "NOM", "ÂGE"); // en-têtes
System.out.printf("%-10s %10d\n", "Malcolm", 16);
System.out.printf("%-10s %10d\n", "Myriam", 17);

sortie :

1
2
3
NOM               ÂGE
Malcolm            16
Myriam             17

Ici on a plusieurs instructions printf, une pour chaque ligne d’un tableau. La première instruction donne les en-têtes, donc les drapeaux de formatage dans le premier argument sont %s pour une valeur de type String. Pour spécifier la largeur de colonne, on peut ajouter des éléments optionnels entre % et le s. Dans ce cas :

  • on a ajouté -10 pour spécifier une largeur de 10 caractères et un alignement à gauche.
  • on a ajouté 10 pour spécifier une largeur de 10 caractères avec l’alignement par défaut (à droite).
  • comme avec les valeurs décimales, on peut remplacer 10 par n’importe quel nombre pour spécifier la largeur de colonne voulue.
  • Notez que les valeurs substituées seront tronquées (coupées) si elles sont plus longues que la largeur de colonne spécifiée. Soit, le format spécifié est respecté même s’il faut couper le texte pour le faire.

Les arguments suivants sont les valeurs à insérer dans le message, dans l’ordre où ils apparaissent dans le message. Donc "NOM" est inséré à la place de %-10s et "ÂGE" est inséré à la place de %10s.

Pour les lignes suivantes, les valeurs pour “Âge” sont de type int, alors on utilise le drapeau %d au lieu de %s, mais on maintient les mêmes spécifications pour la largeur et l’alignement, donc %10d au lieu de %10s. Les valeurs à insérer sont 16 pour la première ligne et 17 pour la deuxième.

Voici un tableau présentant quelques options pour le formatage des colonnes :

Drapeau Exemple Effet
%-10s "Le nom est %-10s" colonne de 10 char de large, aligné à gauche
%10d "L'âge est %10d" colonne de 10 char de large, aligné à droite
%-10.2f "Le prix est %-10.2f" colonne de 10 char de large, aligné à gauche avec 2 places après la virgule

Exercices

📚 Tester la compréhension

Quiz quiz de vérification sur printf

🛠️ Pratique

Travaillez dans le répertoire GitHub partagé par votre enseignant pour la pratique et les exercices

  1. Créez le fichier Print2.java et y ajouter la structure de base (méthode main).
  2. Dans la méthode main, reproduire les trois instructions printf ci-dessus pour produire un tableau formaté pour les noms et les âges.
  3. Changez la largeur de colonne pour les noms à 5 caractères.
    • Lancez le programme et notez ce qui se passe à la sortie.
    • Écrire un commentaire de bloc pour consigner vos observations.
  4. Changez la colonne “ÂGE” à une colonne “MOYENNE”.
    • Ajouter des valeurs décimales raisonnables pour les moyennes de Malcolm et de Myriam et ajuster les drapeaux de formatage de façon appropriée.
    • Lancez le programme et vérifiez qu’il fonctionne.
    • Ajustez le drapeau de formatage pour les valeurs décimales pour afficher seulement 1 chiffre après la virgule. Lancez le programme de nouveau pour vérifier que ça fonctionne.
  5. Prenez une capture d’écran du terminal incluant les commandes pour lancer le programme et la sortie complète. Nommez la capture “4-1-5-print.png” et ajoutez-la au dossier “captures” de votre projet.