ruby gem of the week 2007/23

10 06 2007

Money

Installation:

gem install money

Einbinden mit

require ‚rubygems‘
require ‚money‘

Wir legen uns als erstes drei Money-Objekte an:

us = Money.us_dollar(100_00)
cd = Money.ca_dollar(150_00)
eu = Money.euro(200_00)

Eines in der Waehrung US-Dollar, kanadische Dollar und eines in Euro.
Hierbei ist zu beachten, dass der Betrag in Cent angegeben werden muss. Die Notation mit dem ‚_‘ ist eine bequeme Art, die Dezimalstellen abzutrennen. Der Unterstrich wird von Ruby bei Zahlen ignoriert und dient nur der besseren Lesbarkeit (kann übrigens auch zur bequemen Darstellung von großen Beträgen verwendet werden: 45_000_000).

Diese Werte koennen jetzt z.B. ausgegeben werden:

puts us.to_s
puts us.format
puts cd.to_s
puts cd.format
puts eu.to_s
puts eu.format(:with_currency)
puts eu.format(:html, :with_currency)

liefert uns:

100.00
$100.00
150.00
$150.00
200.00
$200.00 EUR
$200.00 <span class=“currency“>EUR</span>

letzteres ist fuer die Ausgabe in HTML-Seiten gedacht, und bietet hierfuer schon die class currency an, die in HTML-Seiten ggf. besonders markiert werden kann.

Bei der Ausgabe von Euro-Betraegen faellt auf, dass dieser Ausgabe ein ‚$‘ vorangestellt wird, was bei Euro-Betraegen oder anderen Waehrungen natuerlich nicht korrekt ist. Dies muesste man sich ggf. bei der Ausgabe entfernen, indem man das erste Zeichen entfernt. Wahrscheinlich hatte der Autor hier nur den amerikanischen und kanadischen Markt im Auge.

Ein kleines Schmankerl:

kostenlos = Money.us_dollar(0)
puts kostenlos.format

liefert:

„free“

Addieren von Geldbetraegen:

eu = eu + Money.euro(57_00)
puts eu

liefert erwartungsgemaess:

257.00

jetzt wollen wir kanadische Dollars zu US-Dollars addieren:

us = us + cd

was passiert?

/usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/bank/no_exchange_bank.rb:5:in `reduce‘: Current Money::bank does not support money exchange. Please implement a bank object that does and assign it to the Money class. (Money::MoneyError)
from /usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/money/money.rb:164:in `exchange_to‘
from /usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/money/money.rb:75:in `+‘
from money-demo.rb:25

was ist das?

Das heisst, es ist nicht bekannt, wie die beiden Waehrungen ineinander umzurechnen sind.

Was kann man machen?

Man muss eine fuer die Money-Klasse eine ‚Bank‘ anlegen. Standardmaessig ist keine Umrechnung moeglich (siehe obige Fehlermeldung: ’no_exchange_bank‘).
Dann definiert man Wechselkurse und danach koennen Umrechnungen vorgenommen, bzw. mit verschiedenen Waehrungen gerechnet werden.

Money.bank = VariableExchangeBank.new
Money.bank.add_rate(„USD“, „CAD“, 1.24515)
Money.bank.add_rate(„CAD“, „USD“, 0.803115)
us = us + cd
puts us

Und siehe da, die Addition klappt nun. Man kann kanadische Dollar zu US-Dollar addieren.

Wenn man dies produktiv einsetzt, kann man sich die Umrechnungskurse aus einer offiziellen Quelle z. B. einmal täglich einlesen und in einer Datenbanktabelle zur weiteren Verwendung speichern.

Man kann auch ein Objekt einer Waehrung umwandeln in ein Objekt einer anderen Waehrung:

Money.us_dollar(100).exchange_to(„CAD“) => Money.ca_dollar(124)

Man kann auch ein Standard-Waehrung einstellen. Folgendes:

Money.default_currency=“EUR“

m = Money.new(123_45)
p m

liefert ein Euro-Money-Objekt

#<Money:0xb784cd28 @currency=“EUR“, @cents=12345>

Das wars in Kuerze zu diesem Gem. Weitere Moeglichkeiten, siehe die Dokumentation unter

http://dist.leetsoft.com/api/money/

Ausblick:

Gibt es Vorschlaege, welches Gem ich naechste Woche hier beschreiben soll? Falls nicht, werde ich eines nehmen, das mir persoenlich interessant erscheint.

Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: