【发布时间】:2014-12-19 15:43:56
【问题描述】:
我正在为一个网站编写报告,我目前正在考虑处理 BigDecimal -0.0 的最佳方法。
我正在使用的数据库有很多。当这些-0.0 通过number_to_currency() 时,我得到“$-0.00”。我的负数格式实际上是“-$x.xx”,所以请注意 number_to_currency 没有将其格式化为负数(否则美元符号前也会有一个负号),但由于某种原因,负数符号与 0 一起被翻译。
现在我的解决方案是每次从数据库中获取金额时都这样做:
amount *= -1 if amount == 0 && amount.sign == -1
这会将 -0.0 更改为 0.0。这很简单,但我不禁想知道是否有更好的解决方案,或者 BigDecimals 或 number_to_currency 上的东西来处理我只是找不到的这种情况。
【问题讨论】:
-
您在进行什么计算以将 $-0.0 存储在数据库中?当我做
(BigDecimal.new("50.00") + BigDecimal.new("-50.00")).zero?我得到true -
@Anthony - 我不知道 -0.0 是如何存储在数据库中的。我正在使用一个不是我创建的数据库,我的下一步将是对此进行调查。如果我可以避免存储它,它将为我节省很多工作。否则,Syed 给了我一个相当彻底的答案和更好的方法来编写我的解决方案。
-
如果您有任何意见,我会与团队交谈,编写迁移以将数据库中的所有 -0.0 转换为 0.0,然后不必担心任何视图逻辑。显然,这也需要您将其正确存储在数据库中。
-
@Anthony - 它被正确存储为 0.0,但如果交易类型为“CREDIT”,则其中一个模型应用 *-1。我在方法中添加了一个检查,首先查看它是否为 .zero?我所有的“$-0.00”现在都不见了:)
标签: ruby-on-rails ruby bigdecimal zero number-to-currency