Module: Monetize
- Defined in:
- lib/monetize.rb,
lib/collection.rb,
lib/monetize/errors.rb,
lib/monetize/version.rb
Defined Under Namespace
Classes: ArgumentError, Collection, Error, ParseError
Constant Summary collapse
- CURRENCY_SYMBOLS =
{ '$' => 'USD', '€' => 'EUR', '£' => 'GBP', '₤' => 'GBP', 'R$' => 'BRL', 'R' => 'ZAR', '¥' => 'JPY', 'C$' => 'CAD', '₼' => 'AZN', '元' => 'CNY', 'Kč' => 'CZK', 'Ft' => 'HUF', '₹' => 'INR', '₽' => 'RUB', '₺' => 'TRY', '₴' => 'UAH', 'Fr' => 'CHF', 'zł' => 'PLN', '₸' => 'KZT', }
- MULTIPLIER_SUFFIXES =
{ 'K' => 3, 'M' => 6, 'B' => 9, 'T' => 12 }
- MULTIPLIER_REGEXP =
Regexp.new(format('^(.*?\d)(%s)\b([^\d]*)$', MULTIPLIER_SUFFIXES.keys.join('|')), 'i')
- VERSION =
'1.6.0'
Class Attribute Summary collapse
-
.assume_from_symbol ⇒ Object
Returns the value of attribute assume_from_symbol.
-
.enforce_currency_delimiters ⇒ Object
Monetize uses the delimiters set in the currency to separate integers from decimals, and to ignore thousands separators.
Class Method Summary collapse
- .extract_cents(input, currency = Money.default_currency) ⇒ Object
- .from_bigdecimal(value, currency = Money.default_currency) ⇒ Object
- .from_fixnum(value, currency = Money.default_currency) ⇒ Object
- .from_float(value, currency = Money.default_currency) ⇒ Object
- .from_numeric(value, currency = Money.default_currency) ⇒ Object
- .from_string(value, currency = Money.default_currency) ⇒ Object
- .parse(input, currency = Money.default_currency, options = {}) ⇒ Object
- .parse!(input, currency = Money.default_currency, options = {}) ⇒ Object
- .parse_collection(input, currency = Money.default_currency, options = {}) ⇒ Object
Class Attribute Details
.assume_from_symbol ⇒ Object
Returns the value of attribute assume_from_symbol.
45 46 47 |
# File 'lib/monetize.rb', line 45 def assume_from_symbol @assume_from_symbol end |
.enforce_currency_delimiters ⇒ Object
Monetize uses the delimiters set in the currency to separate integers from decimals, and to ignore thousands separators. In some corner cases, though, it will try to determine the correct separator by itself. Set this to true to enforce the delimiters set in the currency all the time.
51 52 53 |
# File 'lib/monetize.rb', line 51 def enforce_currency_delimiters @enforce_currency_delimiters end |
Class Method Details
.extract_cents(input, currency = Money.default_currency) ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/monetize.rb', line 121 def self.extract_cents(input, currency = Money.default_currency) multiplier_exp, input = extract_multiplier(input) num = input.gsub(/(?:^#{currency.symbol}|[^\d.,'-]+)/, '') negative, num = extract_sign(num) num.chop! if num.match(/[\.|,]$/) major, minor = extract_major_minor(num, currency) major, minor = apply_multiplier(multiplier_exp, major.to_i, minor) cents = major.to_i * currency.subunit_to_unit cents += set_minor_precision(minor, currency) apply_sign(negative, cents) end |
.from_bigdecimal(value, currency = Money.default_currency) ⇒ Object
102 103 104 105 106 107 |
# File 'lib/monetize.rb', line 102 def self.from_bigdecimal(value, currency = Money.default_currency) currency = Money::Currency.wrap(currency) value *= currency.subunit_to_unit value = value.round unless Money.infinite_precision Money.new(value, currency) end |
.from_fixnum(value, currency = Money.default_currency) ⇒ Object
90 91 92 93 94 |
# File 'lib/monetize.rb', line 90 def self.from_fixnum(value, currency = Money.default_currency) currency = Money::Currency.wrap(currency) value *= currency.subunit_to_unit Money.new(value, currency) end |
.from_float(value, currency = Money.default_currency) ⇒ Object
97 98 99 100 |
# File 'lib/monetize.rb', line 97 def self.from_float(value, currency = Money.default_currency) value = BigDecimal.new(value.to_s) from_bigdecimal(value, currency) end |
.from_numeric(value, currency = Money.default_currency) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/monetize.rb', line 109 def self.from_numeric(value, currency = Money.default_currency) case value when Integer from_fixnum(value, currency) when Numeric value = BigDecimal.new(value.to_s) from_bigdecimal(value, currency) else fail ArgumentError, "'value' should be a type of Numeric" end end |
.from_string(value, currency = Money.default_currency) ⇒ Object
85 86 87 88 |
# File 'lib/monetize.rb', line 85 def self.from_string(value, currency = Money.default_currency) value = BigDecimal.new(value.to_s) from_bigdecimal(value, currency) end |
.parse(input, currency = Money.default_currency, options = {}) ⇒ Object
54 55 56 57 58 |
# File 'lib/monetize.rb', line 54 def self.parse(input, currency = Money.default_currency, = {}) parse! input, currency, rescue Error nil end |
.parse!(input, currency = Money.default_currency, options = {}) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/monetize.rb', line 60 def self.parse!(input, currency = Money.default_currency, = {}) return input if input.is_a?(Money) return from_numeric(input, currency) if input.is_a?(Numeric) input = input.to_s.strip computed_currency = if .fetch(:assume_from_symbol) { assume_from_symbol } compute_currency(input) else input[/[A-Z]{2,3}/] end currency = computed_currency || currency || Money.default_currency currency = Money::Currency.wrap(currency) fractional = extract_cents(input, currency) Money.new(fractional, currency) rescue Money::Currency::UnknownCurrency => e fail ParseError, e. end |
.parse_collection(input, currency = Money.default_currency, options = {}) ⇒ Object
81 82 83 |
# File 'lib/monetize.rb', line 81 def self.parse_collection(input, currency = Money.default_currency, = {}) Collection.parse(input, currency, ) end |