处理BigDecimal尾随零的Ruby

时间:2016-02-03 09:37:57

标签: ruby-on-rails ruby

我在我的应用中使用了BigDecimal值,因为要对购物车中的商品进行计算,我读到BigDecimal是首选,与整数或浮点数相比?< / p>

我想谈一个场景。当我有这个例子时

amount = BigDecimal.new("28.99")
amount      #=> #<BigDecimal:51d3120,'0.2899E2',18(18)>
amount.to_s #=> "28.99"
amount.to_f #=> 28.99

到目前为止,这是预期的行为,但是当我执行以下操作时

amount = BigDecimal.new("28.00") || amount = BigDecimal.new("28") 
amount.to_s #=> "28.0"
amount.to_f #=> 28.0

这是预期的行为吗?在我的数据库中,我设置了比例和精度

t.decimal :price, precision: 30, scale: 2

当我在数据库中保存28.00的值时,我希望在我的视图中显示28.00而不是28.0

更新

刚刚在SO How to convert a ruby BigDecimal to a 2-decimal place string?上发布了这个解决方案

的帖子
v = BigDecimal("28.00")
v.truncate.to_s + '.' + sprintf('%02d', (v.frac * 100).truncate)

我想这是处理它的唯一方法吗?

1 个答案:

答案 0 :(得分:3)

sprintf("%2.f", v)应该有效。 sprintf的选项可在

找到

http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-sprintf

此外,如果您使用Rails,number_with_precision帮助程序可能更容易使用 - 您可以在http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision找到文档