我的数据库中有一个十进制数据类型,精度为(18,8),即使它的值只是14.765,当我使用Response.Write将其值返回到网页时,它仍会显示为14.76500000。
是否可以覆盖其默认的ToString方法以#,###,##0.########
格式返回数字,以便它只显示相关的小数位?
更新
我假设在<%= item.price %>
(其中item.price
是一个数字)的页面上输出一个数字时,是否正在调用该数字的ToString方法?
我试图通过以某种方式默认ToString()格式来避免更改显示值的每个实例。
答案 0 :(得分:6)
您不想覆盖ToString()
,要拨打ToString()
并指定IFormatProvider
或formatting String
答案 1 :(得分:3)
您无法覆盖十进制类型的ToString,因为它是 struct 。
但您可以使用扩展方法:
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);
答案 2 :(得分:2)
我遇到了和你一样的问题。人们希望在整个应用程序中以疯狂的自定义方式格式化小数。
我的第一个想法是在Decimal周围创建一个包装器并覆盖ToString()方法。
虽然您不能从Decimal继承,但您可以创建一个隐式转换为Decimal的类型。
这会在Decimal前面创建一个外观,并为您提供编写自定义格式逻辑的位置。
以下是我可能的解决方案,让我知道这是否有效或者这是一个可怕的想法。
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();
答案 3 :(得分:0)