【问题标题】:override .ToString()覆盖 .ToString()
【发布时间】:2010-01-21 13:37:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# overriding


    【解决方案1】:

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

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

    作为参考,我喜欢 John Sheehan 的 .NET Format String Quick Reference

    【讨论】:

    • +1 这是 OP 真正想要使用的。当然,你可以使用作为扩展方法,但这里真的没有意义......
    【解决方案2】:

    你不能覆盖不同类型的方法——基本上你不能阻止double.ToString 做它所做的事情。但是,您可以编写一个方法,该方法采用双精度并对其进行适当的格式化。

    【讨论】:

      【解决方案3】:

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

      public static class DoubleExtensions {
         public static string ToStringWith5Digits(this double x) { ... }
      }
      

      并像这样使用它:

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

      【讨论】:

        【解决方案4】:

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

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

        你不能覆盖双精度的 ToString() 函数(它是 struct Double 的成员函数)

        【讨论】:

          【解决方案5】:

          您的 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”)。我可以将另一个成员添加到具有不同签名的双重结构中,这接近完全独立的功能但更类似于原始功能吗?
          【解决方案6】:

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

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

          用法

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

          干杯

          【讨论】:

            【解决方案7】:

            虽然“F5”或“#.#####”解决了原始帖子的细节,但由于标题相当广泛(“覆盖 .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 会看到它,但它永远不会调用扩展方法(详情见How to call extension method which has the same name as an existing method?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-09
              • 1970-01-01
              • 1970-01-01
              • 2018-07-27
              • 2010-11-23
              • 2016-05-23
              • 1970-01-01
              • 2018-01-10
              相关资源
              最近更新 更多