Лише невелике оновлення та згуртованість усіх відповідей для деяких починаючих юніорів / початківців у розробці 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
«s 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)
це популярний вибір, перевірте це, також перевірте тут Формати світової валюти, щоб визначити, скільки десяткових знаків використовувати, надію, допоможе.