2016-02-03 10 views
2

Я использую значения BigDecimal в своем приложении, так как есть расчеты для товаров в корзине покупок, я читал, что для этого предпочтительнее BigDecimal, по сравнению с целыми числами или поплавками?Обработка BigDecimal завершающего ноля Ruby

Существует один сценарий, к которому я бы хотел обратиться. Когда у меня есть это, например

amount = BigDecimal.new("28.99") 
amount  #=> #<BigDecimal:51d3120,'0.2899E2',18(18)> 
amount.to_s #=> "28.99" 
amount.to_f #=> 28.99 

Который до сих пор ожидается поведение, но когда я делаю следующее

amount = BigDecimal.new("28.00") || amount = BigDecimal.new("28") 
amount.to_s #=> "28.0" 
amount.to_f #=> 28.0 

Является ли это предназначено поведение? В моей дб я установить масштаб и точность

t.decimal :price, precision: 30, scale: 2 

Когда у меня есть значение 28.00 сохраненной в базе данных я хотел бы показать, на мой взгляд 28.00 и не 28.0

Update

Просто пришел на этот пост на SO How to convert a ruby BigDecimal to a 2-decimal place string? решение будучи

v = BigDecimal("28.00") 
v.truncate.to_s + '.' + sprintf('%02d', (v.frac * 100).truncate) 

Я предполагаю, что это-я e единственный способ справиться с этим?

+0

Так что эти сеттеры ? 'to_s' и т. д. – Smar

+0

@Smar Я не уверен, что вы имеете в виду? каков твой вопрос? – Richlewis

+0

Для 'v = BigDecimal (" 28.00 ")' 'sprintf ("%. 2f ", v)' должен давать '28.00' – eugen

ответ

3

sprintf("%2.f", v) должно работать. Опции для sprintf можно найти на

http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-sprintf

Кроме того, если вы используете Rails, то number_with_precision помощник, наверное, проще в использовании - вы можете найти в документации на http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision

+0

'number_with_precision' :-) – Richlewis

+1

@ Richlewis для сумм, также есть ['number_to_currenc'] (http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_currency), и вы должны проверить [money-rails] (https : //github.com/RubyMoney/money-rails) – Stefan

Смежные вопросы