Il existe deux mécanismes principaux pour formater des strings en C#/.NET : l'utilisation de String.Format() et l'interpolation de strings.
String.Format() prend une string (appelée format composite dans la documentation) composée de texte fixe et d'espaces réservés (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 résolues 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
Ce mécanisme est techniquement appelé formatage composite.
Les chaînes interpolées sont précédées d'un $ et contiennent des expressions évaluées à l'exécution, placées entre accolades. L'élément de format a la syntaxe suivante : $"{<interpolationExpression>}". Elles suppriment le besoin d'une liste d'arguments séparée. Le résultat est fonctionnellement équivalent au mécanisme String.Format().
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
Le texte entre accolades, c'est-à-dire les espaces réservés dans le cas du format composite et les expressions interpolées dans le cas de l'interpolation de strings, est appelé élément de format.
Un élément de format peut comporter jusqu'à 3 parties. La première est l'expression ou l'espace réservé d'argument obligatoire, comme dans l'exemple de code ci-dessus. Il y a en outre un alignement facultatif (introduit par une virgule, « , ») et une chaîne de format facultative (introduite par 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 spécifie la forme du texte produit : faut-il par exemple inclure des séparateurs de milliers pour un nombre, ou bien produire uniquement la partie date d'un objet DateTime ?
Le code suivant illustre l'affichage de la partie date d'un objet DateTime et d'un nombre à virgule flottante sous forme 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é, aussi bien pour les nombres que pour les dates. Il n'y a pas de différence essentielle entre les formats personnalisés et standard, si ce n'est qu'on peut composer des chaînes de format personnalisées à partir de lettres de format.
Chaque thread 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 en fonction des variations régionales, comme la différence de format de date habituel 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.
Les chaînes verbatim permettent d'écrire des strings sur plusieurs lignes. Elles sont introduites par un @.
string str = @"
See no wretched
quotes everywhere
";
Dans cet exercice, on va aider des amoureux de lycée à déclarer leur amour sur les réseaux sociaux.
Implémente la méthode statique HighSchoolSweethearts.DisplaySingleLine() qui prend deux noms et les affiche séparés par un cœur.
Le texte formaté doit faire 61 caractères de large, avec le cœur au centre de la string.
Tous les noms tiennent largement dans la largeur de la ligne.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
Implémente la méthode statique HighSchoolSweethearts.DisplayBanner() qui affiche les deux jeux d'initiales séparés par un signe plus.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
Implémente la méthode statique HighSchoolSweethearts.DisplayGermanExchangeStudents() pour afficher la date de début de la relation et sa durée pour nos correspondants allemands.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.