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

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

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

irb(main):033:0> v = BigDecimal("7.1762") => # 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?

如果没有舍入,也没有转换为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转换为Integer,始终精确(并且没有舍入)。

圆形无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"