2013-07-11 107 views
3

我正在通过字符串格式化“作弊表”的方式,以便我可以看到不同的字符串格式参数如何影响字符串输出。虽然与DateTime字符串格式化参数的工作,我写了这个小测试:在C#中的字符串格式化#

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}被替换格式(参数0){1:?}被替换DateTime.Now(参数1)

我试图重新写像这样:

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

这就提出了一个FormatException,但我想知道为什么你不能等格式字符串占位内窝串占位符。

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

这不可能在C#中吗?

编辑:

对于这个问题,为什么Console.WriteLine("{{0}}", "Hello World");结果"{0}",而不是"{Hello World}"

回答

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}},并且由于转义语法而失败。

+0

这是一个简单的解决方案(因此+1),但它并没有真正回答你为什么不能嵌套格式的占位符,也许我将不得不编写我自己的字符串格式化实现... – series0ne

+0

@ series0ne,我相信我可能一直在编辑,而你评论,请参阅我的编辑。 –

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!*/ 
+0

啊我看到.. .Console.WriteLine(“{{{0}}}”,“Hello World”);产生“{Hello World}” – series0ne

+0

...但不幸的是,相同的原则似乎不适用于日期时间格式:-( – series0ne

0

里面你可以不参考任何参数的格式

0

一个简单的程序,以确保你不会有任何问题,字符misundertood分离什么放在每一边:对于左侧,只是最小的附加信息可能的块的引用;对于右侧来说,就像所需的复杂块(不仅仅是变量)。例如:

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); 
1

你可以尝试以下方法:

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