Come sfuggire alle parentesi graffe (parentesi graffe) in una stringa di formato in .NET


988

Come si possono sfuggire alle parentesi usando string.Format.

Per esempio:

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

Questo esempio non genera un'eccezione, ma genera la stringa foo {0}.

C'è un modo per sfuggire alle parentesi?


1
Domande frequenti sulla formattazione delle stringhe MSDN msdn.microsoft.com/en-us/netframework/aa569608 : Come posso scrivere una parentesi graffa nei formati stringa? Le parentesi graffe sfuggite hanno comportamenti strani di cui devo essere consapevole? Come posso usare la formattazione delle stringhe per scrivere qualcosa come "{42.00}"?
gerryLowry,

1
Sfortunatamente, il collegamento MSDN sopra riportato è interrotto. Attualmente, il collegamento corretto sembra essere msdn.microsoft.com/en-us/library/… (vedere la sezione QA in basso o cercare "escape" nella pagina).
Palo Mraz,

Risposte:


1283

Per poter produrre foo {1, 2, 3}devi fare qualcosa del tipo:

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

Per produrre un output {che usi {{e per generare un output }che usi }}.

oppure Ora puoi anche usare l'interpolazione di stringhe c # in questo modo (funzione disponibile in C # 6.0)

Parentesi di escape: interpolazione di stringhe $ ("") . è una nuova funzionalità in C # 6.0

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

108
"{{" viene considerato come il carattere di parentesi di escape in una stringa di formato.
Icelava,

5
Ma se vuoi aggiungere la formattazione del valore al tuo identificatore di stringa devi anche leggere la risposta di Guru Kara di seguito.
Nick

Leggi la sezione Escaping Braces nella documentazione ufficiale Formattazione composita .
Jeppe Stig Nielsen

8
Funziona anche con la nuova interpolazione di stringhe C # 6 ( $"a = {{ {a} }}")
Mahmoodvcs,

Più specifico sul modo di interpolazione delle stringhe C # 6, raddoppiando sui ricci si lavora così string v = $" foo {{{t}}}";. Se hai altri personaggi da sfuggire che non sono ricci, puoi usare la combo $ @string v2 = $@"\foo {{{t}}}\";
Nhan

209

Sì per l'output {in string.Formatdevi evitarlo in questo modo{{

Così questo

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

uscirà "foo {1,2,3}".

MA devi sapere di un bug di progettazione in C # che è che andando sulla logica di cui sopra dovresti supporre che questo codice sottostante stamperà {24.00}

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

Ma questo stampa {N}. Questo perché il modo in cui C # analizza le sequenze e formatta i caratteri. Per ottenere il valore desiderato nel caso precedente, è necessario utilizzare questo.

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

Articoli di riferimento Domande frequenti su String.Format Gottach e String Formatting


12
Se mi imbattessi in quel bug, scriverei string.Format( "{{{0}}}", i.ToString("N") );che potrebbe essere più leggibile per alcuni.
HappyNomad,

1
@Happy Potrebbe, ma ti ritroveresti a specificare due volte FormatProvider, con il rischio che tu ne specifichi diversi o ne manchi uno.
ClickRick

74

Quasi lì! La sequenza di escape per un tutore è {{o }}così per il vostro esempio si userebbe:

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

22

Puoi usare doppie parentesi aperte e doppie parentesi di chiusura che mostreranno solo una parentesi sulla tua pagina.


13

Sfuggire alle parentesi graffe E usare l'interpolazione di stringhe rappresenta una sfida interessante. È necessario utilizzare parentesi quadruple per sfuggire all'analisi e all'analisi dell'interpolazione di stringhestring.format .

Parentesi di escape: String Interpolation $ ("") e 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

Sono venuto qui alla ricerca di come costruire stringhe json ad-hoc (senza serializzare una classe / oggetto) in C #. In altre parole, come sfuggire alle parentesi graffe e alle virgolette mentre si usano stringhe interpolate in C # e " letterali di stringhe testuali " (stringhe tra virgolette doppie con prefisso '@'), come ...

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

oppure puoi usare l'interpolazione di stringhe c # in questo modo (funzione disponibile in C # 6.0)

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

1

Parentesi di escape: Interpolazione di stringhe $ (""):

Ora puoi anche usare l'interpolazione di stringhe c # in questo modo (funzione disponibile in C # 6.0)

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

0

Il mio obiettivo:

Avevo bisogno di assegnare il valore "{CR}{LF}"a una stringvariabile delimiter.

Codice c #:

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

Nota: per sfuggire ai caratteri speciali normalmente devi usare. Per aprire la parentesi graffa {, utilizzare un altro tipo {{. Per chiudere la parentesi graffa}, utilizzare un extra}}.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.