currency_helper.rb
2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module CurrencyHelper
extend ActionView::Helpers::NumberHelper
def self.parse_localized_number number
return 0 if number.blank?
number = number.to_s
number.gsub! I18n.t("number.currency.format.unit"), ''
begin
# try simple conversation, in case it is a non localized number
# this is the case of <input type=number />
number = Float number
rescue
number.gsub! I18n.t("number.currency.format.delimiter"), ''
number.gsub! I18n.t("number.currency.format.separator"), '.'
number = number.to_f
end
number
end
def self.parse_currency currency
self.parse_localized_number currency
end
def self.localized_number number
# the maximum precision is 2, and we don't use number_with_precision
# as we don't wan't a fixed precision (e.g. 1.00 is just 1.0)
number_with_delimiter number.to_f.round 2
end
def self.number_as_currency_number number
string = number_to_currency number, unit: ''
string.gsub! ' ', '' if string
string
end
def self.number_as_currency number
number_to_currency number
end
module ClassMethods
def has_number_with_locale attr
# rake db:migrate run?
return unless self.table_exists?
# Rails doesn't define getters and setters for attributes
define_method attr do
self[attr]
end if attr.to_s.in? self.column_names and not method_defined? attr
define_method "#{attr}=" do |value|
self[attr] = value
end if attr.to_s.in? self.column_names and not method_defined? "#{attr}="
if method_defined? "#{attr}="
define_method "#{attr}_with_locale=" do |value|
value = CurrencyHelper.parse_localized_number value if value.is_a? String
self.send "#{attr}_without_locale=", value
end
alias_method_chain "#{attr}=", :locale
end
define_method "#{attr}_localized" do |*args, &block|
number = self.send attr, *args, &block
CurrencyHelper.localized_number number
end
end
def has_currency attr
self.has_number_with_locale attr
define_method "#{attr}_as_currency" do |*args, &block|
number = self.send attr, *args, &block
CurrencyHelper.number_as_currency number
end
define_method "#{attr}_as_currency_number" do |*args, &block|
number = self.send attr, *args, &block
CurrencyHelper.number_as_currency_number number
end
end
end
module InstanceMethods
end
end