字符串格式返回意外的结果

问题描述 投票:0回答:2

我有一个包含被设置为任何给定的格式说明符的属性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的结果?这似乎.被格式化的数字替换的时期。

c# string formatting string-interpolation
2个回答
1
投票

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

这被认为是指常量字符串“formatDefinition”后面的小数点(因此整个数字放在这里),其次是常量字符串“格式”。

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

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


0
投票

按照documentation的自定义数字格式字符串:

对于定点格式字符串(也就是不包含科学记数法格式字符格式字符串),因为有数字占位符小数点右边的数字四舍五入到尽可能多的小数位。

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

这些都是功能相同 - 都返回a22b

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

这里有一个DotNetFiddle

© www.soinside.com 2019 - 2024. All rights reserved.