如何在.NET中以格式字符串转义大括号(大括号)


988

使用时如何逃脱括号string.Format

例如:

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

此示例不会引发异常,但会输出字符串foo {0}

有没有办法逃脱括号?


1
MSDN字符串格式常见问题解答msdn.microsoft.com/zh-cn/netframework/aa569608:如何用字符串格式写出大括号?转义的花括号是否有我需要注意的奇怪行为?如何使用字符串格式写出类似“ {42.00}”的文字?
gerryLowry

1
不幸的是,以上MSDN链接已断开。当前,正确的链接似乎是msdn.microsoft.com/en-us/library/…(请参阅底部的“质量检查”部分,或在页面上搜索“转义”)。
Palo Mraz

Answers:


1283

为了输出,foo {1, 2, 3}您必须执行以下操作:

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

要输出{您使用的内容{{和要输出}您使用的内容}}

或现在,您还可以像这样使用c#字符串插值(在C#6.0中可用)

转义括号:字符串插值$(“”)。它是C#6.0中的新功能

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

108
“ {{”被视为格式字符串中的转义括号字符。
icelava

5
但是,如果您想在字符串说明符中添加值格式,则还需要阅读以下Guru Kara的答案。
尼克

阅读官方文档“ 复合格式”中的“ 转义括号 ”部分。
Jeppe Stig Nielsen

8
这也是一个在新的C#工作6串插($"a = {{ {a} }}"
Mahmoodvcs

更具体地讲C#6字符串插值方式,像这样的卷曲函数加倍string v = $" foo {{{t}}}";。如果您还有其他要转义的字符,可以使用$ @组合string v2 = $@"\foo {{{t}}}\";
Nhan

209

是的,要输出{string.Format您必须像这样逃避它{{

所以这

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

将输出"foo {1,2,3}"

但是您必须了解C#中的一个设计错误,即通过执行上述逻辑,您将假定以下代码将打印{24.00}

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

但这会打印{N}。这是因为C#解析转义序列和格式化字符的方式。为了在上述情况下获得所需的值,您必须使用此值。

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

参考文章 String.Format获取字符串格式常见问题解答


12
如果遇到该错误,我会写string.Format( "{{{0}}}", i.ToString("N") );一些可能更易读的错误。
HappyNomad

1
@Happy它可能会,但是您会发现自己两次指定了FormatProvider,这有可能会指定不同的或丢失一个。
ClickRick

74

差不多好了!为支柱的转义序列{{}}使你的例子中,你可以使用:

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

22

您可以使用双开括号和双闭括号,它们只会在页面上显示一个括号。


13

转义大括号并使用字符串插值带来了一个有趣的挑战。您需要使用四方括号来进行字符串插值解析和string.format解析。

转义括号:字符串插值$(“”)和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>


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

或者您可以像这样使用c#字符串插值(C#6.0中提供的功能)

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


0

我的目标:

我需要的值分配"{CR}{LF}"给一个string变量delimiter

代码C#:

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

注意:通常,要转义特殊字符,必须使用。要打开大括号{,请使用{{ 要关闭大括号},请额外使用}}。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.