Question

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?

Était-ce utile?

La solution

Pour que vous puissiez générer foo {1, 2, 3} , vous devez faire quelque chose comme:

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

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

Autres conseils

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

Donc ceci

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

générera "foo {1,2,3}" .

MAIS vous devez être informé d'un bogue de conception en C #, à savoir 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

Presque là! La séquence d'échappement d'un accolade est {{ ou }} . Ainsi, pour votre exemple, vous utiliseriez:

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

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

Échapper à accolades ET utiliser une interpolation de chaîne constitue un défi intéressant. Vous devez utiliser des quadruple crochets pour échapper à l'analyse de interpolation de chaîne et à l'analyse de string.format .

Supports d'échappement: Interpolation de chaîne $ (""") 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>

Nous sommes venus ici pour chercher comment construire des chaînes json ad-hoc (sans sérialiser une classe / objet) en C #. En d'autres termes, comment échapper des accolades et des 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}""}}";
[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);
}

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 = <*>quot; foo {{{value}}}";

Mon objectif:

Je devais affecter la valeur " {CR} {LF} & <; code> à une chaîne chaîne variable délimiteur .

Code c #:

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top