it-swarm.com.de

So maskieren Sie geschweifte Klammern in einer Formatzeichenfolge in .NET

Wie können Klammern mit string.Format ausgeblendet werden? Zum Beispiel:

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

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

Gibt es eine Möglichkeit, sich den Klammern zu entziehen?

936
Pop Catalin

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

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

Um einen { auszugeben, verwenden Sie {{ und um einen } auszugeben, verwenden Sie }}.

1233
Jorge Ferreira

Ja, um { in string.Format auszugeben, müssen Sie es wie folgt maskieren {{

Also das

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

gibt "foo {1,2,3}" aus.

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

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

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

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

Referenzartikel String.Format gottach und FAQ zur String-Formatierung

203
Guru Kara

Fast dort! Die Escape-Sequenz für eine geschweifte Klammer lautet {{ oder }}. Für Ihr Beispiel würden Sie also Folgendes verwenden:

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

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

22
elec

Das Escapieren von geschweifte Klammern UND das Verwenden von Zeichenketteninterpolation ergibt eine interessante Herausforderung. Sie müssen vierfache Klammern verwenden, um die Syntaxanalyse Zeichenfolgeninterpolation und die Syntaxanalyse string.format zu umgehen.

Escape-Klammern: String-Interpolation $ ("") und String.Format

string localVar = "dynamic";
string templateString = [email protected]"<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

Kam hierher auf die Suche, wie man JSON-Strings ad-hoc (ohne Serialisierung einer Klasse/eines Objekts) in C # erstellt. Mit anderen Worten, wie man geschweifte Klammern und Anführungszeichen unter Verwendung von Interpolated Strings in C # und " verbatim string literals " (Strings in doppelten Anführungszeichen mit dem Präfix '@') wie .. .

var json = [email protected]"{{""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

oder Sie können die C # -String-Interpolation wie folgt verwenden (Funktion in C # 6.0 verfügbar)

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

Mein Ziel:

Ich musste den Wert "{CR}{LF}" einer string -Variablen delimiter zuweisen.

Code c #:

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

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

0
Goldfish