monetize 1.3.0 → 1.3.1

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: 38e7e5f39705dfc454cf5e40d7ba07aab4d8b5c1
4
- data.tar.gz: 58a057ce76a10410fd919e5b015c96eaccbb74a5
3
+ metadata.gz: bdb994a311b7519b56c417e4496a36bd6e41c377
4
+ data.tar.gz: f788b003d6412c6c3263b58736602f38be014c65
5
5
  SHA512:
6
- metadata.gz: 1cdfffde0b0b27e4b1d5fe929644808abee53edecc67d76a56d8b98e1d1ce51a66397bbf21b272644c44c4644d741ce84d22029267aec1d991021a3636cddbfd
7
- data.tar.gz: 2b68ae2631ddc16b55feec5a240870859e408d9e00e919b8b857bbf59af5fa632435c2c5f46892f88fab094dbb318064bdcad42d3fca196a2edf7e7eaa5d70fb
6
+ metadata.gz: 6c7435ede20d6b291da530a7c67876d347a2b484b46781ff5a7d040b4de6de6ce9c7f0378ef2179473e541c6b70223d6a793eb4c11911da0e38cc1e92a32e61a
7
+ data.tar.gz: 12d53e41df08426527aceb44dd598bcf4dcdd926e6cf8d279ad8ce81e16f00b68a9b0503079df141dec6aa62de58e1f0ad7d3b4dee292a1b366f43df9c489571
@@ -1,10 +1,14 @@
1
1
  # Changelog
2
2
 
3
3
  ## Master
4
- - ???
4
+ - Required Forwardable on Collection to resolve NameError [\#44](https://github.com/RubyMoney/monetize/issues/44)
5
+ - Add capability to parse currency amounts given with suffixes (K, M, B, and T)
5
6
 
6
7
  ## 1.3.0
7
8
  - Add NilClass extension
8
9
  - Added correct parsing of Brazilian Real $R symbol
9
10
  - Add testing task for Brazilian Real parsing
10
11
  - Add Lira Sign (₤) as a symbol for GBP
12
+
13
+ ## 1.3.1
14
+ - Updated Money version dependency to 6.6
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'monetize'
4
+ require 'forwardable'
4
5
 
5
6
  module Monetize
6
7
  class Collection
@@ -18,6 +18,15 @@ module Monetize
18
18
  "C$" => "CAD"
19
19
  }
20
20
 
21
+ MULTIPLIER_SUFFIXES = {
22
+ "K" => 3,
23
+ "M" => 6,
24
+ "B" => 9,
25
+ "T" => 12
26
+ }
27
+ MULTIPLIER_SUFFIXES.default = 0
28
+ MULTIPLIER_REGEXP = Regexp.new('\d(%s)\b[^\d]*$' % MULTIPLIER_SUFFIXES.keys.join('|'), 'i')
29
+
21
30
  # Class methods
22
31
  class << self
23
32
  # @attr_accessor [true, false] assume_from_symbol Use this to enable the
@@ -81,6 +90,9 @@ module Monetize
81
90
  end
82
91
 
83
92
  def self.extract_cents(input, currency = Money.default_currency)
