diff --git a/lib/monetize.rb b/lib/monetize.rb index 1ec63d360..ca5e3eec1 100644 --- a/lib/monetize.rb +++ b/lib/monetize.rb @@ -68,5 +68,17 @@ def from_numeric(value, currency = Money.default_currency) fail ArgumentError, "'value' should be a type of Numeric" unless value.is_a?(Numeric) Money.from_amount(value, currency) end + + def register_currency_symbol(symbol, iso_code) + Monetize::Parser.register_currency_symbol(symbol, iso_code) + end + + def unregister_currency_symbol(symbol) + Monetize::Parser.unregister_currency_symbol(symbol) + end + + def reset_currency_symbols! + Monetize::Parser.reset_currency_symbols! + end end end diff --git a/lib/monetize/parser.rb b/lib/monetize/parser.rb index 02a6b328f..c1d3d96eb 100644 --- a/lib/monetize/parser.rb +++ b/lib/monetize/parser.rb @@ -1,6 +1,12 @@ module Monetize class Parser - CURRENCY_SYMBOLS = { + MULTIPLIER_SUFFIXES = { 'K' => 3, 'M' => 6, 'B' => 9, 'T' => 12 } + MULTIPLIER_SUFFIXES.default = 0 + MULTIPLIER_REGEXP = /^(.*?\d)(#{MULTIPLIER_SUFFIXES.keys.join('|')})\b([^\d]*)$/i + + DEFAULT_DECIMAL_MARK = '.'.freeze + + @@original_currency_symbols = { '$' => 'USD', '€' => 'EUR', '£' => 'GBP', @@ -26,15 +32,38 @@ class Parser 'S$' => 'SGD', 'HK$'=> 'HKD', 'NT$'=> 'TWD', - '₱' => 'PHP', - } + '₱' => 'PHP' + }.freeze - CURRENCY_SYMBOL_REGEX = /(? 3, 'M' => 6, 'B' => 9, 'T' => 12 } - MULTIPLIER_SUFFIXES.default = 0 - MULTIPLIER_REGEXP = Regexp.new(format('^(.*?\d)(%s)\b([^\d]*)$', MULTIPLIER_SUFFIXES.keys.join('|')), 'i') + class << self + def currency_symbols + @@currency_symbols ||= @@original_currency_symbols.dup + end - DEFAULT_DECIMAL_MARK = '.'.freeze + def register_currency_symbol(symbol, iso_code) + currency_symbols[symbol] = iso_code + + reset_currency_symbol_regex + end + + def unregister_currency_symbol(symbol) + currency_symbols.delete(symbol) + reset_currency_symbol_regex + end + + def reset_currency_symbols! + @@currency_symbols = @@original_currency_symbols.dup + reset_currency_symbol_regex + end + + def currency_symbol_regex + @@currency_symbol_regex ||= /(?