350 Stimmen

Was ist die beste Methode für den Umgang mit Geld?

Ich arbeite an einem sehr einfachen Einkaufswagen-System.

Ich habe eine Tabelle items die eine Spalte hat price vom Typ integer .

Ich habe Probleme, den Preiswert in meinen Ansichten für Preise anzuzeigen, die sowohl Euro als auch Cent enthalten. Übersehe ich etwas Offensichtliches in Bezug auf die Handhabung von Währungen im Rails-Framework?

9voto

Troggy Punkte 885

Utilice Geldregen-Perle . Es behandelt Geld und Währungen in Ihrem Modell und hat auch eine Reihe von Helfern, um Ihre Preise zu formatieren.

5voto

Thomas Klemm Punkte 10370

Verwendung von Virtuelle Attribute (Link zum überarbeiteten (kostenpflichtigen) Railscast) können Sie Ihren Preis_in_Cents in einer Integer-Spalte speichern und ein virtuelles Attribut price_in_dollars in Ihrem Produktmodell als Getter und Setter hinzufügen.

# Add a price_in_cents integer column
$ rails g migration add_price_in_cents_to_products price_in_cents:integer

# Use virtual attributes in your Product model
# app/models/product.rb

def price_in_dollars
  price_in_cents.to_d/100 if price_in_cents
end

def price_in_dollars=(dollars)
  self.price_in_cents = dollars.to_d*100 if dollars.present?
end

Quelle: RailsCasts #016: Virtuelle Attribute : Virtuelle Attribute sind eine saubere Möglichkeit, Formularfelder hinzuzufügen, die nicht direkt mit der Datenbank verknüpft sind. Hier zeige ich, wie man Validierungen, Assoziationen und mehr behandelt.

3voto

moot Punkte 31

Eindeutig Ganzzahlen .

Und auch wenn BigDecimal technisch gesehen existiert 1.5 ergibt in Ruby immer noch ein reines Float.

3voto

Becca Royal-Gordon Punkte 17031

Meine zugrundeliegenden APIs verwendeten alle Cents zur Darstellung von Geld, und das wollte ich nicht ändern. Außerdem arbeitete ich nicht mit großen Geldbeträgen. Also habe ich dies einfach in eine Hilfsmethode eingebaut:

sprintf("%03d", amount).insert(-3, ".")

Das konvertiert die Ganzzahl in eine Zeichenkette mit mindestens drei Ziffern (und fügt bei Bedarf führende Nullen hinzu), fügt dann einen Dezimalpunkt vor den letzten beiden Ziffern ein und verwendet niemals eine Float . Von dort aus können Sie alle Währungssymbole hinzufügen, die für Ihren Anwendungsfall geeignet sind.

Es ist definitiv schnell und schmutzig, aber manchmal ist das genau richtig!

2voto

jethroo Punkte 2058

Wenn

add_column :products, :price, "decimal(8,2)"

s

(

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X