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_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 {|arg0| ... } ⇒ Object
rubocop:enable Naming/PredicateMethod.
-
.find(id) ⇒ Money::Currency
Lookup a currency with given +id+ an returns a +Currency+ 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 an +Currency+ instance on success, +nil+ otherwise.
-
.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 +Currency+ unless it's already a +Currency+ object.
Instance Method Summary collapse
-
#<=>(other) ⇒ -1, ...
Compares +self+ with +other_currency+ against the value of +priority+ attribute.
-
#==(other) ⇒ Boolean
Compares +self+ with +other_currency+ and returns +true+ if the are the same or if their +id+ attributes 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 +id+ attribute in order to use functions like & (intersection), group_by, etc.
-
#initialize(id) ⇒ Money::Currency
constructor
Create a new +Currency+ object.
-
#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 +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.
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 |