覆盖.ToString()

时间:2010-01-21 13:37:34

标签: c# override

我想覆盖.ToString()函数,以便每当我得到一个double 它只输出小数点后的5位数。

如何在覆盖函数内部处理.ToString正在处理的对象? 换句话说,我在下面的代码中放了什么shell而不是XXX?

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

7 个答案:

答案 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?