Rails 3. Как явно округлить число до двух десятичных знаков в модели?

Возможный дубликат:
Rails 3. Как отображать два десятичных знака в форме редактирования?

Я знаю, что я могу использовать sprintf для ограничения двух десятичных знаков.

Когда я переоцениваю цены в форме или просто в таблице, иногда я получаю 80 вместо 80.00. Не было бы лучше просто сохранить цену с двумя десятичными знаками с самого момента, когда цена будет введена в базу данных? Таким образом, всякий раз, когда он отображается, он ВСЕГДА показывает два десятичных знака. Если да, то как?

Ответы

Ответ 1

Вам следует попробовать использовать поле базы данных :decimal, а :scale - 2

Чтобы добавить десятичный столбец в новую таблицу,

create_table :my_table do |t|
  t.decimal :my_column, :scale => 2
end

Чтобы добавить столбец в существующую таблицу,

add_column :my_table, :my_column, :decimal, :scale => 2

Разумно иметь предикаты, поскольку в какой-то базе данных нет прецедентов по умолчанию. Например postgresql:

 add_column :my_table, my_column, precision: 30, scale: 2

Ответ 2

Вы можете просто использовать x.round(2) при отображении номера, который всегда будет отображать два десятичных знака. Обычно рекомендуется хранить цены как целые числа в базе данных бэкэнда, потому что они обрабатываются лучше, когда вам нужен действительно высокий уровень точности. В этом случае, однако, вы можете пойти в любом случае.

Ответ 3

Если это a :float или :decimal, 80 и 80.00 в Ruby будут одинаковыми (как и 80.0000). Последний не "хранится" с большим количеством знаков после запятой, а конечные нули имеют смысл только в представлении. Вы можете использовать sprintf, как вы сказали, или можете использовать удобный помощник number_with_precision Rails:

<%= number_with_precision price, :precision => 2 %>

Здесь другой вопрос SO на эту тему, кстати. @Matthew Rudy прав насчет одной вещи: за колоды денег вы должны использовать :decimal.

Если вы действительно хотите не иметь этого в своем представлении, вы можете использовать что-то вроде Draper, чтобы применить декораторов к вашему атрибуты (которые просто переведут ваш вызов number_with_precision в сторону и в новый класс Decorator), но в этом случае он, вероятно, переполнится.

Ответ 4

Для этого я использую formater number_to_currency. Поскольку я нахожусь в США, по умолчанию работа для меня прекрасна.

<% price = 45.9999 %>
<price><%= number_to_currency(price)%></price>
=> <price>$45.99</price>

Вы также можете передать опции, если по умолчанию не работают для вас. Документация по доступным параметрам на api.rubyonrails.org