Comment échapper des accolades (accolades) dans une chaîne de format dans .NET

Comment les parenthèses peuvent-elles être échappées en utilisant ssortingng.Format . Par exemple:

 Ssortingng val = "1,2,3" Ssortingng.Format(" foo {{0}}", val); 

Cet exemple ne lance pas d’exception, mais affiche la chaîne foo {0}

Y a-t-il un moyen d’échapper aux crochets?

Pour que vous puissiez afficher foo {1, 2, 3} vous devez faire quelque chose comme:

 ssortingng t = "1, 2, 3"; ssortingng v = Ssortingng.Format(" foo {{{0}}}", t); 

Pour générer un { vous utilisez {{ et pour afficher un } vous utilisez }} .

Oui pour sortir { en ssortingng.Format vous devez y échapper comme ceci {{

Donc ça

 Ssortingng val = "1,2,3"; Ssortingng.Format(" foo {{{0}}}", val); 

va sortir "foo {1,2,3}" .

MAIS, vous devez connaître un bogue de conception dans C # qui, en suivant la logique ci-dessus, suppose que ce code ci-dessous sera imprimé {24.00}

 int i = 24; ssortingng str = Ssortingng.Format("{{{0:N}}}", i); //gives '{N}' instead of {24.00} 

Mais ceci imprime {N}. C’est parce que la façon dont C # parsing les séquences d’échappement et les caractères de formatage. Pour obtenir la valeur souhaitée dans le cas ci-dessus, vous devez l’utiliser à la place.

 Ssortingng.Format("{0}{1:N}{2}", "{", i, "}") //evaluates to {24.00} 

Articles de référence Ssortingng.Format FAQ sur la mise en forme des chaînes et des chaînes

Presque là! La séquence d’échappement d’une accolade est {{ ou }} donc pour votre exemple, vous utiliseriez:

 ssortingng t = "1, 2, 3"; ssortingng v = Ssortingng.Format(" foo {{{0}}}", t); 

Vous pouvez utiliser des crochets doubles et des doubles crochets pour afficher un seul crochet sur votre page.

Echapper aux accolades ET utiliser l’ interpolation de chaînes constitue un défi intéressant. Vous devez utiliser des crochets quadruples pour échapper à l’parsing syntaxique des ssortingng.format et à l’parsing syntaxique des ssortingng.format .

Brackets échappant: Interpolation de chaîne $ (“”) et Ssortingng.Format

 ssortingng localVar = "dynamic"; ssortingng templateSsortingng = $@"

{0}

this is my {localVar} template using a {{{{custom tag}}}}
"; ssortingng result = ssortingng.Format(templateSsortingng, "Ssortingng Interpolation"); // OUTPUT:

Ssortingng Interpolation

this is my dynamic template using a {custom tag}
 [TestMethod] public void BraceEscapingTest() { var result = Ssortingng.Format("Foo {{0}}", "1,2,3"); //"1,2,3" is not parsed Assert.AreEqual("Foo {0}", result); result = Ssortingng.Format("Foo {{{0}}}", "1,2,3"); Assert.AreEqual("Foo {1,2,3}", result); result = Ssortingng.Format("Foo {0} {{bar}}", "1,2,3"); Assert.AreEqual("Foo 1,2,3 {bar}", result); result = Ssortingng.Format("{{{0:N}}}", 24); //24 is not parsed, see @Guru Kara answer Assert.AreEqual("{N}", result); result = Ssortingng.Format("{0}{1:N}{2}", "{", 24, "}"); Assert.AreEqual("{24.00}", result); result = Ssortingng.Format("{{{0}}}", 24.ToSsortingng("N")); Assert.AreEqual("{24.00}", result); } 

Entré ici pour chercher comment construire des chaînes json ad hoc (sans sérialiser une classe / object) en C #. En d’autres termes, comment échapper aux accolades et aux guillemets en utilisant des chaînes interpolées en C # et des ” littéraux de chaîne verbatim ” (chaînes entre guillemets avec le préfixe ‘@’), comme …

 var json = $@"{{""name"":""{name}""}}"; 

ou vous pouvez utiliser l’interpolation de type c # comme ceci (fonctionnalité disponible en C # 6.0)

 var value = "1, 2, 3"; var output = $" foo {{{value}}}"; 

Pour que vous puissiez afficher foo {1, 2, 3}, vous devez faire quelque chose comme:

  ssortingng t = "1, 2, 3"; ssortingng v = Ssortingng.Format(" foo {{{0}}}", t); 

Pour générer un {vous utilisez {{et pour afficher un} vous utilisez}}.

S’il vous plaît ne pas utiliser ssortingng.Format. Actuellement, il est plus facile de formater des chaînes de caractères.