Class: Money::Currency
- Inherits:
-
Object
- Object
- Money::Currency
- Extended by:
- Enumerable, Heuristics
- Includes:
- Comparable
- Defined in:
- lib/money/currency.rb,
lib/money/currency/loader.rb,
lib/money/currency/heuristics.rb
Overview
Represents a specific currency unit.
Defined Under Namespace
Modules: Heuristics, Loader Classes: MissingAttributeError, UnknownCurrency
Constant Summary collapse
- @@mutex =
Keeping cached instances in sync between threads
Mutex.new
- @@instances =
{}
Instance Attribute Summary collapse
-
#decimal_mark ⇒ String
(also: #separator)
readonly
The decimal mark, or character used to separate the whole unit from the subunit.
-
#disambiguate_symbol ⇒ String
readonly
Alternative currency used if symbol is ambiguous.
-
#format ⇒ Object
readonly
Returns the value of attribute format.
-
#html_entity ⇒ String
readonly
The html entity for the currency symbol.
-
#id ⇒ Symbol
readonly
The symbol used to identify the currency, usually THE lowercase
iso_code
attribute. -
#iso_code ⇒ String
readonly
The international 3-letter code as defined by the ISO 4217 standard.
-
#iso_numeric ⇒ String
readonly
The international 3-numeric code as defined by the ISO 4217 standard.
-
#name ⇒ String
readonly
The currency name.
-
#priority ⇒ Integer
readonly
A numerical value you can use to sort/group the currency list.
-
#smallest_denomination ⇒ Integer
readonly
Smallest amount of cash possible (in the subunit of this currency).
-
#subunit ⇒ String
readonly
The name of the fractional monetary unit.
-
#subunit_to_unit ⇒ Integer
readonly
The proportion between the unit and the subunit.
-
#symbol ⇒ String
readonly
The currency symbol (UTF-8 encoded).
-
#symbol_first ⇒ Boolean
readonly
Should the currency symbol precede the amount, or should it come after?.
-
#thousands_separator ⇒ String
(also: #delimiter)
readonly
The character used to separate thousands grouping of the whole unit.
Class Method Summary collapse
- ._instances ⇒ Object
-
.all ⇒ Array
List the currencies imported and registered.
- .each ⇒ Object
-
.find(id) ⇒ Money::Currency
Lookup a currency with given
id
an returns aCurrency
instance on success,nil
otherwise. -
.find_by_iso_numeric(num) ⇒ Money::Currency
Lookup a currency with given
num
as an ISO 4217 numeric and returns anCurrency
instance on success,nil
otherwise. -
.inherit(parent_iso_code, curr) ⇒ Object
Inherit a new currency from existing one.
- .new(id) ⇒ Object
-
.register(curr) ⇒ Object
Register a new currency.
- .reset! ⇒ Object
-
.stringified_keys ⇒ Set
We need a string-based validator before creating an unbounded number of symbols.
-
.table ⇒ Object
List of known currencies.
-
.unregister(curr) ⇒ Boolean
Unregister a currency.
-
.wrap(object) ⇒ Money::Currency
Wraps the object in a
Currency
unless it’s already aCurrency
object.
Instance Method Summary collapse
-
#<=>(other_currency) ⇒ -1, ...
Compares
self
withother_currency
against the value ofpriority
attribute. -
#==(other_currency) ⇒ Boolean
Compares
self
withother_currency
and returnstrue
if the are the same or if theirid
attributes match. -
#code ⇒ String
Returns currency symbol or iso code for currencies with no symbol.
- #eql? ⇒ Object
-
#exponent ⇒ Integer
(also: #decimal_places)
Returns the relation between subunit and unit as a base 10 exponent.
-
#hash ⇒ Integer
Returns a Integer hash value based on the
id
attribute in order to use functions like & (intersection), group_by, etc. -
#initialize(id) ⇒ Money::Currency
constructor
Create a new
Currency
object. -
#inspect ⇒ String
Returns a human readable representation.
-
#iso? ⇒ Boolean
Returns if a code currency is ISO.
- #symbol_first? ⇒ Boolean
-
#to_currency ⇒ self
Conversion to
self
. -
#to_s ⇒ String
Returns a string representation corresponding to the upcase
id
attribute. -
#to_str ⇒ String
Returns a string representation corresponding to the upcase
id
attribute. -
#to_sym ⇒ Symbol
Returns a symbol representation corresponding to the upcase
id
attribute.
Methods included from Heuristics
Constructor Details
#initialize(id) ⇒ Money::Currency
Create a new Currency
object.
275 276 277 278 |
# File 'lib/money/currency.rb', line 275 def initialize(id) @id = id.to_sym initialize_data! end |
Instance Attribute Details
#decimal_mark ⇒ String (readonly) Also known as: separator
Returns The decimal mark, or character used to separate the whole unit from the subunit.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#disambiguate_symbol ⇒ String (readonly)
Returns Alternative currency used if symbol is ambiguous.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#format ⇒ Object (readonly)
Returns the value of attribute format.
258 259 260 |
# File 'lib/money/currency.rb', line 258 def format @format end |
#html_entity ⇒ String (readonly)
Returns The html entity for the currency symbol.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#id ⇒ Symbol (readonly)
Returns The symbol used to identify the currency, usually THE lowercase iso_code
attribute.
258 259 260 |
# File 'lib/money/currency.rb', line 258 def id @id end |
#iso_code ⇒ String (readonly)
Returns The international 3-letter code as defined by the ISO 4217 standard.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#iso_numeric ⇒ String (readonly)
Returns The international 3-numeric code as defined by the ISO 4217 standard.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#name ⇒ String (readonly)
Returns The currency name.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#priority ⇒ Integer (readonly)
Returns A numerical value you can use to sort/group the currency list.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#smallest_denomination ⇒ Integer (readonly)
Returns Smallest amount of cash possible (in the subunit of this currency).
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#subunit ⇒ String (readonly)
Returns The name of the fractional monetary unit.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#subunit_to_unit ⇒ Integer (readonly)
Returns The proportion between the unit and the subunit.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#symbol ⇒ String (readonly)
Returns The currency symbol (UTF-8 encoded).
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#symbol_first ⇒ Boolean (readonly)
Returns Should the currency symbol precede the amount, or should it come after?.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
#thousands_separator ⇒ String (readonly) Also known as: delimiter
Returns The character used to separate thousands grouping of the whole unit.
258 259 260 |
# File 'lib/money/currency.rb', line 258 attr_reader :id, :priority, :iso_code, :iso_numeric, :name, :symbol, :disambiguate_symbol, :html_entity, :subunit, :subunit_to_unit, :decimal_mark, :thousands_separator, :symbol_first, :smallest_denomination, :format |
Class Method Details
._instances ⇒ Object
46 47 48 |
# File 'lib/money/currency.rb', line 46 def _instances @@instances end |
.all ⇒ Array
List the currencies imported and registered
133 134 135 136 137 138 139 140 141 |
# File 'lib/money/currency.rb', line 133 def all table.keys.map do |curr| c = Currency.new(curr) if c.priority.nil? raise MissingAttributeError.new(:all, c.id, :priority) end c end.sort_by(&:priority) end |
.each ⇒ Object
205 206 207 |
# File 'lib/money/currency.rb', line 205 def each all.each { |c| yield(c) } end |
.find(id) ⇒ Money::Currency
Lookup a currency with given id
an returns a Currency
instance on success, nil
otherwise.
retrieve the applicable attributes.
61 62 63 64 65 66 |
# File 'lib/money/currency.rb', line 61 def find(id) id = id.to_s.downcase.to_sym new(id) rescue UnknownCurrency nil end |
.find_by_iso_numeric(num) ⇒ Money::Currency
Lookup a currency with given num
as an ISO 4217 numeric and returns an Currency
instance on success, nil
otherwise.
the right currency id.
80 81 82 83 84 85 86 87 |
# File 'lib/money/currency.rb', line 80 def find_by_iso_numeric(num) num = num.to_s.rjust(3, '0') return if num.empty? id, _ = self.table.find { |key, currency| currency[:iso_numeric] == num } new(id) rescue UnknownCurrency nil end |
.inherit(parent_iso_code, curr) ⇒ Object
Inherit a new currency from existing one
181 182 183 184 185 |
# File 'lib/money/currency.rb', line 181 def inherit(parent_iso_code, curr) parent_iso_code = parent_iso_code.downcase.to_sym curr = @table.fetch(parent_iso_code, {}).merge(curr) register(curr) end |
.new(id) ⇒ Object
37 38 39 40 41 42 43 44 |
# File 'lib/money/currency.rb', line 37 def new(id) id = id.to_s.downcase unless stringified_keys.include?(id) raise UnknownCurrency, "Unknown currency '#{id}'" end _instances[id] || @@mutex.synchronize { _instances[id] ||= super } end |
.register(curr) ⇒ Object
Register a new currency
170 171 172 173 174 175 |
# File 'lib/money/currency.rb', line 170 def register(curr) key = curr.fetch(:iso_code).downcase.to_sym @@mutex.synchronize { _instances.delete(key.to_s) } @table[key] = curr @stringified_keys = nil end |
.reset! ⇒ Object
209 210 211 212 |
# File 'lib/money/currency.rb', line 209 def reset! @@instances = {} @table = Loader.load_currencies end |
.stringified_keys ⇒ Set
We need a string-based validator before creating an unbounded number of symbols. www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol#11 github.com/RubyMoney/money/issues/132
149 150 151 |
# File 'lib/money/currency.rb', line 149 def stringified_keys @stringified_keys ||= stringify_keys end |
.table ⇒ Object
List of known currencies.
monetary unit
The standard unit of value of a currency, as the dollar in the United States or the peso in Mexico. www.answers.com/topic/monetary-unit
fractional monetary unit, subunit
A monetary unit that is valued at a fraction (usually one hundredth) of the basic monetary unit www.answers.com/topic/fractional-monetary-unit-subunit
See en.wikipedia.org/wiki/List_of_circulating_currencies and search.cpan.org/~tnguyen/Locale-Currency-Format-1.28/Format.pm
123 124 125 |
# File 'lib/money/currency.rb', line 123 def table @table ||= Loader.load_currencies end |
.unregister(curr) ⇒ Boolean
Unregister a currency.
194 195 196 197 198 199 200 201 202 203 |
# File 'lib/money/currency.rb', line 194 def unregister(curr) if curr.is_a?(Hash) key = curr.fetch(:iso_code).downcase.to_sym else key = curr.downcase.to_sym end existed = @table.delete(key) @stringified_keys = nil if existed existed ? true : false end |
.wrap(object) ⇒ Money::Currency
Wraps the object in a Currency
unless it’s already a Currency
object.
object.
102 103 104 105 106 107 108 109 110 |
# File 'lib/money/currency.rb', line 102 def wrap(object) if object.nil? nil elsif object.is_a?(Currency) object else Currency.new(object) end end |
Instance Method Details
#<=>(other_currency) ⇒ -1, ...
Compares self
with other_currency
against the value of priority
attribute.
293 294 295 296 297 298 299 300 301 302 |
# File 'lib/money/currency.rb', line 293 def <=>(other_currency) # <=> returns nil when one of the values is nil comparison = self.priority <=> other_currency.priority || 0 if comparison == 0 self.id <=> other_currency.id else comparison end end |
#==(other_currency) ⇒ Boolean
Compares self
with other_currency
and returns true
if the are the same or if their id
attributes match.
316 317 318 |
# File 'lib/money/currency.rb', line 316 def ==(other_currency) self.equal?(other_currency) || compare_ids(other_currency) end |
#code ⇒ String
Returns currency symbol or iso code for currencies with no symbol.
400 401 402 |
# File 'lib/money/currency.rb', line 400 def code symbol || iso_code end |
#eql? ⇒ Object
264 |
# File 'lib/money/currency.rb', line 264 alias_method :eql?, :== |
#exponent ⇒ Integer Also known as: decimal_places
Returns the relation between subunit and unit as a base 10 exponent.
Note that MGA and MRU are exceptions and are rounded to 1
425 426 427 |
# File 'lib/money/currency.rb', line 425 def exponent Math.log10(subunit_to_unit).round end |
#hash ⇒ Integer
Returns a Integer hash value based on the id
attribute in order to use functions like & (intersection), group_by, etc.
337 338 339 |
# File 'lib/money/currency.rb', line 337 def hash id.hash end |
#inspect ⇒ String
Returns a human readable representation.
347 348 349 |
# File 'lib/money/currency.rb', line 347 def inspect "#<#{self.class.name} id: #{id}, priority: #{priority}, symbol_first: #{symbol_first}, thousands_separator: #{thousands_separator}, html_entity: #{html_entity}, decimal_mark: #{decimal_mark}, name: #{name}, symbol: #{symbol}, subunit_to_unit: #{subunit_to_unit}, exponent: #{exponent}, iso_code: #{iso_code}, iso_numeric: #{iso_numeric}, subunit: #{subunit}, smallest_denomination: #{smallest_denomination}, format: #{format}>" end |
#iso? ⇒ Boolean
Returns if a code currency is ISO.
415 416 417 |
# File 'lib/money/currency.rb', line 415 def iso? iso_numeric && iso_numeric != '' end |
#symbol_first? ⇒ Boolean
404 405 406 |
# File 'lib/money/currency.rb', line 404 def symbol_first? !!@symbol_first end |
#to_currency ⇒ self
Conversion to self
.
393 394 395 |
# File 'lib/money/currency.rb', line 393 def to_currency self end |
#to_s ⇒ String
Returns a string representation corresponding to the upcase id
attribute.
– DEV: id.to_s.upcase corresponds to iso_code but don’t use ISO_CODE for consistency.
362 363 364 |
# File 'lib/money/currency.rb', line 362 def to_s id.to_s.upcase end |
#to_str ⇒ String
Returns a string representation corresponding to the upcase id
attribute. Useful in cases where only implicit conversions are made.
374 375 376 |
# File 'lib/money/currency.rb', line 374 def to_str id.to_s.upcase end |
#to_sym ⇒ Symbol
Returns a symbol representation corresponding to the upcase id
attribute.
386 387 388 |
# File 'lib/money/currency.rb', line 386 def to_sym id.to_s.upcase.to_sym end |