我想覆盖.ToString()函数,以便每当我得到一个double 它只输出小数点后的5位数。
如何在覆盖函数内部处理.ToString正在处理的对象? 换句话说,我在下面的代码中放了什么shell而不是XXX?
public override string ToString()
{
if (XXX.GetType().Name == "Double")
return (Math.Round(XXX, 5));
}
答案 0 :(得分:20)
为什么不使用内置格式?
var pi = 3.14159265m;
Console.WriteLine(pi.ToString("N5"));
-> "3.14159"
作为参考,我喜欢John Sheehan的.NET Format String Quick Reference。
答案 1 :(得分:11)
你不能覆盖不同类型的方法 - 基本上你不能阻止double.ToString
做它做的事情。但是,您可以编写一个采用double的方法并对其进行适当格式化。
答案 2 :(得分:6)
Jon指出,你不能覆盖Double.ToString
。您可以为double
类型创建一个帮助您执行此操作的扩展方法:
public static class DoubleExtensions {
public static string ToStringWith5Digits(this double x) { ... }
}
并使用它:
double d = 10;
string x = d.ToStringWith5Digits();
答案 3 :(得分:2)
您可以将格式参数传递给Double.ToString()
,指定位数:
double x = 5.12345667;
string s = x.ToString("F5"); // s="5.12345", x.ToString("#.#####") also works
你不能覆盖双精度的ToString()函数(它是struct Double的成员函数)
答案 4 :(得分:0)
你的ToString()函数属于哪个类?通常,您使用的类中包含私有变量。 (但也可以是构建ToString()的变量组合)
例如:(伪代码)
class MyClass
{
private double dd;
private string prefix = "MyDouble:";
...
...
public override string ToString()
{
if (dd.GetType().Name == "Double")
return ( prefix + Math.Round(dd, 5).ToString() );
}
}
答案 5 :(得分:0)
你无法覆盖,但你可以使用扩展方法
public static string ToRoundString(this double doubleValue)
{
return Math.Round(doubleValue, 5).ToString();
}
使用
public void TestMethod()
{
double greatValue = 3;
string newString = greatVale.ToRoundString();
}
欢呼声
答案 6 :(得分:0)
而" F5"或"#。#####"解决了原帖的细节,因为标题相当宽泛("覆盖.ToString()"),我想我还要补充一点,你也可以创建一个重载{{ 1}}。
因此,例如,扩展方法为:
ToString()
生产" 5.25是四舍五入"如果通过
public static string ToString(this double value, int roundTo, string roundSuffix)
{
string rounded = value.ToString($"#.{new String('#', roundTo)}");
if (rounded != value.ToString())
{
rounded = $"{rounded}{roundSuffix}";
}
return rounded;
}
或" 5.2"如果通过
double d = 5.2514;
string formatted = d.ToString(2, " was rounded");
(仅仅是因为那里有一些奇怪的用例,有人想做类似的事情!)
您不应该尝试使用与内置double d = 5.2;
string formatted = d.ToString(2, " was rounded");
重载之一具有相同签名的方法覆盖ToString()
,因为IDE会看到它,它将会永远不要调用扩展方法(有关详细信息,请参阅How to call extension method which has the same name as an existing method?)