我想重写 .ToString() 函数,以便每当我得到一个双精度浮点数时,它只输出小数点后的 5 位数字。
在重写函数中如何引用 .ToString 正在处理的对象?换句话说,在以下代码中,我应该用什么代替 XXX?
public override string ToString()
{
if (XXX.GetType().Name == "Double")
return (Math.Round(XXX, 5));
}
我想重写 .ToString() 函数,以便每当我得到一个双精度浮点数时,它只输出小数点后的 5 位数字。
在重写函数中如何引用 .ToString 正在处理的对象?换句话说,在以下代码中,我应该用什么代替 XXX?
public override string ToString()
{
if (XXX.GetType().Name == "Double")
return (Math.Round(XXX, 5));
}
为什么不直接使用内置的格式化功能?
var pi = 3.14159265m;
Console.WriteLine(pi.ToString("N5"));
-> "3.14159"
作为参考,我喜欢John Sheehan的.NET格式化字符串快速参考手册。
你不能为不同类型覆盖一个方法 - 基本上你无法停止double.ToString
执行其操作。但是,你可以编写一个方法,以适当的格式接受一个double并进行格式化。
public static class DoubleExtensions {
public static string ToStringWith5Digits(this double x) { ... }
}
并且像这样使用:
double d = 10;
string x = d.ToStringWith5Digits();
Double.ToString()
传递格式参数来指定数字的位数:double x = 5.12345667;
string s = x.ToString("F5"); // s="5.12345", x.ToString("#.#####") also works
你无法覆盖双精度浮点数的 ToString() 函数(它是 Double 结构体的成员函数)。
虽然"F5"或"#.#####"可以解决原帖的具体问题,但是由于标题比较广泛("override .ToString()"),我想补充一下,您也可以创建一个重载ToString()
的扩展方法。
例如,一个扩展方法可以是:
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;
}
double d = 5.2514;
string formatted = d.ToString(2, " was rounded");
如果传递,则返回"5.2"
double d = 5.2;
string formatted = d.ToString(2, " was rounded");
(只是为了防止有一些奇怪的用例,有人想做这样的事情!)
但是,您不应该尝试使用与内置ToString()
重载之一具有相同签名的方法来覆盖ToString()
,因为虽然IDE会看到它,但它永远不会调用扩展方法(有关详细信息,请参见如何调用具有与现有方法相同名称的扩展方法?)
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() );
}
}
你不能覆盖原有方法,但是可以使用扩展方法
public static string ToRoundString(this double doubleValue)
{
return Math.Round(doubleValue, 5).ToString();
}
使用方法
public void TestMethod()
{
double greatValue = 3;
string newString = greatVale.ToRoundString();
}
干杯