我有一个包含属性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
?似乎句点.
被格式化的数字替换。
答案 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。