1

昨天我问了这个关于小数及其内部精度的一般性问题。这是关于我要解决的场景的具体问题。

我在 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 ......但如果我可以在离开我的数据访问层时修改小数,这样消费者总是能以适当的精度获得小数,那就更好了。是否可以在没有字符串操作的情况下对小数本身执行此操作?

4

3 回答 3

9

要使用 n=3 输出所需的格式,您可以使用:

number.ToString("0.000###")

使用 n 作为参数,您可以构建自定义字符串格式:

string format = "0." + new string('0', n) + new string('#', 6 - n);
s = number.ToString(format);
于 2009-07-16T15:01:11.747 回答
3

您应该能够通过格式化值来做到这一点:

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

s的个数0决定了最小位数,s 的个数0加上#s 决定了最大位数。我不确定你是否真的想要最大值,但我相信这是你能得到的最接近的值。您当然可以将其设置为任意(大)数字。

于 2009-07-16T15:06:36.417 回答
-1

至少由于以下原因,您可以对小数本身执行的任何操作都不够:您无法在十进制数中存储您希望在将值转换为字符串时打印 x 个前导/尾随零。.NET 中的十进制数据类型只是一个由 128 位组成的值类型,都专用于表示数字。没有包含有关打印数字时的格式化信息,并且它是一个值类型这一事实允许它作为参数快速传递到堆栈上,这也是 GC 的一种解脱。
您可以将十进制包装到某个类中,在您的 DAL 中生成该类的实例并返回这些实例的集合,如果您需要稍后在应用程序中进行一些数字运算,如果不是这种情况,您可以简单地在您的DAL 并返回一个字符串集合。

于 2009-07-16T15:06:02.330 回答