Ich arbeite an einem sehr einfachen Warenkorbsystem.
Ich habe eine Tabelle items
mit einer Spalte price
vom Typ integer
.
Ich habe Probleme, den Preiswert in meinen Ansichten für Preise anzuzeigen, die sowohl Euro als auch Cent enthalten. Vermisse ich etwas Offensichtliches in Bezug auf den Umgang mit Währungen im Rails-Framework?
ruby-on-rails
ruby
currency
Barry Gallagher
quelle
quelle
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.Antworten:
Sie möchten wahrscheinlich einen
DECIMAL
Typ in Ihrer Datenbank verwenden. Gehen Sie bei Ihrer Migration folgendermaßen vor:In Rails wird der
:decimal
Typ als zurückgegebenBigDecimal
, was sich hervorragend für die Preisberechnung eignet.Wenn Sie darauf bestehen, Ganzzahlen zu verwenden, müssen Sie
BigDecimal
überall manuell von und nach s konvertieren , was wahrscheinlich nur zu einem Problem wird.Verwenden Sie zum Drucken des Preises: mcl:
quelle
Hier ist ein feiner, einfacher Ansatz, der
composed_of
(Teil von ActiveRecord, unter Verwendung des ValueObject-Musters) und das Geld-Juwel nutztDu brauchst
Product
integer
Zum Beispiel eine Spalte in Ihrem Modell (und Ihrer Datenbank):price
Schreiben Sie dies in Ihre
product.rb
Datei:Was Sie bekommen:
product.price = "$12.00"
konvertiert automatisch in die Money-Klasseproduct.price.to_s
zeigt eine dezimal formatierte Zahl an ("1234.00")product.price.format
Zeigt eine ordnungsgemäß formatierte Zeichenfolge für die Währung anproduct.price.cents.to_s
quelle
composed_of
hier werden weitere Details dazu sowie eine alternative Implementierung angegeben.Für den Umgang mit Währungen ist es üblich, einen Dezimaltyp zu verwenden. Hier ist ein einfaches Beispiel aus "Agile Webentwicklung mit Schienen"
Auf diese Weise können Sie Preise von -999.999,99 bis 999.999,99 verarbeiten.
Möglicherweise möchten Sie auch eine Validierung in Ihre Artikel wie
um Ihre Werte zu überprüfen.
quelle
Wenn Sie Postgres verwenden (und seit wir 2017 sind), sollten Sie den Spaltentyp
:money
ausprobieren.quelle
Verwenden Sie Geldschienen Edelstein . Es handhabt Geld und Währungen in Ihrem Modell gut und hat auch eine Reihe von Helfern, um Ihre Preise zu formatieren.
quelle
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).Einige Punkte:
:decimal
wird verwendet, umBigDecimal
viele Probleme zu lösen.precision
undscale
sollte angepasst werden, je nachdem, was Sie darstellenWenn Sie mit dem Empfangen und Senden von Zahlungen arbeiten
precision: 8
undscale: 2
Ihnen999,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:
oder
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 vonActiveSupport
'sNumberHelper
, um auf den Helfer zuzugreifen.Zum Beispiel:
gibt die folgende Ausgabe
Ü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.
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).Und ein Beispiel, wie ich das
number_to_currency
Innere eines Gegners verwende (beachten Sie dienegative_format
Option, die zur Darstellung von Rückerstattungen verwendet wird)quelle
Mithilfe von virtuellen Attributen (Link zu überarbeitetem (bezahltem) Railscast) können Sie Ihre price_in_cents in einer Ganzzahlspalte speichern und Ihrem Produktmodell ein virtuelles Attribut price_in_dollars als Getter und Setter hinzufügen.
Quelle: RailsCasts # 016: Virtuelle Attribute : Virtuelle Attribute sind eine saubere Möglichkeit, Formularfelder hinzuzufügen, die nicht direkt der Datenbank zugeordnet sind. Hier zeige ich, wie man mit Validierungen, Assoziationen und mehr umgeht.
quelle
Auf jeden Fall ganze Zahlen .
Und obwohl BigDecimal technisch vorhanden
1.5
ist, erhalten Sie dennoch einen reinen Float in Ruby.quelle
Wenn jemand Sequel verwendet, sieht die Migration folgendermaßen aus:
irgendwie ignoriert Sequel: Präzision und: Skalierung
(Fortsetzung Version: Fortsetzung (3.39.0, 3.38.0))
quelle
Meine zugrunde liegenden APIs verwendeten alle Cent, um Geld darzustellen, und das wollte ich nicht ändern. Ich habe auch nicht mit großen Geldbeträgen gearbeitet. Also habe ich dies einfach in eine Hilfsmethode eingefügt:
Dadurch wird die Ganzzahl in eine Zeichenfolge mit mindestens drei Ziffern konvertiert (ggf. werden führende Nullen hinzugefügt). Anschließend wird vor den letzten beiden Ziffern ein Dezimalpunkt eingefügt, wobei niemals a verwendet wird
Float
. Von dort aus können Sie die für Ihren Anwendungsfall geeigneten Währungssymbole hinzufügen.Es ist definitiv schnell und schmutzig, aber manchmal ist das in Ordnung!
quelle
Ich benutze es auf diese Weise:
Natürlich hängt das Währungssymbol, die Genauigkeit, das Format usw. von jeder Währung ab.
quelle
Sie können einige Optionen an
number_to_currency
(einen Standard-Rails 4-Ansichtshelfer) übergeben:Wie von Dylan Markow gepostet
quelle
Einfacher Code für Ruby & Rails
quelle