Class: Money::Currency
- Inherits:
-
Object
- Object
- Money::Currency
- Extended by:
- Enumerable, Enumerable[Money::Currency], Heuristics
- Includes:
- Comparable
- Defined in:
- lib/money/currency.rb,
lib/money/currency/loader.rb,
lib/money/currency/heuristics.rb,
sig/lib/money/currency.rbs,
sig/lib/money/currency/heuristics.rbs
Overview
Represents a specific currency unit.
Defined Under Namespace
Modules: Heuristics, Loader Classes: MissingAttributeError, NoCurrency, 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_codeattribute. -
#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 {|arg0| ... } ⇒ Object
rubocop:enable Naming/PredicateMethod.
-
.find(id) ⇒ Money::Currency
Lookup a currency with given
idan returns aCurrencyinstance on success,nilotherwise. -
.find_by_iso_numeric(num) ⇒ Money::Currency
Lookup a currency with given
numas an ISO 4217 numeric and returns anCurrencyinstance on success,nilotherwise. -
.inherit(parent_iso_code, curr) ⇒ Object
Inherit a new currency from existing one.
- .new(id) ⇒ Object
-
.register(curr) ⇒ Money::Currency
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
Currencyunless it's already aCurrencyobject.
Instance Method Summary collapse
-
#<=>(other) ⇒ -1, ...
Compares
selfwithother_currencyagainst the value ofpriorityattribute. -
#==(other) ⇒ Boolean
Compares
selfwithother_currencyand returnstrueif the are the same or if theiridattributes match. -
#cents_based? ⇒ Boolean
Returns true if a subunit is cents-based.
-
#code ⇒ String
Returns currency symbol or iso code for currencies with no symbol.
-
#compare_ids(other_currency) ⇒ Object
rubocop:disable Naming/PredicateMethod.
- #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
idattribute in order to use functions like & (intersection), group_by, etc. -
#initialize(id) ⇒ Money::Currency
constructor
Create a new
Currencyobject. -
#initialize_data! ⇒ Object
rubocop:enable Naming/PredicateMethod.
-
#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
idattribute. -
#to_str ⇒ String
Returns a string representation corresponding to the upcase
idattribute. -
#to_sym ⇒ Symbol
Returns a symbol representation corresponding to the upcase
idattribute.
Methods included from Heuristics
Constructor Details
#initialize(id) ⇒ Money::Currency
Create a new Currency object.
294 295 296 297 |
# File 'lib/money/currency.rb', line 294 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 def format @format end |
#html_entity ⇒ String (readonly)
Returns The html entity for the currency symbol.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 def id @id end |
#iso_code ⇒ String (readonly)
Returns The international 3-letter code as defined by the ISO 4217 standard.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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).
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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).
277 278 279 |
# File 'lib/money/currency.rb', line 277 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?.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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.
277 278 279 |
# File 'lib/money/currency.rb', line 277 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
48 49 50 |
# File 'lib/money/currency.rb', line 48 def _instances @@instances end |
.all ⇒ Array
List the currencies imported and registered
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/money/currency.rb', line 136 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 {|arg0| ... } ⇒ Object
rubocop:enable Naming/PredicateMethod
213 214 215 |
# File 'lib/money/currency.rb', line 213 def each(&) all.each(&) end |
.find(id) ⇒ Money::Currency
Lookup a currency with given id an returns a Currency instance on
success, nil otherwise.
retrieve the applicable attributes.
63 64 65 66 67 68 |
# File 'lib/money/currency.rb', line 63 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.
82 83 84 85 86 87 88 89 90 |
# File 'lib/money/currency.rb', line 82 def find_by_iso_numeric(num) num = num.to_s.rjust(3, "0") return if num.empty? id = iso_numeric_index[num] new(id) if id rescue UnknownCurrency nil end |
.inherit(parent_iso_code, curr) ⇒ Object
Inherit a new currency from existing one
186 187 188 189 190 |
# File 'lib/money/currency.rb', line 186 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
39 40 41 42 43 44 45 46 |
# File 'lib/money/currency.rb', line 39 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) ⇒ Money::Currency
Register a new currency
174 175 176 177 178 179 180 |
# File 'lib/money/currency.rb', line 174 def register(curr) key = curr.fetch(:iso_code).downcase.to_sym @@mutex.synchronize { _instances.delete(key.to_s) } table[key] = curr @stringified_keys = nil clear_iso_numeric_cache end |
.reset! ⇒ Object
217 218 219 220 221 |
# File 'lib/money/currency.rb', line 217 def reset! @@instances = {} @table = Loader.load_currencies clear_iso_numeric_cache end |
.stringified_keys ⇒ Set
We need a string-based validator before creating an unbounded number of symbols. http://www.randomhacks.net.s3-website-us-east-1.amazonaws.com/2007/01/20/13-ways-of-looking-at-a-ruby-symbol/#11 https://github.com/RubyMoney/money/issues/132
153 154 155 |
# File 'lib/money/currency.rb', line 153 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. https://www.answers.com/redirectSearch?query=monetary-unit
fractional monetary unit, subunit
A monetary unit that is valued at a fraction (usually one hundredth) of the basic monetary unit https://www.answers.com/redirectSearch?query=fractional-monetary-unit-subunit
See https://en.wikipedia.org/wiki/List_of_circulating_currencies and https://metacpan.org/release/TNGUYEN/Locale-Currency-Format-1.28/view/Format.pm
126 127 128 |
# File 'lib/money/currency.rb', line 126 def table @table ||= Loader.load_currencies end |
.unregister(curr) ⇒ Boolean
Unregister a currency.
200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/money/currency.rb', line 200 def unregister(curr) key = if curr.is_a?(Hash) curr.fetch(:iso_code).downcase.to_sym else 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.
105 106 107 108 109 110 111 112 113 |
# File 'lib/money/currency.rb', line 105 def wrap(object) if object.nil? nil elsif object.is_a?(Currency) object else Currency.new(object) end end |
Instance Method Details
#<=>(other) ⇒ -1, ...
Compares self with other_currency against the value of priority
attribute.
312 313 314 315 316 317 318 319 320 321 |
# File 'lib/money/currency.rb', line 312 def <=>(other) # <=> returns nil when one of the values is nil comparison = priority <=> other.priority || 0 if comparison == 0 id <=> other.id else comparison end end |
#==(other) ⇒ Boolean
Compares self with other_currency and returns true if the are the
same or if their id attributes match.
335 336 337 |
# File 'lib/money/currency.rb', line 335 def ==(other) equal?(other) || compare_ids(other) end |
#cents_based? ⇒ Boolean
Returns true if a subunit is cents-based.
450 451 452 |
# File 'lib/money/currency.rb', line 450 def cents_based? subunit_to_unit == 100 end |
#code ⇒ String
Returns currency symbol or iso code for currencies with no symbol.
424 425 426 |
# File 'lib/money/currency.rb', line 424 def code symbol || iso_code end |
#compare_ids(other_currency) ⇒ Object
rubocop:disable Naming/PredicateMethod
468 469 470 471 472 473 474 475 476 |
# File 'lib/money/currency.rb', line 468 def compare_ids(other_currency) other_currency_id = if other_currency.is_a?(Currency) other_currency.id.to_s.downcase else other_currency.to_s.downcase end id.to_s.downcase == other_currency_id end |
#eql? ⇒ Object
283 |
# File 'lib/money/currency.rb', line 283 alias 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
460 461 462 |
# File 'lib/money/currency.rb', line 460 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.
346 347 348 |
# File 'lib/money/currency.rb', line 346 def hash id.hash end |
#initialize_data! ⇒ Object
rubocop:enable Naming/PredicateMethod
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
# File 'lib/money/currency.rb', line 479 def initialize_data! data = self.class.table[@id] @alternate_symbols = data[:alternate_symbols] @decimal_mark = data[:decimal_mark] @disambiguate_symbol = data[:disambiguate_symbol] @html_entity = data[:html_entity] @iso_code = data[:iso_code] @iso_numeric = data[:iso_numeric] @name = data[:name] @priority = data[:priority] @smallest_denomination = data[:smallest_denomination] @subunit = data[:subunit] @subunit_to_unit = data[:subunit_to_unit] @symbol = data[:symbol] @symbol_first = data[:symbol_first] @thousands_separator = data[:thousands_separator] @format = data[:format] end |
#inspect ⇒ String
Returns a human readable representation.
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 |
# File 'lib/money/currency.rb', line 356 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.
439 440 441 |
# File 'lib/money/currency.rb', line 439 def iso? iso_numeric && iso_numeric != "" end |
#symbol_first? ⇒ Boolean
428 429 430 |
# File 'lib/money/currency.rb', line 428 def symbol_first? !!@symbol_first end |
#to_currency ⇒ self
Conversion to self.
417 418 419 |
# File 'lib/money/currency.rb', line 417 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.
386 387 388 |
# File 'lib/money/currency.rb', line 386 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.
398 399 400 |
# File 'lib/money/currency.rb', line 398 def to_str id.to_s.upcase end |
#to_sym ⇒ Symbol
Returns a symbol representation corresponding to the upcase id
attribute.
410 411 412 |
# File 'lib/money/currency.rb', line 410 def to_sym id.to_s.upcase.to_sym end |