2010-07-23 1 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) подходит к концу, но я не могу понять, как сделать так, чтобы он всегда выполнял минимум 2 дп.

ответ

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 
Смежные вопросы