web-dev-qa-db-fra.com

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

Comment échapper les crochets en utilisant string.Format. Par exemple:

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

Cet exemple ne génère pas d'exception, mais génère la chaîne foo {0}

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

936
Pop Catalin

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

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

Pour sortir un {, vous utilisez {{ et pour sortir un }, vous utilisez }}.

1233
Jorge Ferreira

Oui pour sortir { dans string.Format vous devez l’échapper comme ceci {{

Donc ça

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

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

MAIS vous devez connaître un bogue de conception en C # qui signifie qu'en suivant la logique ci-dessus, vous supposeriez que le code ci-dessous sera imprimé {24.00}

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

Mais ceci affiche {N}. En effet, la façon dont C # analyse les séquences d'échappement et les caractères de formatage. Pour obtenir la valeur souhaitée dans le cas ci-dessus, vous devez utiliser ceci à la place.

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

Articles de référence String.Format gottach et FAQ sur le formatage des chaînes

203
Guru Kara

Presque là! La séquence d'échappement d'une accolade est {{ ou }} de sorte que vous utiliseriez pour votre exemple:

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
73
Wolfwyrd

Vous pouvez utiliser des crochets doubles ouverts et des crochets doubles de fermeture qui n’afficheront qu’un seul crochet sur votre page.

22
elec

Echapper accolades ET utiliser interpolation de chaîne constitue un défi intéressant. Vous devez utiliser des crochets quadruples pour éviter l'analyse interpolation de chaîne et string.format.

Supports d'échappement: String Interpolation $ ("") et String.Format

string localVar = "dynamic";
string templateString = $@"<h2>{0}</h2><div>this is my {localVar} template using a {{{{custom tag}}}}</div>";
string result = string.Format(templateString, "String Interpolation");

// OUTPUT: <h2>String Interpolation</h2><div>this is my dynamic template using a {custom tag}</div>
13
SliverNinja - MSFT

Entré ici à la recherche de la façon de construire des chaînes json ad-hoc (sans sérialiser une classe/objet) en C #. En d'autres termes, comment échapper les accolades et les guillemets en utilisant Chaînes interpolées en C # et " littéraux de chaîne textuels " (chaînes entre guillemets avec le préfixe '@'), comme .. .

var json = $@"{{""name"":""{name}""}}";
6
Adam Cox
[TestMethod]
public void BraceEscapingTest()
{
    var result = String.Format("Foo {{0}}", "1,2,3");  //"1,2,3" is not parsed
    Assert.AreEqual("Foo {0}", result);

    result = String.Format("Foo {{{0}}}", "1,2,3");
    Assert.AreEqual("Foo {1,2,3}", result);

    result = String.Format("Foo {0} {{bar}}", "1,2,3");
    Assert.AreEqual("Foo 1,2,3 {bar}", result);

    result = String.Format("{{{0:N}}}", 24); //24 is not parsed, see @Guru Kara answer
    Assert.AreEqual("{N}", result);

    result = String.Format("{0}{1:N}{2}", "{", 24, "}");
    Assert.AreEqual("{24.00}", result);

    result = String.Format("{{{0}}}", 24.ToString("N"));
    Assert.AreEqual("{24.00}", result);
}
5
pomber

ou vous pouvez utiliser une interpolation de chaîne c # comme ceci (fonctionnalité disponible dans C # 6.0)

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

Mon objectif:

J'avais besoin d'attribuer la valeur "{CR}{LF}" à une variable string variable delimiter.

Code c #:

string delimiter= "{{CR}}{{LF}}";

Remarque: Pour échapper aux caractères spéciaux normalement, vous devez utiliser. Pour ouvrir les accolades {, utilisez un extra comme {{. Pour fermer l’accolade}, utilisez-en une supplémentaire}}.

0
Goldfish