Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的字符串格式#_C#_.net_Formatting_Arguments_String Formatting - Fatal编程技术网

C# C语言中的字符串格式#

C# C语言中的字符串格式#,c#,.net,formatting,arguments,string-formatting,C#,.net,Formatting,Arguments,String Formatting,我正在研究字符串格式的“备忘单”,以便了解不同的字符串格式参数如何影响字符串输出。在使用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

我正在研究字符串格式的“备忘单”,以便了解不同的字符串格式参数如何影响字符串输出。在使用
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}
被替换为格式(参数0),而
{1:?}
被替换为
DateTime.Now
(参数1)

我试着这样重写:

Console.WriteLine("DateTime format {0} = {1:{0}}", format, DateTime.Now);
这会引发
格式异常
,但我想知道为什么不能将字符串占位符嵌套在其他格式字符串占位符中

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

这在C#中是不可能的吗

编辑:


就这一点而言,为什么
Console.WriteLine(“{{0}}”,“helloworld”)导致
“{0}”
而不是
“{Hello World}”

它将不起作用,因为双卷曲
}
会转义格式化字符串中的大括号

正如您所发现的,这是:

string.Format("This {{is}} my {{escaped}} curlies");
…很好(并导致
这{is}我的{逃逸}卷发)
。。因为他们逃跑了。如果你像以前那样给它们筑巢。。解析器将不知道是否要转义

作为解析器的图像遇到以下情况:

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

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

我们简化一下如何?当语法声明
{
表示单个文本
{
时,您正在尝试嵌套大括号。这就是您要查找的:

Console.WriteLine("DateTime format {0} = {1}", format, DateTime.Now.ToString(format));
要回答这个问题:

就这点而言,为什么Console.WriteLine(“{{0}”,“Hello World”);会导致“{0}”而不是“{Hello World}”

我重申,
{{
,在语法上意味着单个文本
{


现在,如果你想使用冒号语法,不管怎么说,你都错了,它的工作原理是这样的,
{100:C}
,它将以货币格式显示
100
。但是你真的不需要在这里这样做,因为要使该格式工作起来会很困难,因为你需要这个
{1:{0}
这将因为转义语法而失败。

一个简单的过程可以确保您不会有任何错误读入字符的问题,就是将要放在每一侧的内容分开:对于左侧,仅引用具有尽可能少的附加信息的块;对于右侧,尽可能复杂nks(不只是变量)。示例:

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

您可以尝试以下操作:

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

啊,我明白了…Console.WriteLine(“{{{{0}}}”,“Hello World”);生成“{Hello World}”…但不幸的是,相同的原则似乎不适用于日期时间格式:-(这是一个简单的解决方案(so+1),但它实际上并不能回答为什么不能嵌套格式的占位符。也许我必须编写自己的字符串格式实现…@series0ne,我相信在你发表评论时我可能正在编辑。请查看我的编辑。