【问题标题】:BigDecimal to Currency with -0.0BigDecimal 为 -0.0 的货币
【发布时间】: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


【解决方案1】:

之所以如此,是因为将数字转换为要显示的字符串。并且:

# 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

【讨论】:

  • 这太棒了。谢谢你。你证实了我的很多想法,让我的支票变得更好。并且 .to_d 不是必需的。我将尝试调查这些 BigDecimal 是如何存储在数据库中的,希望我可以避免存储 -0。这样就完全不需要检查了。
  • 它被正确存储为 0.0,但如果交易类型为“CREDIT”,则其中一个模型应用 *-1。我在方法中添加了一个检查,首先查看它是否为 .zero?我所有的“$-0.00”现在都不见了:)
  • 当使用modified_number_to_currency时,最好保留options = {}的默认选项,否则当没有选项时可能会遇到麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多