为什么C#在格式化期间截断字符串精度?

时间:2018-06-13 08:50:35

标签: c# format string-formatting precision

给定一个字符串和一个等值的double,string.Format截断的方式不同。

double x = 88.2;
string y = "88.2";
string output_1 = String.Format("{0:0.00}", x);
string output_2 = String.Format("{0:0.00}", y);

在这种情况下,output_1将是' 88.20'和output_2是' 88.2'。

有没有办法在不使用

的情况下执行此操作
Double double_var;
string output;
if (Double.TryParse(input, out double_var))
{
    output = String.Format("{0:0.00}", double_var);
}
else
{
    output = String.Format("{0:0.00}", input);
}

这适用于我为文件记录集创建的通用文件构建器,如果可能,我真的想避免这种情况。

2 个答案:

答案 0 :(得分:4)

String.Format不会将格式应用于字符串。你知道字符串包含一个数字,但.NET不包含数字。

所以是的,您必须将字符串解析为数字并格式化该数字。

来自MSDN: String.Format()

  

许多类型支持格式字符串,包括所有数字类型(标准和自定义格式字符串),所有日期和时间(标准和自定义格式字符串)和时间间隔(标准和自定义格式字符串),所有枚举类型枚举类型和GUID。您还可以将格式字符串的支持添加到您自己的类型中。

这不包括字符串。

为了使对象支持自定义格式字符串,需要implement IFormattable,这与上面提到的类型有关。

鉴于这些课程:

public class FormattableFoo : IFormattable 
{
    public string ToString(string format, IFormatProvider provider)
    {
        return $"FooFormat: '{format}'";
    }
}

public class Foo
{
    public override string ToString()
    {
        return "Foo";
    }
}

这些电话:

Console.WriteLine("{0:0.00}", new Foo());
Console.WriteLine("{0:0.00}", new FormattableFoo());

输出将是:

Foo
FooFormat: '0.00'

鉴于System.String doesn't implement IFormattableFoo也没有),其ToString()方法将在没有格式的情况下调用。

另见MSDN: Customizing Format Strings

答案 1 :(得分:0)

string未实现IFormattable,因此将忽略任何指定的格式化参数。另一方面,double可以解释提供的0.00格式说明符。

附注:C#6有一个FormattableString,但仅用于支持插值字符串中格式参数的不同文化。