为什么C#在格式化期间截断字符串精度?
给定一个字符串和一个值相等的double,string.Format会以不同的方式截断为什么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 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”不适用于字符串变量。同样,从字符串到字符串:“不执行实际转换”。同样,从字符串到字符串:“未执行任何实际转换。”