d12n 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abcfcf50cfc7704732eb93a84fca8dacb37e6347
4
- data.tar.gz: 7ef57e5988fd6d9185032db1dcaf1cfb48a602ce
3
+ metadata.gz: 9fab51c4115aeaa16486a5319ea6cdb9f63eef5f
4
+ data.tar.gz: b98690bb15e012314d65b65594e9ca1f8e8e006c
5
5
  SHA512:
6
- metadata.gz: c8241902f3b72b64ed42ee7969b3eedf1165b988636f8508e467cd085f4dfa1cd179709c5021a2b410ef3ff0f204039c512f5bfe7345e613ac181381f3825bf6
7
- data.tar.gz: 0a64084146dd829f4f1ae50140ff74d1bcb5edde9dc649964cd4eb4c1efa2b4c45903930ffa8ac90535616c474680b2186b76159d263498e80d3c67a89799aa8
6
+ metadata.gz: 359787933d7c1c15f9a6c41e905a1a28808d3bc8ae29364f7cba35080c7f0614ea351ea5c04470cc4f49faedd0f45a50e0f02ceb9f542e88d6703fb525baa9eb
7
+ data.tar.gz: ee41ec45117aeb4e02d698aa08f0b901b4c025e1c53051f3bacc62c8c7fc2399d061557e97b2780f6358b1eab35d20e5200bc00940b74708fefaf2cde1ad323a
data/README.md CHANGED
@@ -17,7 +17,7 @@ class Dummy
17
17
  include D12n::ModelSupport
18
18
 
19
19
  attr_accessor :amount
20
- d12n_attribute :amount
20
+ d12n_attribute :amount, factor: 100
21
21
  end
22
22
  ```
23
23
 
@@ -49,3 +49,23 @@ d12n_attribute :amount, prefix: 'localized'
49
49
  ```
50
50
 
51
51
  Would give you `localized_amount` instead of `local_amount`.
52
+
53
+ ### Internal integer representation with a factor
54
+
55
+ If your internal representation is for example in cents, but the local format should be EUR with decimal point
56
+ you can use this option:
57
+
58
+ ```ruby
59
+ d12n_attribute :amount, factor: 100
60
+ ```
61
+
62
+ ```ruby
63
+ d = Dummy.new
64
+
65
+ d.amount = 1_234
66
+ d.local_amount # "12,34"
67
+
68
+ d.local_amount = '3,456.78'
69
+ d.amount.class # Integer
70
+ d.amount # 345_678
71
+ ```
data/lib/d12n.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'active_support'
2
+ require 'active_support/core_ext/hash'
2
3
  require 'bigdecimal'
3
4
 
4
5
  module D12n
@@ -3,28 +3,34 @@ module D12n
3
3
  module ClassMethods
4
4
  def d12n_attribute(*args)
5
5
  options = args.extract_options!
6
- prefix = options[:prefix] || 'local'
6
+ options.reverse_merge! prefix: 'local'
7
7
  args.each do |name|
8
- define_reader name, prefix
9
- define_writer name, prefix
8
+ define_reader name, options
9
+ define_writer name, options
10
10
  end
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- def define_reader(name, prefix)
16
- define_method "#{prefix}_#{name}" do
17
- local = instance_variable_get "@#{prefix}_#{name}"
15
+ def define_reader(name, options)
16
+ define_method "#{options[:prefix]}_#{name}" do
17
+ local = instance_variable_get "@#{options[:prefix]}_#{name}"
18
18
  return local if local
19
- ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(send(name), {})
19
+ number = send(name)
20
+ # If a factor is defined, internal presentation is an integer multiple of the local value
21
+ number /= options[:factor].to_f if options[:factor]
22
+ D12n.strategy.bigdecimal_to_formatted(number)
20
23
  end
21
24
  end
22
25
 
23
- def define_writer(name, prefix)
24
- define_method "#{prefix}_#{name}=" do |val|
26
+ def define_writer(name, options)
27
+ define_method "#{options[:prefix]}_#{name}=" do |val|
25
28
  begin
26
- instance_variable_set "@#{prefix}_#{name}", val
27
- send "#{name}=", D12n.strategy.number_to_bigdecimal(val)
29
+ instance_variable_set "@#{options[:prefix]}_#{name}", val
30
+ number = D12n.strategy.formatted_to_bigdecimal(val)
31
+ # If a factor is defined, internal presentation is an integer multiple of the local value
32
+ number = (number * options[:factor].to_f).to_i if options[:factor]
33
+ send "#{name}=", number
28
34
  val
29
35
  rescue ArgumentError
30
36
  val
@@ -6,9 +6,13 @@ module D12n
6
6
  extend self
7
7
 
8
8
  # must raise ArgumentError when format is invalid
9
- def number_to_bigdecimal(formatted)
9
+ def formatted_to_bigdecimal(formatted)
10
10
  BigDecimal.new formatted.tr('.', '').tr(',', '.')
11
11
  end
12
+
13
+ def bigdecimal_to_formatted(internal)
14
+ ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(internal, {})
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -6,9 +6,13 @@ module D12n
6
6
  extend self
7
7
 
8
8
  # must raise ArgumentError when format is invalid
9
- def number_to_bigdecimal(formatted)
9
+ def formatted_to_bigdecimal(formatted)
10
10
  BigDecimal.new formatted.tr(',', '')
11
11
  end
12
+
13
+ def bigdecimal_to_formatted(internal)
14
+ ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(internal, {})
15
+ end
12
16
  end
13
17
  end
14
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: d12n
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkon