小数格式,而不四舍五入.NET(decimal formatting without roundin

2019-07-30 07:55发布

昨天我问这个问题,一般约小数和其内部精度。 以下是有关我试图解决方案的一个具体问题。

我有一个类型的SqlServer中柱 - 十进制(18,6)。 当我获取这些值,所创建的.NET小数匹配数据库的精确度。 他们是这样的:

1.100000
0.960000
0.939000
0.844400
0.912340

我需要根据这些规则来呈现(的ToString)这些值:

  • 非零始终显示。
  • 尾随第n小数位或之前的零显示。
  • 第n个小数点后尾随零不显示。

所以,这就是我想要的东西,当n为3:

1.100
0.960
0.939
0.8444
0.91234

现在,我已经写了一些代码的ToString的小数 - 删除所有尾随零,然后分析寻找一个小数点的字符串和计数小数号码,看看有尾随零需要多少被重新添加。 有没有更好的方式来做到这一点?

另外,我知道我在说上面的问题的ToString ......但如果我可以修改他们的方式在小数我的数据访问层,这样,消费者总是用正确的精度小数,这将是更好的。 是否有可能不字符串操作执行上的小数本身这个操作?

Answer 1:

为了输出具有n = 3你需要的格式,你可以使用:

number.ToString("0.000###")

当n为参数,那么你可以建立一个自定义字符串格式:

string format = "0." + new string('0', n) + new string('#', 6 - n);
s = number.ToString(format);


Answer 2:

您应该能够通过格式化值这样做:

var str = num.ToString("#0.000#####");

的数目0小号确定的最小位数,和的数目0小号加# S的位的最大数目。 我不知道,如果你真的想最大的,但我相信这是你会得到最接近的一次。 你当然可以只将其设置为任意(大)数量。



Answer 3:

任何你能在小数做本身不会对至少下列原因是不够的:你不能在一个十进制数本身要X领先的存储/尾随零的值转换为字符串进行打印。 在.NET十进制数据类型仅仅是由128位的值类型,所有专用于代表数字。 约当包括印在数字格式没有任何信息,而事实上,这是一个价值型允许其作为栈,这也是对GC浮雕上的争论迅速传递。
你可以换十进制到一些类,生成该类的实例在你的DAL,如果你需要做一些数字后面的应用运算返回这些的集合,如果这不是你可以简单地套用“字符串化”的情况下,你DAL并返回字符串的集合。



文章来源: decimal formatting without rounding .net