2010-07-23 6 views
1

Bien que notre application utilise number_to_currency(value, :precision => 2). Cependant, nous avons maintenant une exigence selon laquelle la valeur peut nécessiter un affichage à trois décimales ou plus, par ex.Utilisation d'une valeur de précision dynamique dans number_to_currency en fonction de la valeur décimale

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

Dans notre implémentation actuelle, le troisième exemple Rendu:

0.005 => "0.01" 

Quelle est la meilleure approche pour moi de prendre ici? Est-ce que number_to_currency peut être fait pour travailler pour moi? Si non, comment déterminer combien de décimales une valeur de virgule flottante doit-elle être affichée? sprintf("%g", value) vient près, mais je ne peux pas comprendre comment le faire toujours respecter un minimum de 2dp.

Répondre

4

Ce qui suit ne fonctionnera pas avec les flottants normaux, en raison de problèmes de précision, mais si vous utilisez BigDecimal cela devrait fonctionner correctement.

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 
Questions connexes