Giter VIP home page Giter VIP logo

money's Introduction

== Money

This library makes it easier to deal with Money values, storing them as integers to avoid floating-point math errors.

== Download

Preferred method of installation is gem: 

  gem install --source http://gems.github.com collectiveidea-money 

You can find the source at:
  
  http://github.com/collectiveidea/money

== Rails

There is a rails extension that makes it easier to store money values in the database.

  class Product < ActiveRecord::Base
    money :price
    validates_numericality_of :price_in_cents, :greater_than => 0
  end

This assumes that there is a price_in_cents (integer) column in the database, which can
be changed by passing the :cents option.  You can also specify the :currency option to
save the currency to a field in the database.

  class Room < ActiveRecord::Base
    money :rate, :cents => :rate_cents, :currency => :rate_currency
    money :discount, :cents => :discount_cents
  end

You can set the attribute to a String, Fixnum, or Float and it will call #to_money to
convert it to a Money object.  This makes it convenient for using money fields in forms.

  r = Room.new :rate => "100.00"
  r.rate  # returns <Money:0x249ef9c @currency="USD", @cents=10000>

By default, money values will be stored with a precision of 2 (cents). If you need to store different precisions, such as to the nearest tenth of a cent, you can specify the +:precision+ option:

  class Room < ActiveRecord::Base
    money :rate, :precision => 3
  end

  r = Room.new :rate => "100"
  r.rate.format  # returns $100.000
  r.rate = "100.995"
  r.rate.format  # returns $100.995

To use the Rails functionality, install money as a plugin, or require 'money/rails'.
This version is compatible with Rails 2.2.  For compatibility with previous versions of
Rails, check out the rails-2.1 branch.
  
== Class configuration

Two const class variables are available to tailor Money to your needs. 
If you don't need currency exchange at all, just ignore those.

=== Default Currency

By default Money defaults to USD as its currency. This can be overwritten using

  Money.default_currency = "CAD"
  
If you use rails, the environment.rb is a very good place to put this. 

=== Currency Exchange

The second parameter is a bit more complex. It lets you provide your own implementation of the 
currency exchange service. By default Money throws an exception when trying to call .exchange_to. 

A second minimalist implementation is provided which lets you supply custom exchange rates:

  Money.bank = VariableExchangeBank.new 
  Money.bank.add_rate("USD", "CAD", 1.24515)
  Money.bank.add_rate("CAD", "USD", 0.803115)
  Money.us_dollar(100).exchange_to("CAD") => Money.ca_dollar(124)
  Money.ca_dollar(100).exchange_to("USD") => Money.us_dollar(80)

There is nothing stopping you from creating bank objects which scrape www.xe.com for the current rates or just return rand(2)
  
== Code

If you have any improvements please email them to tobi [at] leetsoft.com 

money's People

Contributors

bkeepers avatar danielmorrison avatar zdennis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

money's Issues

Missing require in money.rb

Nice library. Tried to install as gem from github for use with ActiveRecord. Ruby kept reporting that the "money" method in my model was missing:

undefined method `money' for #Class:0x244517c

... turns out the rails.rb file was not being included by money.rb.

Added:
require 'money/rails'

to my money.rb, and all is well. Also, it appears that the comments in money.rb about usage with ActiveRecord reference an earlier implementation.

Negative Money does not work with Rails's number_to_currency

m=Money.new -500
helper.number_to_currency m

fails with exception

NoMethodError: private method sub' called for #<Money:0x5273698 @precision=2, @currency="USD", @cents=-500> from /home/deploy/staging2/shared/bundle/ruby/1.8/gems/actionpack-3.0.8/lib/action_view/helpers/number_helper.rb:128:innumber_to_currency'

This is the offending line in Rails's number_to_currency function:

https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/number_helper.rb#L123

It seems if you would implement an "abs" method for a Money object, it would work.

Missing constructor option in rails.rb def money composed_of

need to add this option to the composed_of declaration:

:constructor => lambda { |cents, currency, precision=options[:precision]| ::Money.new(cents, currency, precision) },

in order to get the correct results with large precisions (I'm using 6)

with_thousands_separator formatting rule

Thought you might want to include the following :with_thousands_separator rule in the format method:

if rules.include?(:with_currency)
  formatted << " "
  formatted << '<span class="currency">' if rules.include?(:html)
  formatted << currency
  formatted << '</span>' if rules.include?(:html)
end

if rules.include?(:with_thousands_separator)
formatted = formatted.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\1,")
end

formatted

... borrowed from:
http://snippets.dzone.com/posts/show/693

Thanks for clarifying the include.

Cheers...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.