aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2013-12-02 22:12:36 -0200
committerRafael Mendonça França <rafaelmfranca@gmail.com>2013-12-02 22:12:36 -0200
commitd3b93e403b3d0c11607e037770ad91c062b2e897 (patch)
tree1fe5f112d215cf72887835b6190f50400767e4dc /activesupport/lib/active_support/number_helper/number_to_currency_converter.rb
parentfc73ebf332c4dbd36dcf7e7a39a0e120b7680bd2 (diff)
downloadrails-d3b93e403b3d0c11607e037770ad91c062b2e897.tar.gz
rails-d3b93e403b3d0c11607e037770ad91c062b2e897.tar.bz2
rails-d3b93e403b3d0c11607e037770ad91c062b2e897.zip
Make load of NumberHelper thread safe
Diffstat (limited to 'activesupport/lib/active_support/number_helper/number_to_currency_converter.rb')
-rw-r--r--activesupport/lib/active_support/number_helper/number_to_currency_converter.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb b/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb
new file mode 100644
index 0000000000..113e557415
--- /dev/null
+++ b/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb
@@ -0,0 +1,48 @@
+module ActiveSupport
+ module NumberHelper
+ class NumberToCurrencyConverter < NumberConverter # :nodoc:
+
+ self.namespace = :currency
+
+ def convert
+ number = @number.to_s.strip
+ format = options[:format]
+
+ if is_negative?(number)
+ format = options[:negative_format]
+ number = absolute_value(number)
+ end
+
+ rounded_number = NumberToRoundedConverter.new(number, options).execute
+ format.gsub('%n', rounded_number).gsub('%u', options[:unit])
+ end
+
+ private
+
+ def is_negative?(number)
+ number.to_f.phase != 0
+ end
+
+ def absolute_value(number)
+ number.respond_to?("abs") ? number.abs : number.sub(/\A-/, '')
+ end
+
+ def options
+ @options ||= begin
+ defaults = default_format_options.merge(i18n_opts)
+ # Override negative format if format options is given
+ defaults[:negative_format] = "-#{opts[:format]}" if opts[:format]
+ defaults.merge(opts)
+ end
+ end
+
+ def i18n_opts
+ # Set International negative format if not exists
+ i18n = i18n_format_options
+ i18n[:negative_format] ||= "-#{i18n[:format]}" if i18n[:format]
+ i18n
+ end
+
+ end
+ end
+end