Skip to content

Commit

Permalink
Added :negative_format option to number_to_currency function [#5894 s…
Browse files Browse the repository at this point in the history
…tate:resolved]

Signed-off-by: Andrew White <andyw@pixeltrix.co.uk>
  • Loading branch information
dontangg authored and pixeltrix committed Nov 2, 2010
1 parent a682986 commit b913717
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 8 deletions.
23 changes: 16 additions & 7 deletions actionpack/lib/action_view/helpers/number_helper.rb
Expand Up @@ -14,7 +14,7 @@ module Helpers #:nodoc:
# unchanged if can't be converted into a valid number.
module NumberHelper

DEFAULT_CURRENCY_VALUES = { :format => "%u%n", :unit => "$", :separator => ".", :delimiter => ",",
DEFAULT_CURRENCY_VALUES = { :format => "%u%n", :negative_format => "-%u%n", :unit => "$", :separator => ".", :delimiter => ",",
:precision => 2, :significant => false, :strip_insignificant_zeros => false }

# Raised when argument +number+ param given to the helpers is invalid and
Expand Down Expand Up @@ -83,12 +83,13 @@ def number_to_phone(number, options = {})
# in the +options+ hash.
#
# ==== Options
# * <tt>:locale</tt> - Sets the locale to be used for formatting (defaults to current locale).
# * <tt>:precision</tt> - Sets the level of precision (defaults to 2).
# * <tt>:unit</tt> - Sets the denomination of the currency (defaults to "$").
# * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
# * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to ",").
# * <tt>:format</tt> - Sets the format of the output string (defaults to "%u%n"). The field types are:
# * <tt>:locale</tt> - Sets the locale to be used for formatting (defaults to current locale).
# * <tt>:precision</tt> - Sets the level of precision (defaults to 2).
# * <tt>:unit</tt> - Sets the denomination of the currency (defaults to "$").
# * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
# * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to ",").
# * <tt>:format</tt> - Sets the format of the output string (defaults to "%u%n").
# * <tt>:negative_format</tt> - Sets the format of the output string (defaults to "-" + :format). The field types are:
#
# %u The currency unit
# %n The number
Expand All @@ -99,6 +100,8 @@ def number_to_phone(number, options = {})
# number_to_currency(1234567890.506, :precision => 3) # => $1,234,567,890.506
# number_to_currency(1234567890.506, :locale => :fr) # => 1 234 567 890,506 €
#
# number_to_currency(1234567890.50, :negative_format => "(%u%n)")
# # => ($1,234,567,890.51)
# number_to_currency(1234567890.50, :unit => "&pound;", :separator => ",", :delimiter => "")
# # => &pound;1234567890,50
# number_to_currency(1234567890.50, :unit => "&pound;", :separator => ",", :delimiter => "", :format => "%n %u")
Expand All @@ -112,11 +115,17 @@ def number_to_currency(number, options = {})
currency = I18n.translate(:'number.currency.format', :locale => options[:locale], :default => {})

defaults = DEFAULT_CURRENCY_VALUES.merge(defaults).merge!(currency)
defaults[:negative_format] = "-" + options[:format] if options[:format]
options = defaults.merge!(options)

unit = options.delete(:unit)
format = options.delete(:format)

if number.to_f < 0
format = options.delete(:negative_format)
number = number.respond_to?("abs") ? number.abs : number.sub(/^-/, '')
end

begin
value = number_with_precision(number, options.merge(:raise => true))
format.gsub(/%n/, value).gsub(/%u/, unit).html_safe
Expand Down
5 changes: 4 additions & 1 deletion actionpack/test/template/number_helper_i18n_test.rb
Expand Up @@ -7,7 +7,7 @@ def setup
I18n.backend.store_translations 'ts',
:number => {
:format => { :precision => 3, :delimiter => ',', :separator => '.', :significant => false, :strip_insignificant_zeros => false },
:currency => { :format => { :unit => '&$', :format => '%u - %n', :precision => 2 } },
:currency => { :format => { :unit => '&$', :format => '%u - %n', :negative_format => '(%u - %n)', :precision => 2 } },
:human => {
:format => {
:precision => 2,
Expand Down Expand Up @@ -43,11 +43,14 @@ def setup

def test_number_to_currency
assert_equal("&$ - 10.00", number_to_currency(10, :locale => 'ts'))
assert_equal("(&$ - 10.00)", number_to_currency(-10, :locale => 'ts'))
assert_equal("-10.00 - &$", number_to_currency(-10, :locale => 'ts', :format => "%n - %u"))
end

def test_number_to_currency_with_clean_i18n_settings
clean_i18n do
assert_equal("$10.00", number_to_currency(10))
assert_equal("-$10.00", number_to_currency(-10))
end
end

Expand Down
4 changes: 4 additions & 0 deletions actionpack/test/template/number_helper_test.rb
Expand Up @@ -45,11 +45,15 @@ def test_number_to_phone
def test_number_to_currency
assert_equal("$1,234,567,890.50", number_to_currency(1234567890.50))
assert_equal("$1,234,567,890.51", number_to_currency(1234567890.506))
assert_equal("-$1,234,567,890.50", number_to_currency(-1234567890.50))
assert_equal("-$ 1,234,567,890.50", number_to_currency(-1234567890.50, {:format => "%u %n"}))
assert_equal("($1,234,567,890.50)", number_to_currency(-1234567890.50, {:negative_format => "(%u%n)"}))
assert_equal("$1,234,567,892", number_to_currency(1234567891.50, {:precision => 0}))
assert_equal("$1,234,567,890.5", number_to_currency(1234567890.50, {:precision => 1}))
assert_equal("&pound;1234567890,50", number_to_currency(1234567890.50, {:unit => "&pound;", :separator => ",", :delimiter => ""}))
assert_equal("$1,234,567,890.50", number_to_currency("1234567890.50"))
assert_equal("1,234,567,890.50 K&#269;", number_to_currency("1234567890.50", {:unit => "K&#269;", :format => "%n %u"}))
assert_equal("1,234,567,890.50 - K&#269;", number_to_currency("-1234567890.50", {:unit => "K&#269;", :format => "%n %u", :negative_format => "%n - %u"}))
end

def test_number_to_percentage
Expand Down

0 comments on commit b913717

Please sign in to comment.