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 +4 -4
- data/CHANGELOG.md +5 -1
- data/lib/collection.rb +1 -0
- data/lib/monetize.rb +19 -1
- data/lib/monetize/version.rb +1 -1
- data/monetize.gemspec +1 -1
- data/spec/core_extensions_spec.rb +60 -52
- data/spec/monetize_spec.rb +7 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdb994a311b7519b56c417e4496a36bd6e41c377
|
4
|
+
data.tar.gz: f788b003d6412c6c3263b58736602f38be014c65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c7435ede20d6b291da530a7c67876d347a2b484b46781ff5a7d040b4de6de6ce9c7f0378ef2179473e541c6b70223d6a793eb4c11911da0e38cc1e92a32e61a
|
7
|
+
data.tar.gz: 12d53e41df08426527aceb44dd598bcf4dcdd926e6cf8d279ad8ce81e16f00b68a9b0503079df141dec6aa62de58e1f0ad7d3b4dee292a1b366f43df9c489571
|
data/CHANGELOG.md
CHANGED
@@ -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
|
data/lib/collection.rb
CHANGED
data/lib/monetize.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/monetize/version.rb
CHANGED
data/monetize.gemspec
CHANGED
@@ -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.
|
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
|
-
"
|
81
|
-
"
|
82
|
-
"
|
83
|
-
"
|
84
|
-
"
|
85
|
-
"
|
86
|
-
"
|
87
|
-
|
88
|
-
"
|
89
|
-
"
|
90
|
-
"
|
91
|
-
"
|
92
|
-
|
93
|
-
"USD
|
94
|
-
"EUR
|
95
|
-
"
|
96
|
-
"
|
97
|
-
"
|
98
|
-
"
|
99
|
-
"USD
|
100
|
-
|
101
|
-
"USD
|
102
|
-
"
|
103
|
-
"
|
104
|
-
"
|
105
|
-
"
|
106
|
-
|
107
|
-
"
|
108
|
-
"
|
109
|
-
"
|
110
|
-
"
|
111
|
-
"
|
112
|
-
"
|
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
|
data/spec/monetize_spec.rb
CHANGED
@@ -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.
|
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-
|
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.
|
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.
|
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.
|
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.
|