| Class | Money::Bank::VariableExchange |
| In: |
lib/money/bank/variable_exchange.rb
|
| Parent: | Base |
Class for aiding in exchanging money between different currencies. By default, the Money class uses an object of this class (accessible through +Money#bank+) for performing currency exchanges.
By default, +Money::Bank::VariableExchange+ has no knowledge about conversion rates. One must manually specify them with add_rate, after which one can perform exchanges with +exchange_with+.
Exchange rates are stored in memory using +Money::RatesStore::Memory+ by default. Pass custom rates stores for other types of storage (file, database, etc)
@example
bank = Money::Bank::VariableExchange.new
bank.add_rate("USD", "CAD", 1.24515)
bank.add_rate("CAD", "USD", 0.803115)
c1 = Money.new(100_00, "USD")
c2 = Money.new(100_00, "CAD")
# Exchange 100 USD to CAD:
bank.exchange_with(c1, "CAD") #=> #<Money fractional:12451 currency:CAD>
# Exchange 100 CAD to USD:
bank.exchange_with(c2, "USD") #=> #<Money fractional:8031 currency:USD>
# With custom exchange rates storage
redis_store = MyCustomRedisStore.new(host: 'localhost:6379')
bank = Money::Bank::VariableExchange.new(redis_store)
# Store rates in redis
bank.add_rate 'USD', 'CAD', 0.98
# Get rate from redis
bank.get_rate 'USD', 'CAD'
| RATE_FORMATS | = | [:json, :ruby, :yaml].freeze | Available formats for importing/exporting rates. | |
| SERIALIZER_SEPARATOR | = | '_TO_'.freeze | ||
| FORMAT_SERIALIZERS | = | {json: JSON, ruby: Marshal, yaml: YAML}.freeze |
| mutex | [R] | |
| store | [R] |
Initializes a new +Money::Bank::VariableExchange+ object. It defaults to using an in-memory, thread safe store instance for storing exchange rates.
@param [RateStore] st An exchange rate store, used to persist exchange rate pairs. @yield [n] Optional block to use when rounding after exchanging one
currency for another. See +Money::bank::base+
Registers a conversion rate and returns it (uses +set_rate+). Delegates to +Money::RatesStore::Memory+
@param [Currency, String, Symbol] from Currency to exchange from. @param [Currency, String, Symbol] to Currency to exchange to. @param [Numeric] rate Rate to use when exchanging currencies.
@return [Numeric]
@example
bank = Money::Bank::VariableExchange.new
bank.add_rate("USD", "CAD", 1.24515)
bank.add_rate("CAD", "USD", 0.803115)
Exchanges the given Money object to a new Money object in to_currency.
@param [Money] from
The +Money+ object to exchange.
@param [Currency, String, Symbol] to_currency
The currency to exchange to.
@yield [n] Optional block to use when rounding after exchanging one
currency for another.
@yieldparam [Float] n The resulting float after exchanging one currency
for another.
@yieldreturn [Integer]
@return [Money]
@raise +Money::Bank::UnknownRate+ if the conversion rate is unknown.
@example
bank = Money::Bank::VariableExchange.new
bank.add_rate("USD", "CAD", 1.24515)
bank.add_rate("CAD", "USD", 0.803115)
c1 = Money.new(100_00, "USD")
c2 = Money.new(100_00, "CAD")
# Exchange 100 USD to CAD:
bank.exchange_with(c1, "CAD") #=> #<Money fractional:12451 currency:CAD>
# Exchange 100 CAD to USD:
bank.exchange_with(c2, "USD") #=> #<Money fractional:8031 currency:USD>
Return the known rates as a string in the format specified. If file is given will also write the string out to the file specified. Available formats are +:json+, +:ruby+ and +:yaml+.
@param [Symbol] format Request format for the resulting string. @param [String] file Optional file location to write the rates to. @param [Hash] opts Options hash to set special parameters. Backwards compatibility only.
@return [String]
@raise +Money::Bank::UnknownRateFormat+ if format is unknown.
@example
bank = Money::Bank::VariableExchange.new
bank.set_rate("USD", "CAD", 1.24515)
bank.set_rate("CAD", "USD", 0.803115)
s = bank.export_rates(:json)
s #=> "{\"USD_TO_CAD\":1.24515,\"CAD_TO_USD\":0.803115}"
Retrieve the rate for the given currencies. data access. Delegates to +Money::RatesStore::Memory+
@param [Currency, String, Symbol] from Currency to exchange from. @param [Currency, String, Symbol] to Currency to exchange to. @param [Hash] opts Options hash to set special parameters. Backwards compatibility only.
@return [Numeric]
@example
bank = Money::Bank::VariableExchange.new
bank.set_rate("USD", "CAD", 1.24515)
bank.set_rate("CAD", "USD", 0.803115)
bank.get_rate("USD", "CAD") #=> 1.24515
bank.get_rate("CAD", "USD") #=> 0.803115
Loads rates provided in s given the specified format. Available formats are +:json+, +:ruby+ and +:yaml+. Delegates to +Money::RatesStore::Memory+
@param [Symbol] format The format of s. @param [String] s The rates string. @param [Hash] opts Options hash to set special parameters. Backwards compatibility only.
@return [self]
@raise +Money::Bank::UnknownRateFormat+ if format is unknown.
@example
s = "{\"USD_TO_CAD\":1.24515,\"CAD_TO_USD\":0.803115}"
bank = Money::Bank::VariableExchange.new
bank.import_rates(:json, s)
bank.get_rate("USD", "CAD") #=> 1.24515
bank.get_rate("CAD", "USD") #=> 0.803115
Set the rate for the given currencies. access. Delegates to +Money::RatesStore::Memory+
@param [Currency, String, Symbol] from Currency to exchange from. @param [Currency, String, Symbol] to Currency to exchange to. @param [Numeric] rate Rate to use when exchanging currencies. @param [Hash] opts Options hash to set special parameters. Backwards compatibility only.
@return [Numeric]
@example
bank = Money::Bank::VariableExchange.new
bank.set_rate("USD", "CAD", 1.24515)
bank.set_rate("CAD", "USD", 0.803115)