Просто небольшое обновление и сплоченность всех ответов для некоторых начинающих юниоров / новичков в развитии RoR, которые обязательно придут сюда для некоторых объяснений.
Работа с деньгами
Используйте :decimalдля хранения денег в БД, как предложил @molf (и что моя компания использует как золотой стандарт при работе с деньгами).
# precision is the total number of digits
# scale is the number of digits to the right of the decimal point
add_column :items, :price, :decimal, precision: 8, scale: 2
Несколько баллов:
:decimalбудет использоваться в BigDecimalкачестве решения многих проблем.
precisionи scaleдолжны быть скорректированы, в зависимости от того, что вы представляете
Если вы работаете с получением и отправкой платежей, precision: 8и scale: 2вы получаете 999,999.99максимальную сумму, что хорошо в 90% случаев.
Если вам нужно представить стоимость имущества или редкого автомобиля, вы должны использовать более высокую precision.
Если вы работаете с координатами (долгота и широта), вам, безусловно, понадобится больше scale.
Как создать миграцию
Чтобы сгенерировать миграцию с указанным выше содержимым, запустите в терминале:
bin/rails g migration AddPriceToItems price:decimal{8-2}
или
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
как объяснено в этом блоге .
Форматирование валюты
ПОЦЕЛУЙТЕ лишние библиотеки до свидания и используйте встроенные помощники. использованиеnumber_to_currency как предложено @molf и @facundofarias.
Для того, чтобы играть с number_to_currencyпомощником в консоли Rails, послать вызов к ActiveSupport-еNumberHelper класса для доступа помощника.
Например:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
дает следующий вывод
2500000,61€
Проверьте другой optionsиз number_to_currency помощника.
Где его поставить
Вы можете поместить его в помощник приложения и использовать его внутри представлений на любую сумму.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Или вы можете поместить его в Itemмодель как метод экземпляра и вызывать его там, где вам нужно отформатировать цену (в представлениях или помощниках).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
И пример того, как я использую number_to_currencyвнутренний контроллер (обратите внимание на negative_formatопцию, которая используется для представления возвратов)
def refund_information
amount_formatted =
ActionController::Base.helpers.number_to_currency(@refund.amount, negative_format: '(%u%n)')
{
# ...
amount_formatted: amount_formatted,
# ...
}
end
DECIMAL(19, 4)является популярным выбор проверить это также проверить здесь мировую валюту форматов , чтобы решить , сколько знаков после запятой для использования, надежда помогает.