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 :decimal
diese 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:
:decimal
wird verwendet, um BigDecimal
viele Probleme zu lösen.
precision
und scale
sollte angepasst werden, je nachdem, was Sie darstellen
Wenn Sie mit dem Empfangen und Senden von Zahlungen arbeiten precision: 8
und scale: 2
Ihnen 999,999.99
den 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_currency
als @molf und @facundofarias vorgeschlagen.
Um mit dem number_to_currency
Helfer 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 options
von 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 Item
als 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_currency
Innere eines Gegners verwende (beachten Sie die negative_format
Option, 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.