Cómo escapar de llaves (llaves) en una cadena de formato en .NET

988

¿Cómo se pueden escapar los corchetes al usarlos string.Format?

Por ejemplo:

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

Este ejemplo no arroja una excepción, pero genera la cadena foo {0}.

¿Hay alguna forma de escapar de los corchetes?

Pop Catalin
fuente
1
Preguntas frecuentes sobre el formato de cadenas de MSDN msdn.microsoft.com/en-us/netframework/aa569608 : ¿Cómo escribo un soporte rizado en formatos de cadena? ¿Es necesario tener en cuenta los comportamientos curvos que escapé? ¿Cómo puedo usar el formato de cadena para escribir algo como "{42.00}"?
gerryLowry
1
Desafortunadamente, el enlace de MSDN anterior está roto. Actualmente, el enlace correcto parece ser msdn.microsoft.com/en-us/library/… (consulte la sección de control de calidad en la parte inferior o busque "escape" en la página).
Palo Mraz

Respuestas:

1283

Para que salgas foo {1, 2, 3}tienes que hacer algo como:

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

Para emitir un {uso {{y para generar un }uso }}.

o Ahora, también puede usar la interpolación de cadenas de C # como esta (función disponible en C # 6.0)

Corchetes de escape: Interpolación de cadenas $ ("") . Es una nueva característica en C # 6.0

var inVal = "1, 2, 3";
var outVal = $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}
Jorge Ferreira
fuente
108
"{{" se trata como el carácter de corchete escapado en una cadena de formato.
icelava
55
Pero si desea agregar un formato de valor a su especificador de cadena, también debe leer la respuesta de Guru Kara a continuación.
Nick
Lea la sección Escaping Braces en la documentación oficial Formateo compuesto .
Jeppe Stig Nielsen
8
También está funcionando en la nueva interpolación de cadenas C # 6 ( $"a = {{ {a} }}")
Mahmoodvcs
Más específico en la forma de interpolación de cuerdas C # 6, duplicar en el rizado funciona así string v = $" foo {{{t}}}";. Si tiene otros personajes para escapar que no son rizados, puede usar el combo $ @string v2 = $@"\foo {{{t}}}\";
Nhan
209

Sí a la salida {en el string.Formatque tiene que escapar de ella como esta{{

Así que esto

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

es la salida "foo {1,2,3}".

PERO debe saber acerca de un error de diseño en C #, que es que al continuar con la lógica anterior, supondría que el siguiente código imprimirá {24.00}

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

Pero esto imprime {N}. Esto se debe a la forma en que C # analiza las secuencias de escape y los caracteres de formato. Para obtener el valor deseado en el caso anterior, debe usar esto en su lugar.

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

Artículos de referencia String.Format gottach y String Formatting FAQ

Guru Kara
fuente
12
Si me encuentro con ese error, escribiría lo string.Format( "{{{0}}}", i.ToString("N") );que puede ser más legible para algunos.
HappyNomad
1
@Happy Puede que sí, pero luego te encontrarás especificando el FormatProvider dos veces, con el riesgo de que especifiques otros diferentes o te pierdas uno.
ClickRick
74

¡Casi ahí! La secuencia de escape para una llave es más {{o }}menos para su ejemplo que usaría:

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

Puede usar corchetes dobles abiertos y corchetes de cierre doble que solo mostrarán un corchete en su página.

elec
fuente
13

Escapar de llaves y usar la interpolación de cuerdas es un desafío interesante. Debe usar corchetes cuádruples para escapar del análisis y la interpolación de cadenasstring.format .

Corchetes de escape: Interpolación de cadenas $ ("") y 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>
SliverNinja - MSFT
fuente
8

Vine aquí en busca de cómo construir cadenas json ad-hoc (sin serializar una clase / objeto) en C #. En otras palabras, cómo escapar de llaves y comillas mientras se usan cadenas interpoladas en C # y " literales de cadena textuales " (cadenas dobles entre comillas con el prefijo '@'), como ...

var json = $@"{{""name"":""{name}""}}";
Adam Cox
fuente
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);
}
pomber
fuente
2

o puede usar la interpolación de cadena de C # de esta manera (función disponible en C # 6.0)

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

Corchetes de escape: Interpolación de cadenas $ (""):

Ahora, también puede usar la interpolación de cadenas de C # como esta (característica disponible en C # 6.0)

var inVal= "1, 2, 3";
var outVal= $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}
Manish Kumar Gurjar
fuente
0

Mi objetivo:

Necesitaba asignar el valor "{CR}{LF}"a una stringvariabledelimiter .

Código c #:

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

Nota: Para escapar de caracteres especiales, normalmente tiene que usar. Para abrir el soporte rizado {, use uno adicional como {{. Para cerrar el corchete}, use un extra}}.

Pez de colores
fuente