monies 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/lib/monies.rb +27 -1
  4. data/monies.gemspec +2 -1
  5. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 457a633b330a9b30ecebac6694ed2b29566e96ed3db33b3ba2a8feca86501c88
4
- data.tar.gz: 9b3fe5366065d52108a6b3b6d74f0daba814174f47063ce12dfac75d10ecb132
3
+ metadata.gz: 736b4a239f90fc0979d0b7a0ad4ab2b55986a6d9b371420ab250d8c6c3cb6e5c
4
+ data.tar.gz: 9a4127b66e6321c91baf2f39200584fab7fbedb3d653278de6beb6c995664065
5
5
  SHA512:
6
- metadata.gz: ef772a5e785576896d10adc3638aa7062f9e148cf6678394c82e2d5f1555ea486822cc1bc018b3babc3c3976480d6fb8b7fff15bf4c315861b175c4f996ffbf2
7
- data.tar.gz: a69ffff9d64b66179c71bdeb7d4443a594818523e7d54ba845d3ad7cebf9f580cdd86173be0a7cb68a5ed4078262946620f8908fbc2c58a86254e60a60ae248e
6
+ metadata.gz: 37bcf8de107b4d63468a8b717ccc2bf3b901128a89f4b2a394d8ce24b33b3d12317fb2a66978163ec7625af29edd6748435d7a2016aa4ea701281a5efb3a9170
7
+ data.tar.gz: c66aa18d837262bfd5e0072dc566fa0bd2a044a14ead9a46a11cbbb6338a5a38c3f7a659d545d2cc9cf75417eaea0eeaf6ef30850b19f6f851801d7d86f8d4c9
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # monies
2
2
 
3
+ ![Gem Version](https://badge.fury.io/rb/monies.svg)
4
+ ![Test Status](https://github.com/readysteady/monies/actions/workflows/test.yml/badge.svg)
5
+
6
+
3
7
  Ruby gem for representing monetary values.
4
8
 
5
9
  Pure Ruby—compatible with MRI/CRuby, JRuby, TruffleRuby, and Natalie.
@@ -76,6 +80,12 @@ the maximum number of decimal places you want:
76
80
  Monies(1, 'USD').div(9, 100)
77
81
  ```
78
82
 
83
+ Use the #allocate method to split an amount into a number of smaller amounts:
84
+
85
+ ```ruby
86
+ installments = Monies(1, 'USD').allocate(3, 2)
87
+ ```
88
+
79
89
 
80
90
  ## Currency conversion
81
91
 
data/lib/monies.rb CHANGED
@@ -195,6 +195,22 @@ class Monies
195
195
  self.class.new(@value.abs, @scale, @currency)
196
196
  end
197
197
 
198
+ def allocate(n, digits)
199
+ unless n.is_a?(Integer) && n >= 1
200
+ raise ArgumentError, 'n must be greater than or equal to 1'
201
+ end
202
+
203
+ quotient = (self / n).truncate(digits)
204
+
205
+ remainder = self - quotient * n
206
+
207
+ array = Array.new(n) { quotient }
208
+
209
+ array[-1] += remainder unless remainder.zero?
210
+
211
+ array
212
+ end
213
+
198
214
  def ceil(digits = 0)
199
215
  round(digits, :ceil)
200
216
  end
@@ -271,10 +287,18 @@ class Monies
271
287
  raise TypeError, "#{self.class} can't be divided by #{other.class}"
272
288
  end
273
289
 
290
+ def fix
291
+ self.class.new(@value / (BASE ** @scale), 0, @currency)
292
+ end
293
+
274
294
  def floor(digits = 0)
275
295
  round(digits, :floor)
276
296
  end
277
297
 
298
+ def frac
299
+ self - fix
300
+ end
301
+
278
302
  def inspect
279
303
  "#<#{self.class.name}: #{Monies::Digits.dump(self)} #{@currency}>"
280
304
  end
@@ -389,7 +413,7 @@ class Monies
389
413
  def divide(value, scale, divisor, max_scale)
390
414
  quotient, carry = 0, 0
391
415
 
392
- value.digits.reverse_each do |digit|
416
+ value.abs.digits.reverse_each do |digit|
393
417
  dividend = carry + digit
394
418
 
395
419
  quotient = (quotient * BASE) + (dividend / divisor)
@@ -411,6 +435,8 @@ class Monies
411
435
  iterations -= 1
412
436
  end
413
437
 
438
+ quotient = -quotient if value.negative?
439
+
414
440
  self.class.new(quotient, scale, @currency)
415
441
  end
416
442
 
data/monies.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'monies'
3
- s.version = '1.0.0'
3
+ s.version = '1.1.0'
4
4
  s.license = 'LGPL-3.0'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Tim Craft']
@@ -15,5 +15,6 @@ Gem::Specification.new do |s|
15
15
  'homepage' => 'https://github.com/readysteady/monies',
16
16
  'source_code_uri' => 'https://github.com/readysteady/monies',
17
17
  'bug_tracker_uri' => 'https://github.com/readysteady/monies/issues',
18
+ 'changelog_uri' => 'https://github.com/readysteady/monies/blob/main/CHANGES.md'
18
19
  }
19
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monies
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Craft
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-05 00:00:00.000000000 Z
11
+ date: 2024-10-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ruby gem for representing monetary values
14
14
  email:
@@ -35,6 +35,7 @@ metadata:
35
35
  homepage: https://github.com/readysteady/monies
36
36
  source_code_uri: https://github.com/readysteady/monies
37
37
  bug_tracker_uri: https://github.com/readysteady/monies/issues
38
+ changelog_uri: https://github.com/readysteady/monies/blob/main/CHANGES.md
38
39
  post_install_message:
39
40
  rdoc_options: []
40
41
  require_paths: