Cela est en fait documenté sur MSDN sous Formatage composite:
La façon dont les accolades échappées sont interprétées peut mener à des résultats inattendus. Par exemple, considérez l'élément de format "{{{0:D}}}"
, qui est censé afficher une accolade ouvrante, une valeur numérique formatée comme un nombre décimal, puis une accolade fermante. Cependant, l'élément de format est en fait interprété de la manière suivante :
- Les deux premières accolades ouvrantes (
"{{"
) sont échappées et donnent une accolade ouvrante.
- Les trois caractères suivants (
"{0:"
) sont interprétés comme le début d'un élément de format.
- Le caractère suivant (
"D"
) serait interprété comme le spécificateur de format numérique standard Decimal, mais les deux accolades échappées suivantes ("}}"
) donnent une seule accolade. Comme la chaîne résultante ("D}"
) n'est pas un spécificateur de format numérique standard, la chaîne résultante est interprétée comme une chaîne de format personnalisée qui signifie afficher la chaîne littérale "D}"
.
- La dernière accolade (
"}"
) est interprétée comme la fin de l'élément de format.
- Le résultat final affiché est la chaîne littérale
"{D}"
. La valeur numérique à formater n'est pas affichée.
Une manière d'écrire votre code pour éviter d'interpréter de manière incorrecte les accolades échappées et les éléments de format est de formater les accolades et l'élément de format séparément. Autrement dit, dans la première opération de formatage, affichez une accolade ouvrante littérale, dans l'opération suivante affichez le résultat de l'élément de format, puis dans l'opération finale affichez une accolade fermante littérale. L'exemple suivant illustre cette approche.
int value = 6324;
string output = string.Format("{0}{1:D}{2}",
"{", value, "}");
Console.WriteLine(output);
// L'exemple affiche la sortie suivante :
// {6324}
(notez que j'ai ajouté le code uniquement parce qu'il est référencé dans l'article MSDN - non pas pour le suggérer comme une solution.)
Si vous ne vous souciez pas des différences de culture, vous pourriez utiliser "{{{0:$#,##0.00}}}"
en tant que chaîne de format.