Comment échapper des accolades (accolades) dans une chaîne de formatage en .NET
-
01-07-2019 - |
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?
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}}.