money_badger
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:A plugin to handle currency and foreign exchange.
# MoneyBadger

A gem to handle currency and foreign exchange.

Keeps things accurate and avoids floating point errors.

A money object consists of three attributes :

* @value - an integer which represent the amount without a decimal place
* @precision - an integer which sets where the decimal place is
* @currency - a string which stores the ISO currency code ie "USD", "GBP", "CAD" or "EUR"

## Requirements

Hpricot Gem for fetching currency rates
ActiveRecord for tie into rails
rspec for unit tests


### Basics

    m = Money.new(500, "USD")
    m.value #=> 500
    m.to_f #=> 5.00
    m.to_s #=> "5.00"
    m.in_cents #=> 500
    m.format #=> "$5.00"
    
    n = "GBP 10.50".to_money
    n.value #=> 1050
    n.to_f #=> 10.50
    n.to_s #=> "10.50"
    n.format #=> "£10.50"
    
    o = 15.to_money
    o.to_f #=> 15.00
    o.to_s #=> "15.00"
    o.format #=> "$15.00"

### Arithmetic

    (m + o).format #=> "$20.00"
    
    (o - m).format #=> "$10.00"
    
    (m * 4 ).format #=> "$20.00"

### Currency conversion

Money has a bank object.
Currency rates are relative to the Euro
Currency rates are looked up form the European exchange bank
You can set a commission over the mid market rates given by the bank

    n.bank #=> Bank
    n.bank.exchange_rates #=> {"USD" => 1.34, "GBP" => 0.85, "EUR" => 1.00}
    n.bank.commission = 0.05 # set the commission to 5%
    
    n.exchange_to("USD").format => # "$17.24"
    
    (m + n ).format => # "$22.24"

### Advanced use

Can add a precision option. This is the third option in the new() method or the :precision => () option in the .to_money method.
The precision option allows you to keep the calculations accurate when dividing and multiplying.
The precision of a sum automatically changes to keep the most precise result.

    a = Money.new(50000, "USD", 4)
    a.value #=> 50000
    a.to_f #=> 5.0000
    a.in_cents #=> 500
    a.in_dollars #=> 5
    a.format #=> "$5.00"
    
    b = Money.new(56789, "USD", 5)
    b.value #=> 56789
    b.to_f #=> 0.56789
    b.format #=> "$0.57"
    (a + b).format #=> "$5.57"
    
    c = 5.02341.to_money(:currency => "GBP")
    c.value #=> 502341
    c.precision #=> 5
    c.format #=> "£5.02"
    (c * 3).to_f #=> 15.07023
    
    (a + c).format #=> "$12.56"


## Using with Rails

Money Badger comes with an ActiveRecord method called has_money.

    has_money(name, options = {})

Place in your model to enable money. Store money in an integer field which defaults to "#{name}_value".
has_money provides reader writer methods.

Options are :

* :currency  - specify a proc to determine the currency ie Proc.new{|object| object.currency}. The default is to look for a 'currency' instance method in the model has_money is inserted into.
* :precision - specify a precision to save the currency to.  If you are doing divisions, multiplications or cumulative totals you might like to specify a higher precision. Defaults to 2.
* :value     - specify the name of the field or method to which an integer value can be stored.

Examples :

    class Item < ActiveRecord::Base
      belongs_to :country
      
      has_money :total, 
                :precision => 3, 
                :value => :total_money, 
                :currency => :currency
      
      def currency
        "USD"
      end
    end

## Use it !

    i = Item.new
    i.total.to_f #=> 0.000
    i.total = Money.new(500)
    i.total.to_f #=> 5.000
    i.total.format #=> "$5.00"

## Setting up defaults for Bank

Create a bank.yml file in /config/bank.yml to initialize settings. A template is in templates/bank.yml

commission: 0.05 # how much your bank charges for currency conversion
exchange_rates: # additional exchange rates you offer for your own currencies. Use other currency ISOs if you want to match it to that currency
  EUR: 1
  GBP: 0.8
  USD: 1.3
  CREDIT: USD
non_tradeable_currencies: # the currencies which you don't wish to exchange into other currencies such as store credit
    - CREDIT
currency_symbols: # currency symbols for money.format method
  GBP: "£"
  EUR: "€"
  USD: "$"

The money gem provide an ActiveRecord Extension :

### TODO

* Add a generator for copying the bank.yml template into config
* Use railties for link to ActiveRecord
* Add tests to has_money

Copyright (c) 2010 completelynovel.com, released under the MIT license

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。