2009-04-13 15 views
4

Ich speichere eine Kosten in meiner Anwendung. Die Kosten sind nicht in der Datenbank formatiert. Zum Beispiel: 00.00 speichert als 0, 1.00 speichert als 1 und 40.50 speichert als 40.5Wie konvertiere ich einen Dezimalwert in einen Stringwert für Dollar und Cent in Ruby?

Ich muss diese Werte aus der Datenbank lesen und sie in Zeichenfolgen für Dollar und Cent konvertieren. Zum Beispiel: 0 -> cost_dollars = "00" & cost_cents = "00", 1 -> cost_dollars = "01" & cost_cents = "00", 40.5 -> cost_dollars = "40" & cost_cents = "50" .

Gibt es einen einfachen Weg, dies in Rubin auf Schienen zu tun? Oder hat jemand Code, der das tut?

Danke!

Antwort

15

Sie können erreichen, dass mit diesem kleinen Stück Code in Ruby:

fmt = "%05.2f" % cost 
cost_dollars, cost_cents = fmt.split '.' 
+0

sehr nützlich, war mir bewusst sprintf aber nicht von dieser einfachen Verwendung für "%". –

+0

Im Formatbezeichner ('% 05.2f'), '0' bedeutet linkes Pad mit Nullen,' 5' bedeutet Padding, wenn die Zeichenkette weniger als 5 Zeichen hat (einschließlich des Dezimalpunkts), '.2' bedeutet genau zwei Zeichen nach dem Dezimalzeichen, 'f' bedeutet Gleitkommazahl. [Vollständige Spezifikation] (https://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm) – aidan

5

Anstatt als Dezimalzahl zu speichern, speichern Sie sie als ganze Cent-Zahl. So wird 1 Dollar als 100 in der Datenbank gespeichert.

Alternativ, wenn Sie etwas Leistung Aufwand nicht stören, nach '.' im Wert der Datenbank. Wenn es existiert, split auf '.' Und analysiere die Teile als ganze Zahlen.

2

sprintf ist dein Freund hier:

cost_dollars = sprintf('%02.f', cost) 
cost_cents = sprintf('%.2f', cost) 
+1

Dies funktioniert nicht; 'cost_dollars' wird gerundet (was nicht unbedingt das ist, was Sie wollen), und' cost_cents' enthält die Dollars zusätzlich zu den Cents. –

8

Wenn Sie versuchen, Dollar-Werte in einer Ansicht zu formatieren, Sie sollte in ActionView :: Helpers :: NumberHelper auf number_to_currency aussehen.

>> bd = BigDecimal.new "5.75" 
>> include ActionView::Helpers 
>> number_to_currency(bd) 
=> "$5.75" 

Für die Aufschlüsselung der Wert in separate Dollar und Cent, meine erste Frage wäre, "Warum?" Wenn Sie einen guten Grund haben und in Ihrer Datenbank mit Dezimalzahlen zu tun haben, können Sie Folgendes tun.

>> bd = BigDecimal.new "5.75" 
>> "dollars:#{bd.truncate} cents:#{bd.modulo(1) * BigDecimal.new('100')}" 
=> "dollars:5.0 cents:75.0" 
7

number_to_currency ist nett, aber es kann teuer werden; Vielleicht möchten Sie Ihre eigenen rollen, wenn Sie es viel anrufen müssen.

Sie sollten sich bewusst sein, dass Sie einen Gleitkommawert verwenden, um die Währung can be problematic (and see) zu speichern, wenn Sie viele Berechnungen basierend auf diesen Werten durchführen. Eine Lösung besteht darin, Ganzzahlen für Währung und Cent-Cent zu verwenden. Dies scheint der von der money plugin verwendete Ansatz zu sein. Eine andere Lösung ist es, eine decimal Art in der Migration zu verwenden, die für moderne Versionen von Rails out-of-the-Box funktionieren sollte (> 1.2):

add_column :items, :price, :decimal, :precision => 10, :scale => 2 

(:scale die Anzahl der Stellen hinter dem Komma ist, :precision ist die Gesamtzahl der Ziffern.) Dadurch erhalten Sie BigDecimal Objekte in Rails, die ein wenig schwieriger zu arbeiten sind, aber nicht zu schlecht.

Sowohl der Ganzzahl- als auch der Dezimal-Ansatz sind etwas langsamer als Fließkommawerte. Ich verwende Floats für die Währung an einigen Stellen, weil ich weiß, dass ich keine Berechnungen für die Werte in Rails durchführen muss, sondern sie nur speichern und anzeigen muss. Wenn Sie genaue Währungsberechnungen benötigen, sollten Sie keine Floats verwenden.

+0

ich benutze dezimal, danke – Tony

Verwandte Themen