重写 .ToString() 方法

5

我想重写 .ToString() 函数,以便每当我得到一个双精度浮点数时,它只输出小数点后的 5 位数字。

在重写函数中如何引用 .ToString 正在处理的对象?换句话说,在以下代码中,我应该用什么代替 XXX?

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

21

1
+1 这才是 OP 真正 想要使用的。当然,你可以将其作为扩展方法使用,但这里真的没有必要... - Noldorin

12

你不能为不同类型覆盖一个方法 - 基本上你无法停止double.ToString执行其操作。但是,你可以编写一个方法,以适当的格式接受一个double并进行格式化。


7
正如Jon所指出的那样,你不能覆盖Double.ToString方法。但你可以为double类型创建一个扩展方法来帮助你实现这一点:
public static class DoubleExtensions {
   public static string ToStringWith5Digits(this double x) { ... }
}

并且像这样使用:

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

2
您可以通过向 Double.ToString() 传递格式参数来指定数字的位数:
double x = 5.12345667;
string s = x.ToString("F5"); // s="5.12345", x.ToString("#.#####") also works

你无法覆盖双精度浮点数的 ToString() 函数(它是 Double 结构体的成员函数)。


0

虽然"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");

如果传递,则返回"5.2"

double d = 5.2;
string formatted = d.ToString(2, " was rounded");

(只是为了防止有一些奇怪的用例,有人想做这样的事情!)

但是,您不应该尝试使用与内置ToString()重载之一具有相同签名的方法来覆盖ToString(),因为虽然IDE会看到它,但它永远不会调用扩展方法(有关详细信息,请参见如何调用具有与现有方法相同名称的扩展方法?


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() );
    }
}

感谢所有的回答。我使用了看起来最简单的方法——使用“F5”格式化。但是,如果我想要使用不同的方式来格式化我的double.ToString,例如,我想在转换的末尾添加一个字符串(“2.345” -> “2.345 double”)。我可以向double结构体添加另一个成员,其签名不同,接近于完全独立的函数,但更类似于原始函数吗? - Eli

0

你不能覆盖原有方法,但是可以使用扩展方法

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

使用方法

public void TestMethod()
{
   double greatValue = 3;
   string newString = greatVale.ToRoundString();
}

干杯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接