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