BigMoney

Description

Represents an amount of money in a particular currency. Backed by BigDecimal, so it’s safe from float rounding errors.

Features

  • Encapsulates an amount with its currency into a single object.

  • Backed by BigDecimal, so it can store arbitrary-precision values without rounding errors. Useful if you’re dealing with fractional cents.

  • Sensible currency handling.

  • Supports all ISO-4217 currencies.

  • Optional currency exchange.

  • Optional string parsing.

Problems

  • Does not implement all of Numeric, so doesn’t quite act like a real number.

Todo

Synopsis

Basic

require 'big_money'

bm = BigMoney.new('3.99', :aud)
bm.amount           #=> BigDecimal.new('3.99')
bm.currency         #=> BigMoney::Currency::AUD
bm.to_s             #=> '3.99'
bm.to_s('$.2f')     #=> '$3.99'
bm.to_s('$%.2f %s') #=> '$3.99 AUD'

# Not recommended but if you must.
BigMoney::Currency.default = :aud

bm = BigMoney.new('3.99')
bm.amount   #=> BigDecimal.new('3.99')
bm.currency #=> BigMoney::Currency::AUD

bm2 = 1.to_big_money
bm2.amount   #=> BigDecimal.new('3.99')
bm2.currency #=> BigMoney::Currency::AUD

Exchange

require 'big_money'
require 'big_money/exchange/yahoo' # Use yahoo finance exchange service.

# Cache it with memcache.
require 'moneta'
require 'moneta/memcache'
BigMoney::Exchange.cache = Moneta::Memcache.new(server: 'localhost', default_ttl: 3_600)

bm = BigMoney.new('3.99', :usd)
bm.amount   #=> BigDecimal.new('3.99')
bm.currency #=> BigMoney::Currency::USD

bm2 = bm.exchange(:aud)
bm.amount   #=> BigDecimal.new('5.22')
bm.currency #=> BigMoney::Currency::AUD

Parser

require 'big_money'
require 'big_money/parser'

BigMoney.parse('JPY ¥2500') #=> BigMoney.new('2500', :jpy)
BigMoney.parse('JPY2500')   #=> BigMoney.new('2500', :jpy)
BigMoney.parse('2500JPY')   #=> BigMoney.new('2500', :jpy)
BigMoney.parse('¥2500JPY')  #=> BigMoney.new('2500', :jpy)

# ISO-4217 BigMoney::Currency::XXX aka 'No currency' will be used if a currency cannot be parsed along with the
# amount. If you know the currency and just need the amount XXX is always exchanged 1:1 with any currency.
bm = BigMoney.parse('¥2500') #=> BigMoney.new('2500', :xxx)
bm.exchange(:jpy)            #=> BigMoney.new('2500', :jpy)

Types

require 'big_money'
require 'big_money/types'

# Numeric
1.to_big_money(:aud)         #=> BigMoney.new(1, :aud)
12_123.44.to_big_money(:aud) #=> BigMoney.new('12123.44', :aud)

# String
'1'.to_big_money(:aud)       #=> BigMoney.new(1, :aud)

Install

  • Via git:

    git clone git://github.com/shanna/big_money.git
    
  • Via gem:

    gem install big_money
    

License

See LICENSE.