Tylko niewielka aktualizacja i spójność wszystkich odpowiedzi dla niektórych początkujących juniorów / początkujących w rozwoju RoR, które z pewnością pojawią się tutaj po kilka wyjaśnień.
Praca z pieniędzmi
Służy :decimal
do przechowywania pieniędzy w DB, jak sugerował @molf (i co moja firma stosuje jako złoty standard podczas pracy z pieniędzmi).
# 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
Kilka punktów:
:decimal
będzie używany jako BigDecimal
rozwiązanie wielu problemów.
precision
i scale
należy je dostosować, w zależności od tego, co reprezentujesz
Jeśli pracujesz z otrzymywaniem i wysyłaniem płatności, precision: 8
a scale: 2
otrzymasz 999,999.99
najwyższą kwotę, co jest w porządku w 90% przypadków.
Jeśli chcesz przedstawić wartość nieruchomości lub rzadkiego samochodu, powinieneś użyć wyższej precision
.
Jeśli pracujesz ze współrzędnymi (długość i szerokość geograficzną), na pewno będziesz potrzebować wyższej scale
.
Jak wygenerować migrację
Aby wygenerować migrację z powyższą zawartością, uruchom terminal:
bin/rails g migration AddPriceToItems price:decimal{8-2}
lub
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
jak wyjaśniono w tym poście na blogu .
Formatowanie walut
POCZUJ dodatkowe biblioteki i pożegnaj się z wbudowanymi pomocnikami. Użyj number_to_currency
jako @molf i @facundofarias.
Grać z number_to_currency
pomocnika w konsoli Rails, wysłać wezwanie do ActiveSupport
„s NumberHelper
klasy w celu uzyskania dostępu do pomocnika.
Na przykład:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
daje następujący wynik
2500000,61€
Sprawdź inne options
od number_to_currency pomocnika.
Gdzie to położyć
Możesz umieścić go w pomocniku aplikacji i używać go w widokach dla dowolnej kwoty.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Możesz też umieścić go w Item
modelu jako metodę instancji i nazwać go tam, gdzie musisz sformatować cenę (w widokach lub pomocnikach).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
I przykład, w jaki sposób korzystam z number_to_currency
wewnątrz kontrolera (zwróć uwagę na negative_format
opcję, służącą do przedstawienia refundacji)
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)
jest popularnym wyborem sprawdź to również sprawdź tutaj Formaty waluty światowej, aby zdecydować, ile miejsc po przecinku użyć, nadzieja pomaga.