根据十进制值在number_to_currency中使用动态精度值

虽然我们的应用程序使用number_to_currency(value, :precision => 2) 。 但是,我们现在有一个要求,即值可能需要显示三个或更多小数位,例如

 0.01 => "0.01" 10 => "10.00" 0.005 => "0.005" 

在我们当前的实现中,第三个示例呈现为:

 0.005 => "0.01" 

我最好的方法是什么? 可以使用number_to_currency为我工作吗? 如果没有,我如何确定给定浮点值应显示多少个小数位? sprintf("%g", value)接近,但我无法弄清楚如何使它始终尊重至少2dp。

由于精度问题,以下内容不适用于普通浮点数,但如果您使用的是BigDecimal它应该可以正常工作。

 def variable_precision_currency(num, min_precision) prec = (num - num.floor).to_s.length - 2 prec = min_precision if prec < min_precision number_to_currency(num, :precision => prec) end ruby-1.8.7-p248 > include ActionView::Helpers ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("10"), 2) $10.00 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("0"), 2) $0.00 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("12.45"), 2) $12.45 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("12.045"), 2) $12.045 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("12.0075"), 2) $12.0075 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("-10"), 2) $-10.00 ruby-1.8.7-p248 > puts variable_precision_currency(BigDecimal.new("-12.00075"), 2) $-12.00075