字符串格式返回意外结果

本文关键字:结果 意外 返回 格式 字符串 | 更新日期: 2023-09-27 17:52:47

我有一个简单的类,它包含一个属性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();
    }
}

谁能解释一下为什么formatTwoformatThreeformatDefinition21Format的结果?似乎句号.被格式化的数字代替了。

字符串格式返回意外结果

指定由字符串"formatDefinition.Format"组成的自定义数字格式字符串。

这被认为是指常量字符串"formatDefinition"后面跟着小数点(因此整个数字在这里),后面跟着常量字符串"Format"

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

字符串formatDefinition.Format不被解释为c#代码

根据自定义数字格式字符串的文档:

用于定点格式字符串(即,格式化不包含包含科学符号格式字符),数字四舍五入到右边有多少位数字占位符,就有多少位小数小数点

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

它们在功能上都是一样的——都返回a22b

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

这是一个DotNetFiddle