2010-07-23 91 views
1

儘管我們的應用程序使用了number_to_currency(value, :precision => 2)。但是,現在我們有一個要求,其值可能需要顯示到三位或更多的小數位,例如,根據十進制值在number_to_currency中使用動態精度值

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

在我們當前的實現,第三個例子呈現爲:

0.005 => "0.01" 

什麼是最好的方法,我在這裏走? number_to_currency可以爲我工作嗎?如果不是,我該如何確定給定浮點值應該顯示多少個小數位? sprintf("%g", value)接近,但我無法弄清楚如何使它總是至少承認2dp。

回答

4

由於精度問題,以下方法不適用於正常的浮點數,但如果您使用的是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