字符串格式返回意外结果

时间:2016-06-29 01:13:25

标签: c# string formatting string-interpolation

我有一个包含属性Format的简单类,该属性设置为任何给定的格式说明符。然后,我使用此类的属性,如名称所示,格式化字符串。

采用以下示例:

public class FormatDefinition {
    public string Format { get; set; }
}

class Program {
    static void Main() {

        var formatDefinition = new FormatDefinition {
            Format = "N"
        };

        var number = 20.5;

        var formatOne = string.Format("{0:" + formatDefinition.Format + "}", number);
        var formatTwo = string.Format("{0:formatDefinition.Format}", number);
        var formatThree = $"{number:formatDefinition.Format}";

        Console.WriteLine(formatOne);       //  20.5
        Console.WriteLine(formatTwo);       //  formatDefinition21Format
        Console.WriteLine(formatThree);     //  formatDefinition21Format

        Console.ReadLine();
    }
}

有人可以解释为什么formatTwoformatThree的结果为formatDefinition21Format?似乎句点.被格式化的数字替换。

2 个答案:

答案 0 :(得分:1)

您指定的custom numeric format string由字符串"formatDefinition.Format"组成。

这是指常量字符串“formatDefinition”后跟小数点(因此整个数字在这里),然后是常量字符串“Format”

数字四舍五入到零小数位,因为小数点后面没有指定数字。

字符串formatDefinition.Format不会被解释为C#代码。

答案 1 :(得分:0)

根据自定义数字格式字符串的documentation

  

对于定点格式字符串(即格式字符串不是   包含科学记数法格式字符),数字四舍五入到   与小数位占位符一样多的小数位数   小数点。

这是因为你有一个小数点,右边没有数字占位符。你告诉它将数字四舍五入到零小数位 - 换句话说,四舍五入到最接近的整数。

这些在功能上都相同 - 都返回a22b

string.Format("{0:a.b}", 21.5);
string.Format("{0:a0b}", 21.5);
string.Format("{0:a0.b}", 21.5);

这里是DotNetFiddle