1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

PG adapter deals with negative money values formatted with parenthesis.

Closes #11899.
This commit is contained in:
Yves Senn 2013-08-26 11:14:56 +02:00
parent 078da2b22d
commit 27dc4fa28e
3 changed files with 19 additions and 0 deletions

View file

@ -1,3 +1,9 @@
* PostgreSQL adapter recognizes negative money values formatted with
parentheses (eg. `($1.25) # => -1.25`)).
Fixes #11899.
* Yves Senn*
* Stop interpreting SQL 'string' columns as :string type because there is no
common STRING datatype in SQL.

View file

@ -34,12 +34,17 @@ module ActiveRecord
class Money < Type
def type_cast(value)
return if value.nil?
return value unless String === value
# Because money output is formatted according to the locale, there are two
# cases to consider (note the decimal separators):
# (1) $12,345,678.12
# (2) $12.345.678,12
# Negative values are represented as follows:
# (3) -$2.55
# (4) ($2.55)
value.sub!(/^\((.+)\)$/, '-\1') # (4)
case value
when /^-?\D+[\d,]+\.\d{2}$/ # (1)
value.gsub!(/[^-\d.]/, '')

View file

@ -298,6 +298,14 @@ _SQL
assert_equal(-567.89, @second_money.wealth)
end
def test_money_type_cast
column = PostgresqlMoney.columns.find { |c| c.name == 'wealth' }
assert_equal(12345678.12, column.type_cast("$12,345,678.12"))
assert_equal(12345678.12, column.type_cast("$12.345.678,12"))
assert_equal(-1.15, column.type_cast("-$1.15"))
assert_equal(-2.25, column.type_cast("($2.25)"))
end
def test_create_tstzrange
skip "PostgreSQL 9.2 required for range datatypes" unless @connection.supports_ranges?
tstzrange = Time.parse('2010-01-01 14:30:00 +0100')...Time.parse('2011-02-02 14:30:00 CDT')