Parcours
/
C#
C#
/
Programme
/
Formatage de chaînes
Fo

Formatage de chaînes en C#

13 exercices

À propos de Formatage de chaînes

Les mécanismes de formatage des strings sont nombreux et variés en C#/.NET : depuis la simple concaténation d'objets, en passant par les appels à la méthode object.ToString() redéfinie, jusqu'à l'utilisation d'ICustomFormatter (qui n'est pas abordé dans cet exercice).

Les deux mécanismes de formatage de strings les plus courants sont l'interpolation de chaînes et String.Format(). La classe StringBuilder (cross-ref-tba) peut également servir à construire une string lorsqu'il y a de la complexité, par exemple sur plusieurs lignes.

Utilise ToString()

System.Object(), dont héritent toutes les classes et toutes les structures, possède une méthode ToString(). Par exemple, new DateTime(2019, 5, 23).ToString() affichera « 05/23/2019 00:00:00 » (sur un thread dont la culture est américaine, voir ci-dessous). Il existe des situations, comme la concaténation de strings, où cette méthode ToString() par défaut peut être appelée implicitement ; "" + new DateTime(2019, 5, 23) donne le même résultat.

En plus de la méthode ToString() par défaut, les types pour lesquels le formatage pose problème disposent de surcharges qui prennent une chaîne de format ou même un fournisseur de format. Dans la BCL (Base Class Library), il s'agit notamment des nombres, des dates, des énumérations et des GUID.

Formatage composite

String.Format() prend une string (appelée format composite dans la documentation), composée de texte fixe et d'emplacements (appelés éléments de format dans la documentation), ainsi qu'un nombre variable d'arguments. La valeur de retour résout chaque élément de format à l'aide de l'argument correspondant, puis combine les valeurs obtenues avec le texte fixe.

string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25))
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Format() peut être un meilleur choix que l'interpolation lorsque le format sert de sorte de gabarit dans plusieurs expressions, ou lorsque intégrer le format et les expressions à mettre en forme devient trop lourd, comme c'est le cas avec les [chaînes verbatim][verbatim-strings].

Ce mécanisme est techniquement appelé formatage composite.

Une liste plus complète des méthodes qui produisent des strings et qui tirent parti du formatage composite figure dans cet article.

Interpolation de chaînes

Les chaînes interpolées sont préfixées par un $ et contiennent des expressions évaluées à l'exécution, entourées d'accolades. L'élément de format a la syntaxe suivante : $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Elles suppriment la nécessité d'une liste d'arguments séparée. Le résultat est fonctionnellement équivalent à celui produit par le mécanisme String.Format().

L'expression peut désigner tout ce qui est dans la portée. L'alignement est la longueur du « champ » dans lequel le texte est placé. Si l'alignement est positif, le texte est complété par des espaces à gauche ; s'il est négatif, le remplissage se fait à droite du texte.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Éléments de format

Le texte entre accolades, qu'il s'agisse d'emplacements dans le cas du format composite ou d'expressions interpolées dans le cas de l'interpolation de chaînes, est appelé élément de format.

Un élément de format peut comporter jusqu'à 3 parties. La première est l'expression obligatoire, ou l'emplacement d'argument, comme dans l'exemple de code ci-dessus. S'y ajoutent un alignement facultatif (introduit par une virgule, « , ») et une chaîne de format facultative (introduite par un deux-points, « : »).

{<interpolationExpression>[,<alignment>][:<formatString>]}

L'alignement spécifie la longueur du « champ » dans lequel le texte est placé, complété par des espaces à gauche si l'alignement est positif, ou à droite s'il est négatif.

La chaîne de format définit la forme du texte produit : par exemple, si des séparateurs de milliers doivent être inclus pour un nombre, ou si seule la partie date d'un objet DateTime doit être affichée.

Le code suivant illustre l'affichage de la partie date d'un objet DateTime et d'un nombre à virgule flottante en notation exponentielle.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

string.Format(
    "I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
    loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

Il existe un formatage standard et un formatage personnalisé, pour les nombres comme pour les dates. Il n'y a pas de différence fondamentale entre personnalisé et standard, si ce n'est qu'on peut composer des chaînes de format personnalisées à partir de caractères de format. « custom » dans ce contexte n'a rien à voir avec l'interface ICustomFormatter, qui sert quand on développe ses propres formateurs personnalisés.

Les formateurs et les chaînes de format de la BCL

La Base Class Library (BCL) fournit 2 formateurs, DateTimeFormatInfo et NumberFormatInfo, ainsi que 6 groupes de chaînes de format.

Les différentes listes de chaînes de format sont les suivantes :

Les chaînes de format pour Enum et GUID peuvent être considérées comme standard. Bien que enum et GUID disposent de surcharges de ToString() qui prennent un IFormatProvider, on ne sait pas très bien si cela a le moindre effet.

La bibliothèque s'efforce d'apporter une certaine cohérence aux chaînes de format (au-delà du fait qu'il s'agit de strings). C'est dans les chaînes standard que se manifeste cette recherche de cohérence. En réalité, en tant que développeur, on se soucie rarement de la différence entre chaînes standard et personnalisées. Même s'il est judicieux, quand on implémente des formateurs pour ses propres classes, de reprendre les chaînes standard existantes lorsque ces classes semblent le demander, on peut très bien ignorer cette différence.

Culture

Chaque thread d'exécution possède une culture par défaut, Thread.CurrentThread.CurrentCulture, encapsulée dans une instance de CultureInfo. La culture du thread détermine la façon dont les dates et les nombres sont formatés par défaut, en fonction des variations régionales, comme la différence de format de date entre le DD/MM/YYYY britannique et le MM/DD/YYYY américain.

CultureInfo implémente l'interface IFormatProvider, que l'on peut passer à certaines surcharges de String.Format(). Cela permet de remplacer la culture du thread.

Références

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Formatage de chaînes

L'entraînement est verrouillé

Déverrouille 11 exercices de plus pour t'entraîner sur Formatage de chaînes