diff options
author | Sean Griffin <sean@thoughtbot.com> | 2014-05-21 07:44:42 -0700 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2014-05-21 07:44:42 -0700 |
commit | 30bf07d172f2764b27e887ff3a122ce3c08ff5fe (patch) | |
tree | a837466fc44970347c48445db8a2926a7cc8d189 /activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb | |
parent | b452e4a39b8a4a8880825cc1868df656ede7d609 (diff) | |
download | rails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.tar.gz rails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.tar.bz2 rails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.zip |
Move PG OID types to their own files
As we promote these classes to first class concepts, these classes are
starting to gain enough behavior to warrant being moved into their own
files. Many of them will become quite large as we move additional
behavior to the type objects.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb new file mode 100644 index 0000000000..1e34c09c88 --- /dev/null +++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb @@ -0,0 +1,37 @@ +module ActiveRecord + module ConnectionAdapters + module PostgreSQL + module OID # :nodoc: + class Money < Type::Decimal + include Infinity + + def extract_scale(sql_type) + 2 + end + + def cast_value(value) + 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.]/, '') + when /^-?\D+[\d.]+,\d{2}$/ # (2) + value.gsub!(/[^-\d,]/, '').sub!(/,/, '.') + end + + super(value) + end + end + end + end + end +end |