3

我正在研究字符串格式的“备忘单”,以便了解不同的字符串格式参数如何影响字符串输出。在使用DateTime字符串格式化参数时,我编写了这个小测试:

char[] dtFormats = new char[] { 'd', 'D', 'f', 'F', 'g', 'G', 'm', 'o', 'r', 's', 't', 'T', 'u', 'U', 'y' };
foreach (char format in dtFormats)
{
    Console.WriteLine("DateTime format {0} = {1:" + format + "}", format, DateTime.Now);
}

它所做的只是显示DateTime使用每个参数的所有不同格式。

除此之外,我想重点关注这一点:

Console.WriteLine("DateTime format {0} = {1:" + format + "}", format, DateTime.Now);

现在我知道它{0}被替换为 format (argument 0),并被{1:?}替换为DateTime.Now (argument 1)

我试着像这样重写这个:

Console.WriteLine("DateTime format {0} = {1:{0}}", format, DateTime.Now);

这会引发 a FormatException,但我想知道为什么不能将字符串占位符嵌套在其他格式字符串占位符中。

在这种情况下,它应该替换{0}为格式参数,并{1:{0}}替换为DateTime.Now,后跟冒号和格式参数。

这在 C# 中是不可能的吗?

编辑:

就此而言,为什么会Console.WriteLine("{{0}}", "Hello World");导致"{0}"而不是"{Hello World}"

4

5 回答 5

2

我们稍微简化一下怎么样?{{当语法状态表示单个字面量时,您正在尝试嵌套大括号{。这就是你要找的:

Console.WriteLine("DateTime format {0} = {1}", format, DateTime.Now.ToString(format));

并回答这个问题:

就此而言,为什么 Console.WriteLine("{{0}}", "Hello World"); 结果是“{0}”而不是“{Hello World}”?

我重申{{,句法上意味着一个单一的文字{

现在,如果你想使用冒号语法,无论如何你都错了,它的工作原理是这样的{100:C},它会100以货币格式显示。但是你真的不需要在这里这样做,因为让这种格式工作很困难,因为你需要这个{1:{0}},而且由于转义语法,它会失败。

于 2013-07-11T12:14:35.523 回答
1

它不起作用,因为双}}花括号会转义格式化字符串中的花括号。

如您所见,这是:

string.Format("This {{is}} my {{escaped}} curlies");

..很好(并导致This {is} my {escaped} curlies).. 因为它们被转义了。如果您像嵌套它们一样嵌套它们..解析器将不知道是否要转义。

图像是解析器并遇到这个:

Console.WriteLine("DateTime format {0} = {1:{0}}", format, DateTime.Now);
/*                                            ^^ Okay, I'll escape this. WAIT!
                                                 .. now I have a two single
                                                 curly open braces. This is
                                                 a badly formatted format string
                                                 now.. FormatException!*/
于 2013-07-11T12:11:32.810 回答
1

您可以尝试以下方法:

Console.WriteLine(string.Format("DateTime format {0} = {{1:{0}}}", format), format, DateTime.Now);
于 2013-07-11T12:57:40.280 回答
0

在格式中,您不能引用任何参数。

于 2013-07-11T12:13:19.560 回答
0

一个简单的过程来确保你不会对字符被误解有任何问题,就是将每一侧的内容分开:对于左侧,只是对带有尽可能少的附加信息的块的引用;对于右侧,需要的复杂块(不仅仅是变量)。例子:

Console.WriteLine("DateTime format {0}{1}{2}", format, " = {" + DateTime.Now, ":" + format + "}");

甚至:

Console.WriteLine("{0}{1}{2}", "DateTime format " + format, " = {" + DateTime.Now, ":" + format + "}");

你甚至可以依赖变量:

string chunk1 = "DateTime format " + format;
string chunk2 = " = {" + DateTime.Now;
string chunk3 = ":" + format + "}";
Console.WriteLine("{0}{1}{2}", chunk1, chunk2, chunk3);
于 2013-07-11T12:27:43.167 回答