= 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 * Has no Money package API compatibility to ease transition (module patch welcome). (http://dist.leetsoft.com/api/money/) == 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.