Просто небольшое обновление и сплоченность всех ответов для некоторых начинающих юниоров / новичков в развитии 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)
является популярным выбор проверить это также проверить здесь мировую валюту форматов , чтобы решить , сколько знаков после запятой для использования, надежда помогает.