Nur ein kleines Update und eine Zusammenführung aller Antworten für einige aufstrebende Junioren/Anfänger in der RoR-Entwicklung, die sicherlich hierher kommen werden, um einige Erklärungen zu erhalten.
Arbeiten mit Geld
Utilice :decimal
um Geld in der DB zu speichern, wie @molf vorschlug (und was meine Firma als goldenen Standard bei der 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 wenige Punkte:
-
:decimal
wird verwendet als BigDecimal
was eine Menge Probleme löst.
-
precision
y scale
sollte angepasst werden, je nachdem, was Sie darstellen wollen
-
Wenn Sie mit dem Empfang und Versand von Zahlungen arbeiten, precision: 8
y scale: 2
gibt Ihnen 999,999.99
als den höchsten Betrag, was in 90 % der Fälle in Ordnung ist.
-
Wenn Sie den Wert einer Immobilie oder eines seltenen Autos darstellen müssen, sollten Sie einen höheren precision
.
-
Wenn Sie mit Koordinaten (Längen- und Breitengrad) arbeiten, benötigen Sie sicherlich eine höhere scale
.
Wie man eine Migration erstellt
Um die Migration mit dem oben genannten Inhalt zu erstellen, führen Sie den Vorgang im Terminal aus:
bin/rails g migration AddPriceToItems price:decimal{8-2}
oder
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
wie in diesem Artikel erklärt ブログ Posten.
Formatierung der Währung
KISS die zusätzlichen Bibliotheken zu verabschieden und eingebaute Hilfsmittel zu verwenden. verwenden number_to_currency
wie von @molf und @facundofarias vorgeschlagen.
Zum Spielen mit number_to_currency
Helper in der Rails-Konsole einen Aufruf an die ActiveSupport
's NumberHelper
Klasse, um auf den Helfer zugreifen zu können.
Zum Beispiel:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
ergibt die folgende Ausgabe
2500000,61€
Prüfen Sie die anderen options
von nummer_zu_währung Helfer.
Wohin damit?
Sie können es in eine Anwendungshilfe einfügen und innerhalb von Ansichten für jeden Betrag verwenden.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Oder Sie können es in den Item
Modell als Instanzmethode und rufen Sie es dort auf, wo Sie den Preis formatieren müssen (in Ansichten oder Hilfsfunktionen).
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 die number_to_currency
innerhalb eines Controler (beachten Sie die negative_format
Option, die zur Darstellung von Erstattungen verwendet wird)
def refund_information
amount_formatted =
ActionController::Base.helpers.number_to_currency(@refund.amount, negative_format: '(%u%n)')
{
# ...
amount_formatted: amount_formatted,
# ...
}
end