Project

General

Profile

Formateur avancé de chaînes de caractères

La classe StringTemplate, définie dans le namespace Developpez.Dotnet.Text, permet de formater des valeurs dans une chaine de caractères de façon similaire à la méthode String.Format, mais en utilisant des noms plutôt que des numéros pour les placeholders (emplacements des valeurs à formater).

Prenons l'exemple suivant :

string name = "Joe";
DateTime dateOfBirth = new DateTime(1985, 01, 23);
string city = "New York";
...

string text = string.Format("{0} est né le {1:dd MMMM yyyy} et habite à {2}", name, dateOfBirth, city);

Ici, les emplacement des valeurs à placer dans la chaine sont marquées par des numéros, ce qui peut rapidement devenir laborieux s'il y a beaucoup de valeurs. Avec la classe StringTemplate, on peut écrire ceci :

var joe = new { name = "Joe", dateOfBirth = new DateTime(1985, 1, 23), city = "New York" };
string text = StringTemplate.Format("{name} est né le {dateOfBirth:dd MMMM yyyy} et habite à {city}", joe);

Notez qu'on peut spécifier le format de chaque placeholder de la même façon qu'avec String.Format.

Utiliser un type anonyme comme dans l'exemple ci-dessus est souvent pratique, mais on peut bien sûr utiliser une instance d'un type nommé :

class Person
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string DateOfBirth { get; set; }
    public string City { get; set; }
}

...

Person joe = new Person
{
    LastName = "Black",
    FirstName = "Joe",
    DateOfBirth = new DateTime(1985, 01, 23),
    City = "New York
}
string text = StringTemplate.Format("{FirstName} {LastName} est né le {DateOfBirth:dd MMMM yyyy} et habite à {City}", joe);

Enfin, on peut également passer en paramètre un dictionnaire qui contient les valeurs de chaque placeholder :

Dictionary<string, object> values = new Dictionary<string, object>();
values.Add("name", "Joe");
values.Add("dateOfBirth", new DateTime(1985, 1, 23);
values.Add("city", "New York");
string text = string.Format("{name} est né le {dateOfBirth:dd MMMM yyyy} ans et habite à {city}", values);

Les clés du dictionnaire doivent correspondre aux noms des placeholders.

Dans le cas ou on veut générer générer un grand nombre de chaines selon le même modèle, il peut être plus performant d'utiliser une instance de StringTemplate, de la façon suivante :

// Conversion implicite de String en StringTemplate
StringTemplate template = "{FirstName} {LastName} est né le {DateOfBirth:dd MMMM yyyy} et habite à {City}";

foreach(Person p in listOfPersons)
{
    Console.WriteLine(template.Format(p));
}