C# override.ToString()

C# override.ToString(),c#,overriding,C#,Overriding,我想重写.ToString()函数,这样每当我得到一个double 它只输出小数点后的5位数字 如何在override函数中引用.ToString正在处理的对象? 换句话说,在下面的代码中,我放置了什么shell来代替XXX public override string ToString() { if (XXX.GetType().Name == "Double") return (Math.Round(XXX, 5)); } 您不能为不同的类型重写一个方法-基本上,您

我想重写.ToString()函数,这样每当我得到一个double 它只输出小数点后的5位数字

如何在override函数中引用.ToString正在处理的对象? 换句话说,在下面的代码中,我放置了什么shell来代替XXX

public override string ToString()
{
    if (XXX.GetType().Name == "Double")
        return (Math.Round(XXX, 5));
}

您不能为不同的类型重写一个方法-基本上,您不能停止
double.ToString
执行它所做的操作。但是,您可以编写一个方法,该方法接受double并对其进行适当的格式化。

正如Jon指出的,您不能重写
double.ToString
。您可以为
double
类型创建一个扩展方法,以帮助您执行此操作:

public static class DoubleExtensions {
   public static string ToStringWith5Digits(this double x) { ... }
}
然后像这样使用它:

double d = 10;
string x = d.ToStringWith5Digits(); 

为什么不直接使用内置格式

var pi = 3.14159265m;
Console.WriteLine(pi.ToString("N5"));
-> "3.14159"

作为参考,我喜欢John Sheehan的。

您可以将格式参数传递给
Double.ToString()
指定位数:

double x = 5.12345667;
string s = x.ToString("F5"); // s="5.12345", x.ToString("#.#####") also works

您不能为Double重写ToString()函数(它是struct Double的成员函数)

您的ToString()函数属于哪个类?通常,在使用的类中有私有变量。(但也可以是构建ToString()的变量组合)

e、 g.:(这是伪代码)


不能重写,但可以使用扩展方法

public static string ToRoundString(this double doubleValue)
{
   return Math.Round(doubleValue, 5).ToString();
}
用法

干杯

虽然“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;
    }
如果通过,将产生“5.25四舍五入”

double d = 5.2514;
string formatted = d.ToString(2, " was rounded");
double d = 5.2;
string formatted = d.ToString(2, " was 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()
重载具有相同签名的方法重写
ToString()
,但是,尽管IDE会看到它,但它永远不会调用扩展方法(有关详细信息,请参阅)

+1这是OP真正想要使用的。当然,你们可以用它作为扩展方法,但这里并没有什么意义……谢谢你们的回答。我使用了看起来最简单的一种——使用“F5”格式。不过,如果我想使用另一种格式化double.ToString的方法,例如,我想在转换结束时添加一个字符串(“2.345”->“2.345 double”)。我可以用不同的符号将另一个成员添加到双结构器中吗?它接近于一个完全独立的函数,但更类似于原始函数?