27 votes

Formatage de chaîne avec des accolades

Je veux afficher un nombre formaté entre parenthèses (exemple {$100.00}) en utilisant une instruction string.Format(fmt, x) avec x=100.

{ 
    var x = 100M;
    // fonctionne correctement sans spécificateur de format
    string.Format("{{{0}}}", x);    // "{100.00}"

    // échoue avec un spécificateur de format
    string.Format("{{{0:C}}}", x);  // "{C}"

    // fonctionne avec des espaces
    string.Format("{{ {0:C} }}", x);  // "{ $100.00 }"
}

Alors quel chaîne de format devrais-je utiliser ci-dessus pour obtenir {$100} sans utiliser une solution maladroite telle que string.Format("{0}{1:C}{2}", "{", x, "}");

32voto

D Stanley Points 54768

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 :

  1. Les deux premières accolades ouvrantes ("{{") sont échappées et donnent une accolade ouvrante.
  2. Les trois caractères suivants ("{0:") sont interprétés comme le début d'un élément de format.
  3. 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}".
  4. La dernière accolade ("}") est interprétée comme la fin de l'élément de format.
  5. 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.

14voto

Norfolc Points 306

Essayez d'utiliser ce code :

string.Format("{{{0}}}", x.ToString("C"))

4voto

Greg Bray Points 3352

En fonction de l'application, il est possible d'utiliser un espace insécable pour tromper la méthode string.Format afin d'obtenir ce que vous souhaitez. Consultez les espaces en Unicode pour une liste d'options, mais \x200B ajoutera un espace insécable à une chaîne C#, donc vous pourriez essayer :

string.Format("Pi est {{{0:N2}\x200B}} lorsqu'il est arrondi", Math.PI)

ce qui devrait donner Pi est {3.14​} lorsqu'il est arrondi lorsqu'il est affiché dans une application prenant en charge l'unicode. Si l'application ne prend pas en charge l'unicode, cela pourrait ressembler à Pi est {3.14​} lorsqu'il est arrondi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X