money 5.1.0 → 5.1.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.
- data/CHANGELOG.md +12 -2
- data/README.md +23 -2
- data/config/currency.json +2 -2
- data/lib/money/currency.rb +30 -1
- data/lib/money/money.rb +5 -1
- data/lib/money/money/formatting.rb +50 -5
- data/money.gemspec +3 -3
- data/spec/bank/variable_exchange_spec.rb +4 -4
- data/spec/currency_spec.rb +31 -2
- data/spec/money/arithmetic_spec.rb +6 -6
- data/spec/money/formatting_spec.rb +45 -0
- data/spec/money/parsing_spec.rb +5 -5
- data/spec/money_spec.rb +30 -0
- metadata +20 -19
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## 5.1.1
|
4
|
+
|
5
|
+
- Added :sign_before_symbol option to format negative numbers as -£1 rather than £-1
|
6
|
+
- Ensure BigDecimal.new always receives a string - compatibility fix for ruby-1.9.2-p320
|
7
|
+
- Update Maldivian Currency to MVR and fix ރ. to be ރ
|
8
|
+
- Add exponent to currency
|
9
|
+
- Add find_numeric to find currencies by ISO 4217 numeric code.
|
10
|
+
- Fixed regression where thousands separator was missing on certain currencies. (GH-245)
|
11
|
+
- Added :symbol_before_without_space option to add a space between currency symbol and amount.
|
12
|
+
|
13
|
+
## 5.1.0
|
4
14
|
|
5
15
|
- Fix currency assumption when parsing $ with a non-USD default currency.
|
6
16
|
- Changed the Bulgarian lev symbol position from before the amount to after the amount.
|
@@ -35,7 +45,7 @@
|
|
35
45
|
|
36
46
|
## 5.0.0
|
37
47
|
|
38
|
-
- Minor bugfix - incorrect use of character range resulted in
|
48
|
+
- Minor bugfix - incorrect use of character range resulted in
|
39
49
|
botched results for Money::Parsing#extract_cents (GH-162)
|
40
50
|
- Money::Currency::TABLE removed. Use Money::Currency.register to add
|
41
51
|
additional currencies (GH-143)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# RubyMoney - Money
|
2
2
|
|
3
|
-
[](http://badge.fury.io/rb/money) [](https://travis-ci.org/RubyMoney/money) [](https://codeclimate.com/github/RubyMoney/money)
|
4
4
|
|
5
5
|
## Contributing
|
6
6
|
|
@@ -186,6 +186,27 @@ Money.default_currency = Money::Currency.new("CAD")
|
|
186
186
|
|
187
187
|
If you use Rails, then `environment.rb` is a very good place to put this.
|
188
188
|
|
189
|
+
### Currency Exponent
|
190
|
+
|
191
|
+
The exponent of a money value is the number of digits after the decimal
|
192
|
+
separator (which separates the major unit from the minor unit). See e.g.
|
193
|
+
[Wikipedia on ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) for more
|
194
|
+
information. You can find the exponent (as a `Float`) by
|
195
|
+
|
196
|
+
``` ruby
|
197
|
+
Money::Currency.new("USD").exponent # => 2.0
|
198
|
+
Money::Currency.new("JPY").exponent # => 0.0
|
199
|
+
Money::Currency.new("MGA").exponent # => 0.6989700043360189
|
200
|
+
```
|
201
|
+
|
202
|
+
### Currency Lookup
|
203
|
+
|
204
|
+
To find a given currency by ISO 4217 numeric code (three digits) you can do
|
205
|
+
|
206
|
+
``` ruby
|
207
|
+
Money::Currency.find_by_iso_numeric(978) #=> Money::Currency.new(:eur)
|
208
|
+
```
|
209
|
+
|
189
210
|
## Currency Exchange
|
190
211
|
|
191
212
|
Exchanging money is performed through an exchange bank object. The default
|
@@ -233,4 +254,4 @@ implementations.
|
|
233
254
|
|
234
255
|
To integrate money in a Rails application use [money-rails](http://github.com/RubyMoney/money-rails).
|
235
256
|
|
236
|
-
For depreceated methods of integrating with Rails, check [the wiki](https://github.com/RubyMoney/money/wiki).
|
257
|
+
For depreceated methods of integrating with Rails, check [the wiki](https://github.com/RubyMoney/money/wiki).
|
data/config/currency.json
CHANGED
@@ -1318,8 +1318,8 @@
|
|
1318
1318
|
"priority": 100,
|
1319
1319
|
"iso_code": "MVR",
|
1320
1320
|
"name": "Maldivian Rufiyaa",
|
1321
|
-
"symbol": "
|
1322
|
-
"alternate_symbols": ["MRF", "Rf", "
|
1321
|
+
"symbol": "MVR",
|
1322
|
+
"alternate_symbols": ["MRF", "Rf", "/-", "ރ"],
|
1323
1323
|
"subunit": "Laari",
|
1324
1324
|
"subunit_to_unit": 100,
|
1325
1325
|
"symbol_first": false,
|
data/lib/money/currency.rb
CHANGED
@@ -35,6 +35,23 @@ class Money
|
|
35
35
|
new(id) if self.table[id]
|
36
36
|
end
|
37
37
|
|
38
|
+
# Lookup a currency with given +num+ as an ISO 4217 numeric and returns an
|
39
|
+
# +Currency+ instance on success, +nil+ otherwise.
|
40
|
+
#
|
41
|
+
# @param [#to_s] num used to look into +table+ in +iso_numeric+ and find
|
42
|
+
# the right currency id.
|
43
|
+
#
|
44
|
+
# @return [Money::Currency]
|
45
|
+
#
|
46
|
+
# @example
|
47
|
+
# Money::Currency.find_by_iso_numeric(978) #=> #<Money::Currency id: eur ...>
|
48
|
+
# Money::Currency.find_by_iso_numeric('001') #=> nil
|
49
|
+
def find_by_iso_numeric(num)
|
50
|
+
num = num.to_s
|
51
|
+
id, garbage = self.table.find{|key, currency| currency[:iso_numeric] == num}
|
52
|
+
new(id) if self.table[id]
|
53
|
+
end
|
54
|
+
|
38
55
|
# Wraps the object in a +Currency+ unless it's already a +Currency+
|
39
56
|
# object.
|
40
57
|
#
|
@@ -139,6 +156,11 @@ class Money
|
|
139
156
|
# @return [Integer]
|
140
157
|
attr_reader :subunit_to_unit
|
141
158
|
|
159
|
+
# The number of digits after the decimal separator.
|
160
|
+
#
|
161
|
+
# @return [Float]
|
162
|
+
attr_reader :exponent
|
163
|
+
|
142
164
|
# The decimal mark, or character used to separate the whole unit from the subunit.
|
143
165
|
#
|
144
166
|
# @return [String]
|
@@ -244,7 +266,7 @@ class Money
|
|
244
266
|
# @example
|
245
267
|
# Money::Currency.new(:usd) #=> #<Currency id: usd ...>
|
246
268
|
def inspect
|
247
|
-
"#<#{self.class.name} id: #{id}, priority: #{priority}, symbol_first: #{symbol_first}, thousands_separator: #{thousands_separator}, html_entity: #{html_entity}, decimal_mark: #{decimal_mark}, name: #{name}, symbol: #{symbol}, subunit_to_unit: #{subunit_to_unit}, iso_code: #{iso_code}, iso_numeric: #{iso_numeric}, subunit: #{subunit}>"
|
269
|
+
"#<#{self.class.name} id: #{id}, priority: #{priority}, symbol_first: #{symbol_first}, thousands_separator: #{thousands_separator}, html_entity: #{html_entity}, decimal_mark: #{decimal_mark}, name: #{name}, symbol: #{symbol}, subunit_to_unit: #{subunit_to_unit}, exponent: #{exponent}, iso_code: #{iso_code}, iso_numeric: #{iso_numeric}, subunit: #{subunit}>"
|
248
270
|
end
|
249
271
|
|
250
272
|
# Returns a string representation corresponding to the upcase +id+
|
@@ -281,6 +303,13 @@ class Money
|
|
281
303
|
!!@symbol_first
|
282
304
|
end
|
283
305
|
|
306
|
+
# Returns the number of digits after the decimal separator.
|
307
|
+
#
|
308
|
+
# @return [Float]
|
309
|
+
def exponent
|
310
|
+
Math.log10(@subunit_to_unit)
|
311
|
+
end
|
312
|
+
|
284
313
|
# Cache decimal places for subunit_to_unit values. Common ones pre-cached.
|
285
314
|
def self.decimal_places_cache
|
286
315
|
@decimal_places_cache ||= {
|
data/lib/money/money.rb
CHANGED
@@ -25,7 +25,11 @@ class Money
|
|
25
25
|
if self.class.infinite_precision
|
26
26
|
@fractional
|
27
27
|
else
|
28
|
-
|
28
|
+
# If the Money object is created from a serialized YAML string,
|
29
|
+
# @fractional can end up being set to a Float. We need to ensure
|
30
|
+
# it is BigDecimal before calling #round with two paramers.
|
31
|
+
# Float class only provides #round with 0 or 1 parameter.
|
32
|
+
BigDecimal.new(@fractional.to_s, 0).round(0, self.class.rounding_mode).to_i
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -111,6 +111,33 @@ class Money
|
|
111
111
|
# Money.new(10000000, "INR").format(:south_asian_number_formatting => true) #=> "1,00,000.00"
|
112
112
|
# Money.new(10000000).format(:south_asian_number_formatting => true) #=> "$1,00,000.00"
|
113
113
|
#
|
114
|
+
# @option *rules [Boolean, nil] :symbol_before_without_space (true) Whether
|
115
|
+
# a space between the money symbol and the amount should be inserted when
|
116
|
+
# +:symbol_position+ is +:before+. The default is true (meaning no space). Ignored
|
117
|
+
# if +:symbol+ is false or +:symbol_position+ is not +:before+.
|
118
|
+
#
|
119
|
+
# @example
|
120
|
+
# # Default is to not insert a space.
|
121
|
+
# Money.new(100, "USD").format #=> "$1.00"
|
122
|
+
#
|
123
|
+
# # Same thing.
|
124
|
+
# Money.new(100, "USD").format(:symbol_before_without_space => true) #=> "$1.00"
|
125
|
+
#
|
126
|
+
# # If set to false, will insert a space.
|
127
|
+
# Money.new(100, "USD").format(:symbol_before_without_space => false) #=> "$ 1.00"
|
128
|
+
#
|
129
|
+
# @option *rules [Boolean, nil] :symbol_after_without_space (false) Whether
|
130
|
+
# a space between the the amount and the money symbol should be inserted when
|
131
|
+
# +:symbol_position+ is +:after+. The default is false (meaning space). Ignored
|
132
|
+
# if +:symbol+ is false or +:symbol_position+ is not +:after+.
|
133
|
+
#
|
134
|
+
# @example
|
135
|
+
# # Default is to insert a space.
|
136
|
+
# Money.new(100, "USD").format(:symbol_position => :after) #=> "1.00 $"
|
137
|
+
#
|
138
|
+
# # If set to true, will not insert a space.
|
139
|
+
# Money.new(100, "USD").format(:symbol_position => :after, :symbol_after_without_space => true) #=> "1.00$"
|
140
|
+
#
|
114
141
|
# @option *rules [Boolean, String, nil] :decimal_mark (true) Whether the
|
115
142
|
# currency should be separated by the specified character or '.'
|
116
143
|
#
|
@@ -144,6 +171,15 @@ class Money
|
|
144
171
|
# @example
|
145
172
|
# s = Money.ca_dollar(570).format(:html => true, :with_currency => true)
|
146
173
|
# s #=> "$5.70 <span class=\"currency\">CAD</span>"
|
174
|
+
#
|
175
|
+
# @option *rules [Boolean] :sign_before_symbol (false) Whether the sign should be
|
176
|
+
# before the currency symbol.
|
177
|
+
#
|
178
|
+
# @example
|
179
|
+
# # You can specify to display the sign before the symbol for negative numbers
|
180
|
+
# Money.new(-100, "GBP").format(:sign_before_symbol => true) #=> "-£1.00"
|
181
|
+
# Money.new(-100, "GBP").format(:sign_before_symbol => false) #=> "£-1.00"
|
182
|
+
# Money.new(-100, "GBP").format #=> "£-1.00"
|
147
183
|
def format(*rules)
|
148
184
|
# support for old format parameters
|
149
185
|
rules = normalize_formatting_rules(rules)
|
@@ -187,12 +223,19 @@ class Money
|
|
187
223
|
:after
|
188
224
|
end
|
189
225
|
|
226
|
+
sign = ""
|
227
|
+
if rules[:sign_before_symbol] == true && self.negative?
|
228
|
+
formatted.tr!("-", "")
|
229
|
+
sign = "-"
|
230
|
+
end
|
231
|
+
|
190
232
|
if symbol_value && !symbol_value.empty?
|
191
233
|
formatted = if symbol_position == :before
|
192
|
-
"
|
234
|
+
symbol_space = rules[:symbol_before_without_space] === false ? " " : ""
|
235
|
+
"#{sign}#{symbol_value}#{symbol_space}#{formatted}"
|
193
236
|
else
|
194
237
|
symbol_space = rules[:symbol_after_without_space] ? "" : " "
|
195
|
-
"#{formatted}#{symbol_space}#{symbol_value}"
|
238
|
+
"#{sign}#{formatted}#{symbol_space}#{symbol_value}"
|
196
239
|
end
|
197
240
|
end
|
198
241
|
|
@@ -208,7 +251,8 @@ class Money
|
|
208
251
|
end
|
209
252
|
|
210
253
|
# Apply thousands_separator
|
211
|
-
formatted.gsub!(regexp_format(formatted, rules, decimal_mark
|
254
|
+
formatted.gsub!(regexp_format(formatted, rules, decimal_mark, symbol_value),
|
255
|
+
"\\1#{thousands_separator_value}")
|
212
256
|
|
213
257
|
if rules[:with_currency]
|
214
258
|
formatted << " "
|
@@ -244,12 +288,13 @@ class Money
|
|
244
288
|
end
|
245
289
|
end
|
246
290
|
|
247
|
-
def regexp_format(formatted, rules, decimal_mark)
|
291
|
+
def regexp_format(formatted, rules, decimal_mark, symbol_value)
|
248
292
|
regexp_decimal = Regexp.escape(decimal_mark)
|
249
293
|
if rules[:south_asian_number_formatting]
|
250
294
|
/(\d+?)(?=(\d\d)+(\d)(?:\.))/
|
251
295
|
else
|
252
|
-
|
296
|
+
# Symbols may contain decimal marks (E.g "դր.")
|
297
|
+
if formatted.sub(symbol_value, "") =~ /#{regexp_decimal}/
|
253
298
|
/(\d)(?=(?:\d{3})+(?:#{regexp_decimal}))/
|
254
299
|
else
|
255
300
|
/(\d)(?=(?:\d{3})+(?:[^\d]{1}|$))/
|
data/money.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "money"
|
4
|
-
s.version = "5.1.
|
4
|
+
s.version = "5.1.1"
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ["Tobias Luetke", "Hongli Lai", "Jeremy McNevin",
|
7
7
|
"Shane Emmons", "Simone Carletti"]
|
@@ -15,9 +15,9 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.add_dependency "i18n", "~> 0.6.0"
|
17
17
|
|
18
|
-
s.add_development_dependency "rspec", "~> 2.
|
18
|
+
s.add_development_dependency "rspec", "~> 2.11.0"
|
19
19
|
s.add_development_dependency "yard", "~> 0.8.1"
|
20
|
-
s.add_development_dependency "kramdown", "~> 0.
|
20
|
+
s.add_development_dependency "kramdown", "~> 0.14.0"
|
21
21
|
|
22
22
|
s.files = Dir.glob("{config,lib,spec}/**/*")
|
23
23
|
s.files += %w(CHANGELOG.md LICENSE README.md)
|
@@ -139,7 +139,7 @@ describe Money::Bank::VariableExchange do
|
|
139
139
|
|
140
140
|
context "with unknown format" do
|
141
141
|
it "raises Money::Bank::UnknownRateFormat" do
|
142
|
-
expect { subject.export_rates(:foo)}.
|
142
|
+
expect { subject.export_rates(:foo)}.to raise_error Money::Bank::UnknownRateFormat
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
@@ -184,7 +184,7 @@ describe Money::Bank::VariableExchange do
|
|
184
184
|
|
185
185
|
context "with unknown format" do
|
186
186
|
it "raises Money::Bank::UnknownRateFormat" do
|
187
|
-
expect { subject.import_rates(:foo, "")}.
|
187
|
+
expect { subject.import_rates(:foo, "")}.to raise_error Money::Bank::UnknownRateFormat
|
188
188
|
end
|
189
189
|
end
|
190
190
|
end
|
@@ -214,13 +214,13 @@ describe Money::Bank::VariableExchange do
|
|
214
214
|
end
|
215
215
|
|
216
216
|
it "raises a Money::Currency::UnknownCurrency exception when an unknown currency is passed" do
|
217
|
-
expect { subject.send(:rate_key_for, 'AAA', 'BBB')}.
|
217
|
+
expect { subject.send(:rate_key_for, 'AAA', 'BBB')}.to raise_exception(Money::Currency::UnknownCurrency)
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
221
|
describe "#marshal_dump" do
|
222
222
|
it "does not raise an error" do
|
223
|
-
expect { Marshal.dump(subject) }.
|
223
|
+
expect { Marshal.dump(subject) }.to_not raise_error
|
224
224
|
end
|
225
225
|
|
226
226
|
it "works with Marshal.load" do
|
data/spec/currency_spec.rb
CHANGED
@@ -22,6 +22,27 @@ describe Money::Currency do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
describe ".find_by_iso_numeric" do
|
26
|
+
it "returns currency matching given numeric code" do
|
27
|
+
Money::Currency.find_by_iso_numeric(978).should == Money::Currency.new(:eur)
|
28
|
+
Money::Currency.find_by_iso_numeric(208).should_not == Money::Currency.new(:eur)
|
29
|
+
Money::Currency.find_by_iso_numeric('840').should == Money::Currency.new(:usd)
|
30
|
+
|
31
|
+
class Mock
|
32
|
+
def to_s
|
33
|
+
'208'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
Money::Currency.find_by_iso_numeric(Mock.new).should == Money::Currency.new(:dkk)
|
37
|
+
Money::Currency.find_by_iso_numeric(Mock.new).should_not == Money::Currency.new(:usd)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns nil if no currency has the given numeric code" do
|
41
|
+
Money::Currency.find_by_iso_numeric('non iso 4217 numeric code').should == nil
|
42
|
+
Money::Currency.find_by_iso_numeric(0).should == nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
25
46
|
describe ".wrap" do
|
26
47
|
it "returns nil if object is nil" do
|
27
48
|
Money::Currency.wrap(nil).should == nil
|
@@ -46,7 +67,7 @@ describe Money::Currency do
|
|
46
67
|
end
|
47
68
|
|
48
69
|
it "raises UnknownMoney::Currency with unknown currency" do
|
49
|
-
|
70
|
+
expect { Money::Currency.new("xxx") }.to raise_error(Money::Currency::UnknownCurrency, /xxx/)
|
50
71
|
end
|
51
72
|
end
|
52
73
|
|
@@ -91,7 +112,7 @@ describe Money::Currency do
|
|
91
112
|
describe "#inspect" do
|
92
113
|
it "works as documented" do
|
93
114
|
Money::Currency.new(:usd).inspect.should ==
|
94
|
-
%Q{#<Money::Currency id: usd, priority: 1, symbol_first: true, thousands_separator: ,, html_entity: $, decimal_mark: ., name: United States Dollar, symbol: $, subunit_to_unit: 100, iso_code: USD, iso_numeric: 840, subunit: Cent>}
|
115
|
+
%Q{#<Money::Currency id: usd, priority: 1, symbol_first: true, thousands_separator: ,, html_entity: $, decimal_mark: ., name: United States Dollar, symbol: $, subunit_to_unit: 100, exponent: 2.0, iso_code: USD, iso_numeric: 840, subunit: Cent>}
|
95
116
|
end
|
96
117
|
end
|
97
118
|
|
@@ -121,6 +142,14 @@ describe Money::Currency do
|
|
121
142
|
end
|
122
143
|
end
|
123
144
|
|
145
|
+
describe "#exponent" do
|
146
|
+
it "conforms to iso 4217" do
|
147
|
+
Money::Currency.new(:jpy).exponent == 0
|
148
|
+
Money::Currency.new(:usd).exponent == 2
|
149
|
+
Money::Currency.new(:iqd).exponent == 3
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
124
153
|
describe "#decimal_places" do
|
125
154
|
it "proper places for known currency" do
|
126
155
|
Money::Currency.new(:mro).decimal_places == 1
|
@@ -156,10 +156,10 @@ describe Money do
|
|
156
156
|
|
157
157
|
it "raises ArgumentError when used to compare with an object that doesn't respond to #to_money" do
|
158
158
|
expected_message = /Comparison .+ failed/
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
159
|
+
expect{ Money.new(1_00) <=> Object.new }.to raise_error(ArgumentError, expected_message)
|
160
|
+
expect{ Money.new(1_00) <=> Class }.to raise_error(ArgumentError, expected_message)
|
161
|
+
expect{ Money.new(1_00) <=> Kernel }.to raise_error(ArgumentError, expected_message)
|
162
|
+
expect{ Money.new(1_00) <=> /foo/ }.to raise_error(ArgumentError, expected_message)
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -229,11 +229,11 @@ describe Money do
|
|
229
229
|
end
|
230
230
|
|
231
231
|
it "does not multiply Money by Money (same currency)" do
|
232
|
-
|
232
|
+
expect { Money.new( 10, :USD) * Money.new( 4, :USD) }.to raise_error(ArgumentError)
|
233
233
|
end
|
234
234
|
|
235
235
|
it "does not multiply Money by Money (different currency)" do
|
236
|
-
|
236
|
+
expect { Money.new( 10, :USD) * Money.new( 4, :EUR) }.to raise_error(ArgumentError)
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
@@ -165,6 +165,12 @@ describe Money, "formatting" do
|
|
165
165
|
it "respects :subunit_to_unit currency property" do
|
166
166
|
Money.new(10_00, "BHD").format(:no_cents => true).should == "ب.د1"
|
167
167
|
end
|
168
|
+
|
169
|
+
it "inserts thousand separators if symbol contains decimal mark and no_cents is true" do
|
170
|
+
Money.new(100000000, "AMD").format(no_cents: true).should == "1,000,000 դր."
|
171
|
+
Money.new(100000000, "USD").format(no_cents: true).should == "$1,000,000"
|
172
|
+
Money.new(100000000, "RUB").format(no_cents: true).should == "1.000.000 р."
|
173
|
+
end
|
168
174
|
end
|
169
175
|
|
170
176
|
describe ":no_cents_if_whole option" do
|
@@ -343,6 +349,45 @@ describe Money, "formatting" do
|
|
343
349
|
end
|
344
350
|
end
|
345
351
|
|
352
|
+
describe ":sign_before_symbol option" do
|
353
|
+
specify "(:sign_before_symbol => true) works as documented" do
|
354
|
+
Money.us_dollar(-100000).format(:sign_before_symbol => true).should == "-$1,000.00"
|
355
|
+
end
|
356
|
+
|
357
|
+
specify "(:sign_before_symbol => false) works as documented" do
|
358
|
+
Money.us_dollar(-100000).format(:sign_before_symbol => false).should == "$-1,000.00"
|
359
|
+
Money.us_dollar(-100000).format(:sign_before_symbol => nil).should == "$-1,000.00"
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
describe ":symbol_before_without_space option" do
|
364
|
+
it "does not insert space between currency symbol and amount when set to true" do
|
365
|
+
Money.euro(1_234_567_12).format(:symbol_position => :before, :symbol_before_without_space => true).should == "€1.234.567,12"
|
366
|
+
end
|
367
|
+
|
368
|
+
it "inserts space between currency symbol and amount when set to false" do
|
369
|
+
Money.euro(1_234_567_12).format(:symbol_position => :before, :symbol_before_without_space => false).should == "€ 1.234.567,12"
|
370
|
+
end
|
371
|
+
|
372
|
+
it "defaults to true" do
|
373
|
+
Money.euro(1_234_567_12).format(:symbol_position => :before).should == "€1.234.567,12"
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
describe ":symbol_after_without_space option" do
|
378
|
+
it "does not insert space between amount and currency symbol when set to true" do
|
379
|
+
Money.euro(1_234_567_12).format(:symbol_position => :after, :symbol_after_without_space => true).should == "1.234.567,12€"
|
380
|
+
end
|
381
|
+
|
382
|
+
it "inserts space between amount and currency symbol when set to false" do
|
383
|
+
Money.euro(1_234_567_12).format(:symbol_position => :after, :symbol_after_without_space => false).should == "1.234.567,12 €"
|
384
|
+
end
|
385
|
+
|
386
|
+
it "defaults to false" do
|
387
|
+
Money.euro(1_234_567_12).format(:symbol_position => :after).should == "1.234.567,12 €"
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
346
391
|
context "when the monetary value is 0" do
|
347
392
|
let(:money) { Money.us_dollar(0) }
|
348
393
|
|
data/spec/money/parsing_spec.rb
CHANGED
@@ -74,9 +74,9 @@ describe Money, "parsing" do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "does not return a price if there is a price range" do
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
expect { Money.parse('$5.95-10.95') }.to raise_error ArgumentError
|
78
|
+
expect { Money.parse('$5.95 - 10.95') }.to raise_error ArgumentError
|
79
|
+
expect { Money.parse('$5.95 - $10.95') }.to raise_error ArgumentError
|
80
80
|
end
|
81
81
|
|
82
82
|
it "does not return a price for completely invalid input" do
|
@@ -98,7 +98,7 @@ describe Money, "parsing" do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it "raises ArgumentError when unable to detect polarity" do
|
101
|
-
|
101
|
+
expect { Money.parse('-$5.95-') }.to raise_error ArgumentError
|
102
102
|
end
|
103
103
|
|
104
104
|
it "parses correctly strings with exactly 3 decimal digits" do
|
@@ -260,7 +260,7 @@ describe Money, "parsing" do
|
|
260
260
|
end
|
261
261
|
|
262
262
|
it "raises ArgumentError with unsupported argument" do
|
263
|
-
|
263
|
+
expect { Money.from_numeric("100") }.to raise_error(ArgumentError)
|
264
264
|
end
|
265
265
|
|
266
266
|
it "optimizes workload" do
|
data/spec/money_spec.rb
CHANGED
@@ -146,6 +146,36 @@ describe Money do
|
|
146
146
|
m.fractional.should be_a(Fixnum)
|
147
147
|
end
|
148
148
|
end
|
149
|
+
|
150
|
+
context "loading a serialized Money via YAML" do
|
151
|
+
it "uses BigDecimal when rounding" do
|
152
|
+
serialized = <<YAML
|
153
|
+
!ruby/object:Money
|
154
|
+
fractional: 249.5
|
155
|
+
currency: !ruby/object:Money::Currency
|
156
|
+
id: :eur
|
157
|
+
priority: 2
|
158
|
+
iso_code: EUR
|
159
|
+
name: Euro
|
160
|
+
symbol: €
|
161
|
+
alternate_symbols: []
|
162
|
+
subunit: Cent
|
163
|
+
subunit_to_unit: 100
|
164
|
+
symbol_first: true
|
165
|
+
html_entity: ! '€'
|
166
|
+
decimal_mark: ! ','
|
167
|
+
thousands_separator: .
|
168
|
+
iso_numeric: '978'
|
169
|
+
mutex: !ruby/object:Mutex {}
|
170
|
+
last_updated: 2012-11-23 20:41:47.454438399 +02:00
|
171
|
+
YAML
|
172
|
+
m = YAML::load serialized
|
173
|
+
m.should be_a(Money)
|
174
|
+
m.class.infinite_precision.should == false
|
175
|
+
m.fractional.should == 250 # 249.5 rounded up
|
176
|
+
m.fractional.should be_a(Integer)
|
177
|
+
end
|
178
|
+
end
|
149
179
|
|
150
180
|
context "user changes rounding_mode" do
|
151
181
|
after do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: money
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.1.
|
4
|
+
version: 5.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2013-02-20 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: i18n
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
requirements:
|
39
39
|
- - ~>
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 2.
|
41
|
+
version: 2.11.0
|
42
42
|
type: :development
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -46,7 +46,7 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - ~>
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 2.
|
49
|
+
version: 2.11.0
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: yard
|
52
52
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,7 +70,7 @@ dependencies:
|
|
70
70
|
requirements:
|
71
71
|
- - ~>
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: 0.
|
73
|
+
version: 0.14.0
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -78,7 +78,7 @@ dependencies:
|
|
78
78
|
requirements:
|
79
79
|
- - ~>
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.
|
81
|
+
version: 0.14.0
|
82
82
|
description: This library aids one in handling money and different currencies.
|
83
83
|
email:
|
84
84
|
- semmons99+RubyMoney@gmail.com
|
@@ -86,30 +86,30 @@ executables: []
|
|
86
86
|
extensions: []
|
87
87
|
extra_rdoc_files: []
|
88
88
|
files:
|
89
|
-
- config/currency.json
|
90
89
|
- config/currency_bc.json
|
91
|
-
-
|
92
|
-
- lib/money
|
90
|
+
- config/currency.json
|
91
|
+
- lib/money.rb
|
92
|
+
- lib/money/money.rb
|
93
93
|
- lib/money/core_extensions.rb
|
94
|
+
- lib/money/currency.rb
|
94
95
|
- lib/money/currency/heuristics.rb
|
95
96
|
- lib/money/currency/loader.rb
|
96
|
-
- lib/money/currency.rb
|
97
|
-
- lib/money/money/arithmetic.rb
|
98
97
|
- lib/money/money/formatting.rb
|
98
|
+
- lib/money/money/arithmetic.rb
|
99
99
|
- lib/money/money/parsing.rb
|
100
|
-
- lib/money/
|
101
|
-
- lib/money.rb
|
102
|
-
- spec/
|
103
|
-
- spec/
|
104
|
-
- spec/core_extensions_spec.rb
|
100
|
+
- lib/money/bank/variable_exchange.rb
|
101
|
+
- lib/money/bank/base.rb
|
102
|
+
- spec/money_spec.rb
|
103
|
+
- spec/spec_helper.rb
|
105
104
|
- spec/currency/heuristics_spec.rb
|
106
105
|
- spec/currency_spec.rb
|
107
106
|
- spec/money/arithmetic_spec.rb
|
108
|
-
- spec/money/formatting_spec.rb
|
109
107
|
- spec/money/parsing_spec.rb
|
110
|
-
- spec/
|
111
|
-
- spec/spec_helper.rb
|
108
|
+
- spec/money/formatting_spec.rb
|
112
109
|
- spec/support/default_currency_helper.rb
|
110
|
+
- spec/bank/base_spec.rb
|
111
|
+
- spec/bank/variable_exchange_spec.rb
|
112
|
+
- spec/core_extensions_spec.rb
|
113
113
|
- CHANGELOG.md
|
114
114
|
- LICENSE
|
115
115
|
- README.md
|
@@ -140,3 +140,4 @@ signing_key:
|
|
140
140
|
specification_version: 3
|
141
141
|
summary: Money and currency exchange support library.
|
142
142
|
test_files: []
|
143
|
+
has_rdoc:
|