Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #8172: number_to_currency_fix_for_negative_numbers.diff

File number_to_currency_fix_for_negative_numbers.diff, 3.0 kB (added by bgreenlee, 1 year ago)
  • actionpack/test/template/number_helper_test.rb

    old new  
    2020 
    2121  def test_number_to_currency 
    2222    assert_equal("$1,234,567,890.50", number_to_currency(1234567890.50)) 
     23    assert_equal("-$1,234,567,890.50", number_to_currency(-1234567890.50)) 
    2324    assert_equal("$1,234,567,890.51", number_to_currency(1234567890.506)) 
    2425    assert_equal("$1,234,567,892", number_to_currency(1234567891.50, {:precision => 0})) 
    2526    assert_equal("$1,234,567,890.5", number_to_currency(1234567890.50, {:precision => 1})) 
    2627    assert_equal("£1234567890,50", number_to_currency(1234567890.50, {:unit => "£", :separator => ",", :delimiter => ""})) 
     28    assert_equal("(£1234567890,50)", number_to_currency(-1234567890.50, {:unit => "£", :separator => ",", :delimiter => "", :negative_parens => true})) 
    2729    assert_equal("$1,234,567,890.50", number_to_currency("1234567890.50")) 
     30    assert_equal("-$1,234,567,890.50", number_to_currency("-1234567890.50")) 
     31    assert_equal("-$0.12", number_to_currency(-0.12)) 
     32    assert_equal("-$0.12", number_to_currency("-0.12")) 
     33    assert_equal("$0.12", number_to_currency(0.12))  
    2834    assert_equal("$x.", number_to_currency("x")) 
    2935    assert_nil number_to_currency(nil) 
    3036  end 
  • actionpack/lib/action_view/helpers/number_helper.rb

    old new  
    4646      # * <tt>:unit</tt>  - Sets the denomination of the currency, defaults to "$" 
    4747      # * <tt>:separator</tt>  - Sets the separator between the units, defaults to "." 
    4848      # * <tt>:delimiter</tt>  - Sets the thousands delimiter, defaults to "," 
     49      # * <tt>:negative_parens</tt> - Adds parentheses around negative numbers, defaults to false 
    4950      # 
    5051      #  number_to_currency(1234567890.50)     => $1,234,567,890.50 
    5152      #  number_to_currency(1234567890.506)    => $1,234,567,890.51 
     
    5859        unit      = options["unit"] || "$" 
    5960        separator = precision > 0 ? options["separator"] || "." : "" 
    6061        delimiter = options["delimiter"] || "," 
     62        negative_parens = options["negative_parens"] 
    6163 
    6264        begin 
    6365          parts = number_with_precision(number, precision).split('.') 
    64           unit + number_with_delimiter(parts[0], delimiter) + separator + parts[1].to_s 
     66          parts[0].sub!(/^-/,'') # remove minus sign (can't do number.abs because number may be a string) 
     67          number_str = unit + number_with_delimiter(parts[0], delimiter) + separator + parts[1].to_s           
     68          if number.to_f < 0 
     69            options["negative_parens"] ? "(#{number_str})" : "-#{number_str}" 
     70          else 
     71            number_str 
     72          end      
    6573        rescue 
    6674          number 
    6775        end