覆盖十进制ToString()方法

本文关键字:方法 ToString 十进制 覆盖 | 更新日期: 2023-09-27 18:10:27

我的数据库中有一个精度为(18,8)的十进制数据类型,即使它的值只是14.765,当我使用Response时,它仍然会显示为14.76500000。写入将其值返回到网页中。

是否有可能重写其默认的ToString方法以#,###,##0.########格式返回数字,以便它只显示相关的小数点?

我假设当一个人在像<%= item.price %>(其中item.price是一个数字)的页面上输出数字时,该数字的ToString方法正在被调用?

我试图避免改变每一个实例,其中的值是通过默认的ToString()格式以某种方式显示。

覆盖十进制ToString()方法

您不想覆盖ToString(),您想调用ToString()并指定IFormatProvider或格式化字符串

不能重写十进制类型的ToString,因为它是结构体

但是您可以使用扩展方法来这样做:

public static class DecimalExtensions
{
      public static string ToString(this decimal some, bool compactFormat)
      {
            if(compactFormat) 
            {
                return some.ToString("#,###,##0.########");
            }
            else
            {
                return some.ToString();
            }
      }
}

现在你可以这样写:

string compactedDecimalText = 16.38393m.ToString(true);

我遇到了和你一样的问题。人们希望在整个应用程序中以疯狂的自定义方式格式化小数。

我的第一个想法是在Decimal周围创建一个包装器并覆盖ToString()方法。

虽然不能从Decimal继承,但可以创建一个隐式地转换为Decimal或从Decimal转换的类型。

这会在Decimal前面创建一个facade,并为您提供一个地方来编写自定义格式化逻辑。

下面是我可能的解决方案,让我知道这是有效的还是这是一个可怕的想法。

public struct Recimal
{
    private decimal _val;
    public Recimal(decimal d) { _val = d; }
    public static implicit operator Recimal(decimal d)
    {
        return new Recimal(d);
    }
    public static implicit operator Decimal(Recimal d)
    {
        return d._val;
    }
    public override string ToString()
    {
        //if negative, show the minus sign to the right of the number
        if (_val < 0)
            return String.Format("{0:0.00;0.00-;}", _val);
        return _val.ToString();
    }
}

它的工作原理就像小数:

        Decimal d = 5;
        Recimal r = -10M;
        Recimal result = r + d;
        //result: 5.00-
        textBox1.Text = result.ToString();

为什么不在double上直接使用string.Format()呢?

以下是一些格式选项的参考:

  • 格式双
  • MSDN数字格式