93
+ multiplier_suffix = (matches = MULTIPLIER_REGEXP.match(input)) ? matches[1].upcase : nil
94
+ multiplier_exp = MULTIPLIER_SUFFIXES[multiplier_suffix]
95
+
84
96
  num = input.gsub(/[^\d.,'-]/, '')
85
97
 
86
98
  negative = num =~ /^-|-$/ ? true : false
@@ -138,7 +150,13 @@ module Monetize
138
150
  end
139
151
 
140
152
  cents = major.to_i * currency.subunit_to_unit
141
- minor = minor.to_s
153
+
154
+ cents *= (10 ** multiplier_exp)
155
+ minor = minor.to_s + ('0' * multiplier_exp)
156
+ shift = minor[0 ... multiplier_exp].to_i * 100
157
+ cents += shift
158
+ minor = (minor[multiplier_exp .. -1] || '')
159
+
142
160
  minor = if minor.size < currency.decimal_places
143
161
  (minor + ("0" * currency.decimal_places))[0,currency.decimal_places].to_i
144
162
  elsif minor.size > currency.decimal_places
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Monetize
4
- VERSION = "1.3.0"
4
+ VERSION = "1.3.1"
5
5
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "money", "~> 6.5.0"
21
+ spec.add_dependency "money", "~> 6.6"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
@@ -58,58 +58,66 @@ describe Monetize, "core extensions" do
58
58
  describe "#to_money" do
59
59
 
60
60
  STRING_TO_MONEY = {
61
- "20.15" => Money.new(20_15) ,
62
- "100" => Money.new(100_00) ,
63
- "100.37" => Money.new(100_37) ,
64
- "100,37" => Money.new(100_37) ,
65
- "100 000" => Money.new(100_000_00) ,
66
- "100,000.00" => Money.new(100_000_00) ,
67
- "1,000" => Money.new(1_000_00) ,
68
- "-1,000" => Money.new(-1_000_00) ,
69
- "1,000.5" => Money.new(1_000_50) ,
70
- "1,000.51" => Money.new(1_000_51) ,
71
- "1,000.505" => Money.new(1_000_51) ,
72
- "1,000.504" => Money.new(1_000_50) ,
73
- "1,000.0000" => Money.new(1_000_00) ,
74
- "1,000.5000" => Money.new(1_000_50) ,
75
- "1,000.5099" => Money.new(1_000_51) ,
76
- "1.550" => Money.new(1_55) ,
77
- "25." => Money.new(25_00) ,
78
- ".75" => Money.new(75) ,
79
-
80
- "100 USD" => Money.new(100_00, "USD") ,
81
- "-100 USD" => Money.new(-100_00, "USD") ,
82
- "100 EUR" => Money.new(100_00, "EUR") ,
83
- "100.37 EUR" => Money.new(100_37, "EUR") ,
84
- "100,37 EUR" => Money.new(100_37, "EUR") ,
85
- "100,000.00 USD" => Money.new(100_000_00, "USD") ,
86
- "100.000,00 EUR" => Money.new(100_000_00, "EUR") ,
87
- "1,000 USD" => Money.new(1_000_00, "USD") ,
88
- "-1,000 USD" => Money.new(-1_000_00, "USD") ,
89
- "1,000.5500 USD" => Money.new(1_000_55, "USD") ,
90
- "-1,000.6500 USD" => Money.new(-1_000_65, "USD") ,
91
- "1.550 USD" => Money.new(1_55, "USD") ,
92
-
93
- "USD 100" => Money.new(100_00, "USD") ,
94
- "EUR 100" => Money.new(100_00, "EUR") ,
95
- "EUR 100.37" => Money.new(100_37, "EUR") ,
96
- "CAD -100.37" => Money.new(-100_37, "CAD") ,
97
- "EUR 100,37" => Money.new(100_37, "EUR") ,
98
- "EUR -100,37" => Money.new(-100_37, "EUR") ,
99
- "USD 100,000.00" => Money.new(100_000_00, "USD") ,
100
- "EUR 100.000,00" => Money.new(100_000_00, "EUR") ,
101
- "USD 1,000" => Money.new(1_000_00, "USD") ,
102
- "USD -1,000" => Money.new(-1_000_00, "USD") ,
103
- "USD 1,000.9000" => Money.new(1_000_90, "USD") ,
104
- "USD -1,000.090" => Money.new(-1_000_09, "USD") ,
105
- "USD 1.5500" => Money.new(1_55, "USD") ,
106
-
107
- "$100 USD" => Money.new(100_00, "USD") ,
108
- "$1,194.59 USD" => Money.new(1_194_59, "USD") ,
109
- "$-1,955 USD" => Money.new(-1_955_00, "USD") ,
110
- "$1,194.5900 USD" => Money.new(1_194_59, "USD") ,
111
- "$-1,955.000 USD" => Money.new(-1_955_00, "USD") ,
112
- "$1.99000 USD" => Money.new(1_99, "USD") ,
61
+ "20.15" => Money.new(20_15) ,
62
+ "100" => Money.new(100_00) ,
63
+ "100.37" => Money.new(100_37) ,
64
+ "100,37" => Money.new(100_37) ,
65
+ "100 000" => Money.new(100_000_00) ,
66
+ "100,000.00" => Money.new(100_000_00) ,
67
+ "1,000" => Money.new(1_000_00) ,
68
+ "-1,000" => Money.new(-1_000_00) ,
69
+ "1,000.5" => Money.new(1_000_50) ,
70
+ "1,000.51" => Money.new(1_000_51) ,
71
+ "1,000.505" => Money.new(1_000_51) ,
72
+ "1,000.504" => Money.new(1_000_50) ,
73
+ "1,000.0000" => Money.new(1_000_00) ,
74
+ "1,000.5000" => Money.new(1_000_50) ,
75
+ "1,000.5099" => Money.new(1_000_51) ,
76
+ "1.550" => Money.new(1_55) ,
77
+ "25." => Money.new(25_00) ,
78
+ ".75" => Money.new(75) ,
79
+
80
+ "7.21K" => Money.new(7_210_00) ,
81
+ "1M" => Money.new(1_000_000_00) ,
82
+ "1.2M" => Money.new(1_200_000_00) ,
83
+ "1.37M" => Money.new(1_370_000_00) ,
84
+ "3.1415927M" => Money.new(3_141_592_70) ,
85
+ ".42B" => Money.new(420_000_000_00) ,
86
+ "5T" => Money.new(5_000_000_000_000_00) ,
87
+
88
+ "100 USD" => Money.new(100_00, "USD") ,
89
+ "-100 USD" => Money.new(-100_00, "USD") ,
90
+ "100 EUR" => Money.new(100_00, "EUR") ,
91
+ "100.37 EUR" => Money.new(100_37, "EUR") ,
92
+ "100,37 EUR" => Money.new(100_37, "EUR") ,
93
+ "100,000.00 USD" => Money.new(100_000_00, "USD") ,
94
+ "100.000,00 EUR" => Money.new(100_000_00, "EUR") ,
95
+ "1,000 USD" => Money.new(1_000_00, "USD") ,
96
+ "-1,000 USD" => Money.new(-1_000_00, "USD") ,
97
+ "1,000.5500 USD" => Money.new(1_000_55, "USD") ,
98
+ "-1,000.6500 USD" => Money.new(-1_000_65, "USD") ,
99
+ "1.550 USD" => Money.new(1_55, "USD") ,
100
+
101
+ "USD 100" => Money.new(100_00, "USD") ,
102
+ "EUR 100" => Money.new(100_00, "EUR") ,
103
+ "EUR 100.37" => Money.new(100_37, "EUR") ,
104
+ "CAD -100.37" => Money.new(-100_37, "CAD") ,
105
+ "EUR 100,37" => Money.new(100_37, "EUR") ,
106
+ "EUR -100,37" => Money.new(-100_37, "EUR") ,
107
+ "USD 100,000.00" => Money.new(100_000_00, "USD") ,
108
+ "EUR 100.000,00" => Money.new(100_000_00, "EUR") ,
109
+ "USD 1,000" => Money.new(1_000_00, "USD") ,
110
+ "USD -1,000" => Money.new(-1_000_00, "USD") ,
111
+ "USD 1,000.9000" => Money.new(1_000_90, "USD") ,
112
+ "USD -1,000.090" => Money.new(-1_000_09, "USD") ,
113
+ "USD 1.5500" => Money.new(1_55, "USD") ,
114
+
115
+ "$100 USD" => Money.new(100_00, "USD") ,
116
+ "$1,194.59 USD" => Money.new(1_194_59, "USD") ,
117
+ "$-1,955 USD" => Money.new(-1_955_00, "USD") ,
118
+ "$1,194.5900 USD" => Money.new(1_194_59, "USD") ,
119
+ "$-1,955.000 USD" => Money.new(-1_955_00, "USD") ,
120
+ "$1.99000 USD" => Money.new(1_99, "USD") ,
113
121
  }
114
122
 
115
123
  it "works as documented" do
@@ -95,6 +95,13 @@ describe Monetize do
95
95
  expect(Monetize.parse("€9.99+")).to eq Money.new(999, 'EUR')
96
96
  end
97
97
 
98
+ it 'parses formatted inputs with amounts given with suffixes' do
99
+ expect(Monetize.parse('$1.26K')).to eq Money.new(1_260_00, 'USD')
100
+ expect(Monetize.parse('$126.36M')).to eq Money.new(126_360_000_00, 'USD')
101
+ expect(Monetize.parse('€.45B')).to eq Money.new(450_000_000_00, 'EUR')
102
+ expect(Monetize.parse('-$2.45B')).to eq Money.new(-2_450_000_000_00, 'USD')
103
+ expect(Monetize.parse('€1.65T')).to eq Money.new(1_650_000_000_000_00, 'EUR')
104
+ end
98
105
  end
99
106
 
100
107
  context 'opted out' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monetize
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Emmons
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-29 00:00:00.000000000 Z
11
+ date: 2015-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: money
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 6.5.0
19
+ version: '6.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 6.5.0
26
+ version: '6.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  version: '0'
116
116
  requirements: []
117
117
  rubyforge_project:
118
- rubygems_version: 2.2.2
118
+ rubygems_version: 2.4.5
119
119
  signing_key:
120
120
  specification_version: 4
121
121
  summary: A library for converting various objects into `Money` objects.