使用-0.0将BigDecimal转换为货币

时间:2014-12-19 15:43:57

标签: ruby-on-rails ruby bigdecimal zero number-to-currency

我正在处理一个网站的报告,我目前正在考虑处理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上的某些东西来处理我没有找到的情况。

1 个答案:

答案 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