如何将ruby BigDecimal转换为2位小数字符串?

时间:2014-07-22 16:06:09

标签: ruby

我想将Ruby BigDecimal对象转换为漂亮的可打印货币值。所以我想把它打印到2位小数。我该怎么办?

如您所见,以下方法均无效:

irb(main):033:0> v = BigDecimal("7.1762")
=> #<BigDecimal:7fe97c1c9310,'0.71762E1',18(18)>
irb(main):034:0> v.to_s('2F')
=> "7.17 62"
irb(main):035:0> v.to_s('F')
=> "7.1762"
irb(main):036:0> v.to_s('%0.2F')
=> "0.71762E1"
irb(main):037:0> v.to_s('%0.2f')
=> "0.71762E1"
irb(main):038:0>

哪个表达式只生成字符串7.17?

2 个答案:

答案 0 :(得分:14)

如果没有舍入,并且未转换为Float,请使用BigDecimal#truncate

v = BigDecimal("7.1762")
v.truncate(2).to_s('F')
# => "7.17"

如果您需要显示尾随零,则会变得更复杂:

v = BigDecimal("4.1")
v.truncate.to_s + '.' + sprintf('%02d', (v.frac * 100).truncate)
# => "4.10"

使用truncate转换为整数,始终精确(并且没有舍入)。

答案 1 :(得分:3)

没有round

的舍入
v = BigDecimal("7.1762")
sprintf("%.2f", v)
# => "7.18"

v = BigDecimal("4.1")
sprintf("%.2f", v)
# => "4.10"

如果要将其截断为2位小数

v = BigDecimal("7.1762")
sprintf("%.2f", v.truncate(2))
# => "7.17"

v = BigDecimal("4.1")
sprintf("%.2f", v.truncate(2))
# => "4.10"