我正在处理一个网站的报告,我目前正在考虑处理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 :(得分:2)
之所以如此,是因为该数字被转换为要显示的字符串。和
# to_d converts to BigDecimal, just FYI
"-0".to_d.to_s #=> "-0.0"
因此你必须自己做一个0。但是符号检查是多余的 - 与0的简单比较就可以解决问题:
bdn = "-0".to_d # or BigDecimal.new("-0")
value = bdn.zero? ? 0 : bdn
number_to_currency(value, other_options)
但是,您不希望在您调用number_to_currency
的任何地方手动添加此项检查。在ApplicationHelper中创建自己的modified_number_to_currency
方法会更方便,如下所示:
def modified_number_to_currency( number, options )
value = number.zero? ? 0 : number
number_to_currency(value, options)
end
然后使用modified_number_to_currency
代替number_to_currency
。
或者,您可以覆盖number_to_currency
并最后调用super
。那可能也可以,但我不是100%肯定。
具体来看你的支票:
amount *= -1 if amount == 0 && amount.sign == -1
应该只是:
amount = 0.to_d if amount.zero? # the to_d might or might not be required