Pour l’instant, lorsque nous avons eu besoin de mettre en forme des chaines de caractères, nous avons utilisé la méthode
Console.WriteLine avec en paramètres des chaines concaténées entre elles grâce à l’opérateur +. Par exemple :
Code : C# | int age = 30;
Console.WriteLine("J'ai " + age + " ans");
|
Il est important de savoir qu’il est possible de formater la chaine un peu plus simplement et surtout beaucoup plus efficacement. Ceci est possible grâce à la méthode
string.Format. Le code précédent peut par exemple être remplacé par :
Code : C# | int age = 30;
string chaine = string.Format("J'ai {0} ans", age);
Console.WriteLine(chaine);
|
La méthode
string.Format accepte en premier paramètre un format de chaine. Ici, nous lui indiquons une chaine de caractères avec au milieu un caractère spécial : {0}. Il permet de dire : « remplace-moi le {0} avec le premier paramètre qui va suivre », en l’occurrence ici la variable
age. Si nous avons plusieurs valeurs, il est possible d’utiliser les caractères spéciaux {1}, puis {2}, etc … chaque nombre représentant l’indice correspondant au paramètre. Par exemple :
Code : C# | double valeur1 = 10.5;
double valeur2 = 4.2;
string chaine = string.Format("{0} multiplié par {1} s'écrit \"{0} * {1}\" et donne comme résultat : {2}", valeur1, valeur2, valeur1 * valeur2);
Console.WriteLine(chaine);
|
Ce qui donne :
Code : Console | 10,5 multiplié par 4,2 s'écrit "10,5 * 4,2" et donne comme résultat : 44,1 |
Vous avez pu remarquer qu’il est possible d’utiliser le même paramètre à plusieurs endroits.
La méthode
Console.WriteLine dispose aussi de la capacité de formater des chaines de caractères. Ce qui veut dire que le code précédent peut s’écrire :
Code : C# | double valeur1 = 10.5;
double valeur2 = 4.2;
Console.WriteLine("{0} multiplié par {1} s'écrit \"{0} * {1}\" et donne comme résultat : {2}", valeur1, valeur2, valeur1 * valeur2);
|
Ce qui revient absolument au même.
Parlons culture désormais. N’ayez pas peur, rien à voir avec des questions pour des champions, la culture en informatique correspond à tout ce qui a trait aux différences entre les langues et les paramètres locaux. Par exemple, en France nous n'écrivons pas les dates de la même façon qu’aux États-Unis. En France, nous écririons le jour de Noël 2011 de cette façon :
Citation : En FranceLe 25/12/2011
Alors qu’aux États-Unis, ils l’écriraient :
Citation : Aux États-UnisThe 12/25/2011
En inversant donc le mois et le jour.
De la même façon, il existe des différences lorsque nous écrivons les nombres à virgule. En France, nous écririons :
Citation : En France123,45
Alors qu’aux États-Unis, ils l’écriraient :
Citation : Aux États-Unis123.45
Un point à la place d’une virgule, subtile différence.
On a donc souvent des différences entre les langues. Et même plus, on peut avoir des différences entre les langues en fonction de l’endroit où elles sont parlées. Citons par exemple le français de France et le français du Canada.
Il existe donc au sein du système d’exploitation tout une liste de « régions » représentées par un couple de lettres. Par exemple, le français est représenté par les lettres fr. Et même plus précisément, le français de France est représenté par fr-FR alors que celui du Canada est représenté par fr-CA.
C’est ce que l’on retrouve dans les paramètres de notre système d’exploitation lorsqu’on va (sous Windows 7) dans le panneau de configuration, « Horloge langue et région » :
Puis « Modifier le format de la date, de l’heure ou des nombres ».
Nous pouvons adapter le format à celui que nous préférons :
Bref, ce choix, nous le retrouvons dans notre application si nous récupérons la culture courante :
Code : C# | Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture);
|
Avec ceci, nous aurons :
Code : Console
Ce qui est intéressant, c’est que le formatage des chiffres ou des dates change en fonction de la culture. Ainsi, si nous utilisons le français de France, pour le code suivant :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | public static void Main(string[] args)
{
Affiche();
}
public static void Affiche()
{
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture);
decimal dec = 5.5M;
double dou = 4.8;
DateTime date = new DateTime(2011, 12, 25);
Console.WriteLine("Décimal : {0}", dec);
Console.WriteLine("Double : {0}", dou);
Console.WriteLine("Date : {0}", date);
}
|
nous aurons :
Code : Console | fr-FR
Décimal : 5,5
Double : 4,8
Date : 25/12/2011 00:00:00 |
Il est possible de changer la culture courante de notre application, si par exemple nous souhaitons qu’elle soit multiculture, en utilisant le code suivant :
Code : C# | System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
|
Ici par exemple, j’indique à mon application que je souhaite travailler avec la culture des États-Unis. Ainsi, le code précédent, en changeant juste la culture :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | public static void Main(string[] args)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Affiche();
}
public static void Affiche()
{
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture);
decimal dec = 5.5M;
double dou = 4.8;
DateTime date = new DateTime(2011, 12, 25);
Console.WriteLine("Décimal : {0}", dec);
Console.WriteLine("Double : {0}", dou);
Console.WriteLine("Date : {0}", date);
}
|
produira un résultat légèrement différent :
Code : Console | en-US
Décimal : 5.5
Double : 4.8
Date : 12/25/2011 12:00:00 AM |
Il s’agit exactement de la même information, mais formatée différemment.
À noter qu’il existe encore une autre information de culture, à savoir la langue du système d’exploitation que l’on retrouve dans la culture de l’interface graphique, dans la propriété :
Code : C# | Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture);
|
Il s’agit ici de la
CurrentUICulture, à ne pas confondre avec la
CurrentCulture. Correspondant à la langue du système d’exploitation, nous nous en servirons plus volontiers pour rendre une application multi-langue.
Pour finir sur le formatage des chaines, il est possible d’utiliser des caractères spéciaux enrichis pour changer le formatage des types numériques ou de la date.
Par exemple, il est possible d’afficher la date sous une forme différente avec :
Code : C# | DateTime date = new DateTime(2011, 12, 25);
Console.WriteLine("La date est {0}", date.ToString("dd-MM-yyyy"));
|
Ici, dd sert à afficher le jour, MM le mois et yyyy l’année sur quatre chiffre, ce qui donne :
Code : Console
Il y a beaucoup d’options différentes que vous pouvez retrouver
dans la documentation.
Cela fonctionne dans le même genre pour les numériques, qui nous permettent par exemple d’afficher le nombre de différentes façons. Ici par exemple, j’utilise la notation scientifique :
Code : C# | double valeur = 123.45;
Console.WriteLine("Format scientifique : {0:e}", valeur);
|
Ce qui donne :
Code : Console | Format scientifique : 1,234500e+002 |
Pour les nombres, il existe différents formatages que l’on peut retrouver dans le tableau ci-dessous :
| Format |
Description |
Remarque |
| {0:c} |
Monnaie |
Attention, la console affiche mal le caractère € |
| {0:d} |
Décimal |
Ne fonctionne qu’avec les types sans virgules |
| {0:e} |
Notation scientifique |
|
| {0:f} |
Virgule flottante |
|
| {0:g} |
Général |
Valeur par défaut |
| {0:n} |
Nombre avec formatage pour les milliers |
|
| {0:r} |
Aller-retour |
Permet de garantir que la valeur numérique convertie en chaine pourra être convertie à nouveau en valeur numérique identique |
| {0:x} |
Héxadécimal |
Ne fonctionne qu’avec les types sans virgules |
À noter que l’on peut également avoir du formatage grâce à la méthode
ToString(). Il suffit de passer le format en paramètres, comme ici où cela me permet d’afficher uniquement le nombre de chiffres après la virgule qui m’intéressent ou des chiffres significatifs :
Code : C# | double valeur = 10.0 / 3;
Console.WriteLine("Avec 3 chiffres significatifs et 3 chiffres après la virgule : {0}", valeur.ToString("000.###"));
|
Qui donne :
Code : Console | Avec 3 chiffres significatifs et 3 chiffres après la virgule : 003,333 |
Mettre le format dans la méthode
ToString() fonctionne aussi pour la date :
Code : C# | DateTime date = new DateTime(2011, 12, 25);
Console.WriteLine(date.ToString("MMMM"));
|
Ici, je n’affiche que le nom du mois :
Code : Console
Voilà pour le formatage des chaines de caractères.
Lister tous les formatages possibles serait une tâche bien ennuyeuse. Vous aurez l’occasion de rencontrer d’autres formatages qui permettent de faire un peu tout et n’importe quoi. Vous pourrez retrouver la plupart des formatages
à partir de ce lien.