Commit f88dad03825e0e8aadb17d0b902239cd3781c142

Authored by Rodrigo Souto
Committed by Antonio Terceiro
1 parent 6a196432

Products accepts prices in brazilian's or american's format

  * Brazilian's currency format: 123.456,78
  * American's currency format: 123,456.78

ActionItem1322
app/models/product.rb
... ... @@ -67,4 +67,36 @@ class Product < ActiveRecord::Base
67 67 enterprise.public_profile
68 68 end
69 69  
  70 + def price=(value)
  71 + if value.is_a?(String)
  72 + super(currency_to_float(value))
  73 + else
  74 + super(value)
  75 + end
  76 + end
  77 +
  78 + def currency_to_float( num )
  79 + if num.count('.') == 1 && num.count(',') == 0
  80 + # number like "12.34"
  81 + return num.to_f
  82 + end
  83 +
  84 + if num.count('.') == 0 && num.count(',') == 1
  85 + # number like "12,34"
  86 + return num.tr(',','.').to_f
  87 + end
  88 +
  89 + if num.count('.') > 0 && num.count(',') > 0
  90 + # number like "12.345.678,90" or "12,345,678.90"
  91 + dec_sep = num.tr('0-9','')[-1].chr
  92 + return num.tr('^0-9'+dec_sep,'').tr(dec_sep,'.').to_f
  93 + end
  94 +
  95 + # if you are here is because there is only one
  96 + # separator and this appears 2 times or more.
  97 + # number like "12.345.678" or "12,345,678"
  98 +
  99 + return num.tr(',.','').to_f
  100 + end
  101 +
70 102 end
... ...
test/unit/product_test.rb
... ... @@ -178,4 +178,19 @@ class ProductTest < Test::Unit::TestCase
178 178 assert !p1.public?
179 179 end
180 180  
  181 + should 'accept prices in american\'s or brazilian\'s currency format' do
  182 + [
  183 + [12.34, 12.34],
  184 + ["12.34", 12.34],
  185 + ["12,34", 12.34],
  186 + ["12.345.678,90", 12345678.90],
  187 + ["12,345,678.90", 12345678.90],
  188 + ["12.345.678", 12345678.00],
  189 + ["12,345,678", 12345678.00]
  190 + ].each do |input, output|
  191 + product = Product.new(:price => input)
  192 + assert_equal output, product.price
  193 + end
  194 + end
  195 +
181 196 end
... ...