我有一个包含被设置为任何给定的格式说明符的属性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();
}
}
可有人请解释为什么formatTwo
和formatThree
有formatDefinition21Format
的结果?这似乎.
被格式化的数字替换的时期。
要指定由字符串custom numeric format string的"formatDefinition.Format"
。
这被认为是指常量字符串“formatDefinition”后面的小数点(因此整个数字放在这里),其次是常量字符串“格式”。
因为没有小数点后指定的位数四舍五入到零位小数。
该字符串formatDefinition.Format
不被解释为C#代码。
按照documentation的自定义数字格式字符串:
对于定点格式字符串(也就是不包含科学记数法格式字符格式字符串),因为有数字占位符小数点右边的数字四舍五入到尽可能多的小数位。
这是因为你有一个小数点,没有数字占位符其右。你告诉它的数字四舍五入到零位小数 - 换句话说,四舍五入到最接近的整数。
这些都是功能相同 - 都返回a22b
。
string.Format("{0:a.b}", 21.5);
string.Format("{0:a0b}", 21.5);
string.Format("{0:a0.b}", 21.5);
这里有一个DotNetFiddle。