So maskieren Sie geschweifte Klammern (geschweifte Klammern) in einer Formatzeichenfolge in .NET


988

Wie können Klammern in Verwendung entwertet werden string.Format.

Zum Beispiel:

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

In diesem Beispiel wird keine Ausnahme ausgelöst, sondern die Zeichenfolge ausgegeben foo {0}.

Gibt es eine Möglichkeit, den Klammern zu entkommen?


1
Häufig gestellte Fragen zur Formatierung von MSDN- Zeichenfolgen msdn.microsoft.com/en-us/netframework/aa569608 : Wie schreibe ich eine geschweifte Klammer in Zeichenfolgenformaten aus? Haben entkommene geschweifte Klammern merkwürdige Verhaltensweisen, die ich beachten muss? Wie kann ich die Zeichenfolgenformatierung verwenden, um etwas wie "{42.00}" zu schreiben?
GerryLowry

1
Leider ist der obige MSDN-Link unterbrochen. Derzeit scheint der richtige Link msdn.microsoft.com/en-us/library/… zu sein (siehe den QA-Abschnitt unten oder suchen Sie auf der Seite nach "Escape").
Palo Mraz

Antworten:


1283

Damit Sie ausgeben können foo {1, 2, 3}, müssen Sie Folgendes tun:

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

Um ein von {Ihnen verwendetes {{und ein von }Ihnen verwendetes auszugeben }}.

oder Jetzt können Sie auch eine solche C # -String-Interpolation verwenden (Funktion in C # 6.0 verfügbar).

Escape-Klammern: String-Interpolation $ ("") . Es ist eine neue Funktion in C # 6.0

var inVal = "1, 2, 3";
var outVal = $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}

108
"{{" wird als maskiertes Klammerzeichen in einer Formatzeichenfolge behandelt.
Icelava

5
Wenn Sie Ihrem Zeichenfolgenspezifizierer jedoch eine Wertformatierung hinzufügen möchten, müssen Sie auch die Antwort von Guru Kara unten lesen.
Nick

Lesen Sie den Abschnitt Escaping Braces in der offiziellen Dokumentation Composite Formating .
Jeppe Stig Nielsen

8
Es funktioniert auch in der neuen C # 6-String-Interpolation ( $"a = {{ {a} }}")
Mahmoodvcs

Genauer gesagt, bei der C # 6-String-Interpolation funktioniert das Verdoppeln des Curlys wie folgt string v = $" foo {{{t}}}";. Wenn Sie andere Charaktere haben, denen Sie entkommen können, die nicht lockig sind, können Sie die $ @ combostring v2 = $@"\foo {{{t}}}\";
Nhan

209

Ja zur Ausgabe {in string.FormatSie haben es so zu entkommen{{

Also das

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

wird ausgegeben "foo {1,2,3}".

ABER Sie müssen über einen Designfehler in C # Bescheid wissen. Wenn Sie die obige Logik anwenden, gehen Sie davon aus, dass der folgende Code {24.00} druckt.

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

Dies gibt jedoch {N} aus. Dies liegt daran, dass C # Escape-Sequenzen analysiert und Zeichen formatiert. Um im obigen Fall den gewünschten Wert zu erhalten, müssen Sie diesen stattdessen verwenden.

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

Referenzartikel FAQ zu String.Format gottach und String-Formatierung


12
Wenn ich auf diesen Fehler stoßen würde, würde ich schreiben, string.Format( "{{{0}}}", i.ToString("N") );der für manche besser lesbar sein könnte.
HappyNomad

1
@Happy Es könnte sein, aber Sie würden dann feststellen, dass Sie den FormatProvider zweimal angeben, mit dem Risiko, dass Sie andere angeben oder einen verpassen.
ClickRick

74

Fast dort! Die Escape-Sequenz für eine Zahnspange ist {{oder }}so für Ihr Beispiel, das Sie verwenden würden:

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

22

Sie können doppelte offene Klammern und doppelte schließende Klammern verwenden, die nur eine Klammer auf Ihrer Seite anzeigen.


13

Das Entkommen von geschweiften Klammern UND die Verwendung der Zeichenfolgeninterpolation stellen eine interessante Herausforderung dar. Sie müssen vierfache Klammern verwenden , um das Parsen und Parsen der Zeichenfolgeninterpolation zustring.format umgehen.

Escape-Klammern: String-Interpolation $ ("") und 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>

8

Kam hier auf der Suche nach dem Erstellen von JSON-Zeichenfolgen ad-hoc (ohne eine Klasse / ein Objekt zu serialisieren) in C #. Mit anderen Worten, wie Sie geschweifte Klammern und Anführungszeichen vermeiden können, während Sie interpolierte Zeichenfolgen in C # und " wörtliche Zeichenfolgenliterale " (Zeichenfolgen in doppelten Anführungszeichen mit dem Präfix '@') verwenden, wie ...

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

5
[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);
}

2

oder Sie können eine solche C # -String-Interpolation verwenden (Funktion in C # 6.0 verfügbar)

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

1

Escape-Klammern: String-Interpolation $ (""):

Jetzt können Sie auch eine solche C # -String-Interpolation verwenden (Funktion in C # 6.0 verfügbar).

var inVal= "1, 2, 3";
var outVal= $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}

0

Mein Ziel:

Ich musste den Wert "{CR}{LF}"einer stringVariablen zuweisen delimiter.

Code c #:

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

Hinweis: Um Sonderzeichen normalerweise zu umgehen, müssen Sie verwenden. Verwenden Sie zum Öffnen der geschweiften Klammer {eine zusätzliche wie {{. Verwenden Sie zum Schließen der geschweiften Klammer} eine zusätzliche}}.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.