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

为什么C#在格式化期间截断字符串精度?,c#,format,string-formatting,precision,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); 在本例中,输出_1为'88.20',输出_2为'88.2' 有没有办法不使用 Double double_var; string output;

给定一个字符串和一个值相等的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);
在本例中,输出_1为'88.20',输出_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);
}

这是我为文件记录集创建的通用文件生成器,如果可能的话,我真的希望避免这种情况。

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

因此,是的,您必须将字符串解析为一个数字并格式化该数字

发件人:

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

这不包括字符串

为了使对象支持自定义格式字符串,它需要这样做,上面提到的类型就是这样做的

鉴于这些类别:

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'
给定(也不是
Foo
),它的
ToString()
方法将在没有格式的情况下被调用


另请参见。

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

因此,是的,您必须将字符串解析为一个数字并格式化该数字

发件人:

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

这不包括字符串

为了使对象支持自定义格式字符串,它需要这样做,上面提到的类型就是这样做的

鉴于这些类别:

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'
给定(也不是
Foo
),它的
ToString()
方法将在没有格式的情况下被调用


另请参见。

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


旁注:C#6有一个
FormattableString
,但只是为了支持插值字符串中格式参数的不同区域性。

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


旁注:C#6有一个
FormattableString
,但只是为了支持插值字符串中格式参数的不同区域性。

“0.00”不适用于字符串变量。“0.00”不适用于字符串变量。同样,从
字符串
到字符串
:“不执行实际转换”。同样,从
字符串
到字符串
:“未执行任何实际转换。”