monetize 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.