Nur ein kleines Update und ein Zusammenhalt aller Antworten für einige aufstrebende Junioren / Anfänger in der RoR-Entwicklung, die sicherlich hier für einige Erklärungen kommen werden.
Mit Geld arbeiten
Verwenden Sie :decimaldiese Option, um Geld in der Datenbank zu speichern, wie @molf vorgeschlagen hat (und was mein Unternehmen als goldenen Standard für die Arbeit mit Geld verwendet).
# 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
Einige Punkte:
:decimalwird verwendet, um BigDecimalviele Probleme zu lösen.
precisionund scalesollte angepasst werden, je nachdem, was Sie darstellen
Wenn Sie mit dem Empfangen und Senden von Zahlungen arbeiten precision: 8und scale: 2Ihnen 999,999.99den höchsten Betrag geben, ist dies in 90% der Fälle in Ordnung.
Wenn Sie den Wert einer Immobilie oder eines seltenen Autos darstellen müssen, sollten Sie einen höheren Wert verwenden precision.
Wenn Sie mit Koordinaten (Längen- und Breitengrad) arbeiten, benötigen Sie sicherlich einen höheren scale.
So generieren Sie eine Migration
Führen Sie im Terminal Folgendes aus, um die Migration mit dem oben genannten Inhalt zu generieren:
bin/rails g migration AddPriceToItems price:decimal{8-2}
oder
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
wie in diesem Blogbeitrag erklärt .
Währungsformatierung
KÜSSEN Sie die zusätzlichen Bibliotheken zum Abschied und verwenden Sie integrierte Helfer. Verwendung number_to_currencyals @molf und @facundofarias vorgeschlagen.
Um mit dem number_to_currencyHelfer in der Rails-Konsole zu spielen, senden Sie einen Anruf an die Klasse von ActiveSupport's NumberHelper, um auf den Helfer zuzugreifen.
Zum Beispiel:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
gibt die folgende Ausgabe
2500000,61€
Überprüfen Sie den anderen Helfer optionsvon number_to_currency .
Wo soll ich es hinstellen?
Sie können es in einen Anwendungshelfer einfügen und für einen beliebigen Betrag in Ansichten verwenden.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Sie können es auch Itemals Instanzmethode in das Modell einfügen und dort aufrufen, wo Sie den Preis formatieren müssen (in Ansichten oder Hilfsprogrammen).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Und ein Beispiel, wie ich das number_to_currencyInnere eines Gegners verwende (beachten Sie die negative_formatOption, die zur Darstellung von Rückerstattungen verwendet wird)
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)ist dies eine beliebte Option. Überprüfen Sie dies auch hier. Weltwährungsformate, um zu entscheiden, wie viele Dezimalstellen verwendet werden sollen. Hoffnung hilft.