字符串格式 Returns 意外结果

String Format Returns Unexpected Results

我有一个简单的 class,其中包含一个 属性 Format,它被设置为任何给定的格式说明符。然后我使用此 class 的 属性 来格式化字符串,顾名思义。

举个例子:

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?句号 . 似乎被格式化的数字所取代。

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

For fixed-point format strings (that is, format strings that do not contain scientific notation format characters), numbers are rounded to as many decimal places as there are digit placeholders to the right of the decimal point.

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

这些在功能上都是相同的 - 都是 return a22b

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

这里是 DotNetFiddle

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

组成

这意味着 常量字符串 "formatDefinition" 后跟小数点(因此整个数字放在此处)后跟 常量字符串"Format"

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

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