fractional 1.0.1 → 1.1.0
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/.rspec +0 -1
- data/README.rdoc +13 -0
- data/VERSION +1 -1
- data/fractional.gemspec +4 -4
- data/lib/fractional.rb +32 -1
- data/spec/fractional_spec.rb +56 -39
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 113941347da803b9e0f57e563c0f63061cd3903b
|
4
|
+
data.tar.gz: 4b68768934859d192abc47b3962cc67cecb2f10e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 035b92227c95a2652666c85a52c28b272d32d854388e6475a84b83b85371d38ad823aa0414e660a1d4334d316bb66687d154eafa3ab1d649fabfc79b2cf715f6
|
7
|
+
data.tar.gz: 4885f100ddb7365f7b67d65838067044e0daf526f57f8024f762d05cef8dbdbd1f36e71b0a73ced98166d0a6abab399a3daf48836d4bcf27ef69d9b68492628b
|
data/.rspec
CHANGED
data/README.rdoc
CHANGED
@@ -11,6 +11,19 @@ Convert floats to fractional strings:
|
|
11
11
|
Fractional.new(1100.875).to_s #=> "1100 7/8"
|
12
12
|
Fractional.new(1100.875, :to_nearest => "1/2").to_s #=> "1101"
|
13
13
|
|
14
|
+
Convert to human-friendly fractions:
|
15
|
+
Fractional.new(-1.331, :to_human).to_s #=> "-1 1/3"
|
16
|
+
|
17
|
+
Consider the following example:
|
18
|
+
|
19
|
+
Fractional.new(1.339999).to_s => "67/50"
|
20
|
+
Fractional.new(1.339999).to_s(mixed_number: true) => "1 17/50"
|
21
|
+
|
22
|
+
This is not very human-friendly if we're talking about amounts in cooking recipes, especially when we need to convert from Kg to Pounds etc. Instead use:
|
23
|
+
|
24
|
+
Fractional.new(1.339999, to_human: true).to_s => "1 1/3"
|
25
|
+
|
26
|
+
|
14
27
|
Also does a great job of guessing repeating decimal values:
|
15
28
|
Fractional.new(0.33333).to_s #=> "1/3"
|
16
29
|
Fractional.new(3.142857142857).to_s #=> "22/7"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/fractional.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "fractional"
|
3
|
-
spec.version = "1.0
|
3
|
+
spec.version = "1.1.0"
|
4
4
|
spec.authors = ["Chris O'Sullivan"]
|
5
5
|
spec.email = ["thechrisoshow@gmail.com"]
|
6
6
|
spec.description = %q{Fractional is a Ruby library for parsing fractions.}
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.require_paths = ["lib"]
|
15
15
|
|
16
16
|
spec.add_development_dependency "bundler", "~> 1.3"
|
17
|
-
spec.add_development_dependency "rake"
|
18
|
-
spec.add_development_dependency "rspec"
|
19
|
-
spec.add_development_dependency "
|
17
|
+
spec.add_development_dependency "rake", '~> 0'
|
18
|
+
spec.add_development_dependency "rspec", '~> 0'
|
19
|
+
spec.add_development_dependency "byebug", '~> 0'
|
20
20
|
end
|
data/lib/fractional.rb
CHANGED
@@ -14,7 +14,11 @@ class Fractional < Numeric
|
|
14
14
|
when String
|
15
15
|
@value = Fractional.string_to_fraction( value, options )
|
16
16
|
when Fixnum
|
17
|
-
@value
|
17
|
+
if @value == @value.to_i
|
18
|
+
@value = Rational(value)
|
19
|
+
else # It's still Rational if it's a natural number
|
20
|
+
@value = Fractional.float_to_fraction( value.to_f, options )
|
21
|
+
end
|
18
22
|
when Numeric
|
19
23
|
@value = Fractional.float_to_fraction( value.to_f, options )
|
20
24
|
else
|
@@ -115,6 +119,10 @@ class Fractional < Numeric
|
|
115
119
|
return self.round_to_nearest_fraction( value, options[:to_nearest] )
|
116
120
|
end
|
117
121
|
|
122
|
+
if options[:to_human]
|
123
|
+
return self.round_to_human_fraction( value )
|
124
|
+
end
|
125
|
+
|
118
126
|
# first try to convert a repeating decimal unless guesstimate is forbidden
|
119
127
|
unless options[:exact]
|
120
128
|
repeat = float_to_rational_repeat(value)
|
@@ -217,4 +225,27 @@ class Fractional < Numeric
|
|
217
225
|
Fractional.new((Fractional.new(value).to_f / to_nearest_float).round * to_nearest_float)
|
218
226
|
end
|
219
227
|
|
228
|
+
def self.numeric_to_mixed_number(amount)
|
229
|
+
sign_prefix = ( amount < 0 )? '-' : ''
|
230
|
+
amount = amount.abs
|
231
|
+
amount_as_integer = amount.to_i
|
232
|
+
if (amount_as_integer != amount.to_f) && (amount_as_integer > 0)
|
233
|
+
fraction = amount - amount_as_integer
|
234
|
+
"#{sign_prefix}#{amount_as_integer} #{fraction}"
|
235
|
+
else
|
236
|
+
if amount.denominator == 1
|
237
|
+
"#{sign_prefix}#{amount_as_integer}"
|
238
|
+
else
|
239
|
+
sign_prefix + amount.to_s
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# Display numbers in human-readable manner.
|
245
|
+
# Examples: 0.5 -> 1/2, 2.333 -> 2 1/3, 0.666 -> 2/3 etc.
|
246
|
+
#
|
247
|
+
def self.round_to_human_fraction(value)
|
248
|
+
numeric_to_mixed_number value.rationalize(Rational('0.01'))
|
249
|
+
end
|
250
|
+
|
220
251
|
end
|
data/spec/fractional_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'byebug'
|
2
3
|
|
3
4
|
##################################
|
4
5
|
# CLASS METHODS #
|
@@ -115,93 +116,93 @@ end
|
|
115
116
|
|
116
117
|
describe "Fractional::string_is_fraction?" do
|
117
118
|
it "should recognize a simple fraction" do
|
118
|
-
Fractional.string_is_fraction?("3/4").should
|
119
|
+
Fractional.string_is_fraction?("3/4").should be_truthy
|
119
120
|
end
|
120
121
|
|
121
122
|
it "should recognize a mixed fraction" do
|
122
|
-
Fractional.string_is_fraction?("1 11/12").should
|
123
|
+
Fractional.string_is_fraction?("1 11/12").should be_truthy
|
123
124
|
end
|
124
125
|
|
125
126
|
it "should recognize a negative fraction" do
|
126
|
-
Fractional.string_is_fraction?("-3/4").should
|
127
|
+
Fractional.string_is_fraction?("-3/4").should be_truthy
|
127
128
|
end
|
128
129
|
|
129
130
|
it "should recognize a negative mixed fraction" do
|
130
|
-
Fractional.string_is_fraction?("-6 2/9").should
|
131
|
+
Fractional.string_is_fraction?("-6 2/9").should be_truthy
|
131
132
|
end
|
132
133
|
|
133
134
|
it "should accept more than one space between the whole number and fractional part" do
|
134
|
-
Fractional.string_is_fraction?("1 2/3").should
|
135
|
-
Fractional.string_is_fraction?("3 1/2").should
|
135
|
+
Fractional.string_is_fraction?("1 2/3").should be_truthy
|
136
|
+
Fractional.string_is_fraction?("3 1/2").should be_truthy
|
136
137
|
end
|
137
138
|
|
138
139
|
it "should accept fractions with front and rear padding" do
|
139
|
-
Fractional.string_is_fraction?(" 2/3").should
|
140
|
-
Fractional.string_is_fraction?("2/3 ").should
|
141
|
-
Fractional.string_is_fraction?(" 2/3 ").should
|
142
|
-
Fractional.string_is_fraction?(" 1 2/3").should
|
143
|
-
Fractional.string_is_fraction?("1 2/3 ").should
|
144
|
-
Fractional.string_is_fraction?(" 1 2/3 ").should
|
140
|
+
Fractional.string_is_fraction?(" 2/3").should be_truthy
|
141
|
+
Fractional.string_is_fraction?("2/3 ").should be_truthy
|
142
|
+
Fractional.string_is_fraction?(" 2/3 ").should be_truthy
|
143
|
+
Fractional.string_is_fraction?(" 1 2/3").should be_truthy
|
144
|
+
Fractional.string_is_fraction?("1 2/3 ").should be_truthy
|
145
|
+
Fractional.string_is_fraction?(" 1 2/3 ").should be_truthy
|
145
146
|
end
|
146
147
|
|
147
148
|
it "should not recognize decimals" do
|
148
|
-
Fractional.string_is_fraction?("2.3").should
|
149
|
+
Fractional.string_is_fraction?("2.3").should be_falsey
|
149
150
|
end
|
150
151
|
|
151
152
|
it "should not recognize two consecutive fractions" do
|
152
|
-
Fractional.string_is_fraction?("2/3 9/5").should
|
153
|
+
Fractional.string_is_fraction?("2/3 9/5").should be_falsey
|
153
154
|
end
|
154
155
|
|
155
156
|
it "should not recognize a string with a slash" do
|
156
|
-
Fractional.string_is_fraction?("n/a").should
|
157
|
+
Fractional.string_is_fraction?("n/a").should be_falsey
|
157
158
|
end
|
158
159
|
|
159
160
|
it "should not recognize a fraction mixed with non-decimals" do
|
160
|
-
Fractional.string_is_fraction?("3a/4").should
|
161
|
-
Fractional.string_is_fraction?("a2/3").should
|
162
|
-
Fractional.string_is_fraction?("1 2/3a").should
|
161
|
+
Fractional.string_is_fraction?("3a/4").should be_falsey
|
162
|
+
Fractional.string_is_fraction?("a2/3").should be_falsey
|
163
|
+
Fractional.string_is_fraction?("1 2/3a").should be_falsey
|
163
164
|
end
|
164
165
|
|
165
166
|
it "should not recognize fractions with improper spacing" do
|
166
|
-
Fractional.string_is_fraction?("2 /2").should
|
167
|
-
Fractional.string_is_fraction?("1/ 3").should
|
168
|
-
Fractional.string_is_fraction?("1 2/ 3").should
|
169
|
-
Fractional.string_is_fraction?("1 2 /3").should
|
167
|
+
Fractional.string_is_fraction?("2 /2").should be_falsey
|
168
|
+
Fractional.string_is_fraction?("1/ 3").should be_falsey
|
169
|
+
Fractional.string_is_fraction?("1 2/ 3").should be_falsey
|
170
|
+
Fractional.string_is_fraction?("1 2 /3").should be_falsey
|
170
171
|
end
|
171
172
|
|
172
173
|
end
|
173
174
|
|
174
175
|
describe "Fractional::string_is_mixed_fraction?" do
|
175
176
|
it "should recognize a mixed fraction" do
|
176
|
-
Fractional.string_is_mixed_fraction?("1 11/12").should
|
177
|
+
Fractional.string_is_mixed_fraction?("1 11/12").should be_truthy
|
177
178
|
end
|
178
179
|
|
179
180
|
it "should recognize a negative mixed fraciton" do
|
180
|
-
Fractional.string_is_mixed_fraction?("-1 11/12").should
|
181
|
+
Fractional.string_is_mixed_fraction?("-1 11/12").should be_truthy
|
181
182
|
end
|
182
183
|
|
183
184
|
it "should not recognize a single fraction" do
|
184
|
-
Fractional.string_is_mixed_fraction?("3/4").should
|
185
|
+
Fractional.string_is_mixed_fraction?("3/4").should be_falsey
|
185
186
|
end
|
186
187
|
|
187
188
|
end
|
188
189
|
|
189
190
|
describe "Fractional::string_is_single_fraction?" do
|
190
191
|
it "should recognize a single fraction" do
|
191
|
-
Fractional.string_is_single_fraction?("3/4").should
|
192
|
+
Fractional.string_is_single_fraction?("3/4").should be_truthy
|
192
193
|
end
|
193
194
|
|
194
195
|
it "should recognize a negative numerator with a single fraction" do
|
195
|
-
Fractional.string_is_single_fraction?("-3/4").should
|
196
|
+
Fractional.string_is_single_fraction?("-3/4").should be_truthy
|
196
197
|
end
|
197
198
|
|
198
199
|
it "should not recognize a mixed fraction" do
|
199
|
-
Fractional.string_is_single_fraction?("1 11/12").should
|
200
|
+
Fractional.string_is_single_fraction?("1 11/12").should be_falsey
|
200
201
|
end
|
201
202
|
|
202
203
|
it "should allow for negative denominators in single fractions" do
|
203
|
-
Fractional.string_is_single_fraction?("1/-64").should
|
204
|
-
Fractional.string_is_single_fraction?("-1/-64").should
|
204
|
+
Fractional.string_is_single_fraction?("1/-64").should be_truthy
|
205
|
+
Fractional.string_is_single_fraction?("-1/-64").should be_truthy
|
205
206
|
end
|
206
207
|
|
207
208
|
end
|
@@ -313,15 +314,15 @@ end
|
|
313
314
|
|
314
315
|
describe "Fractional#==" do
|
315
316
|
it "should be equal to same Fractions" do
|
316
|
-
(Fractional.new(Rational(3,1)) == Fractional.new(Rational(3,1))).should
|
317
|
+
(Fractional.new(Rational(3,1)) == Fractional.new(Rational(3,1))).should be_truthy
|
317
318
|
end
|
318
319
|
|
319
320
|
it "should not be equal to other Fractions" do
|
320
|
-
(Fractional.new(Rational(3,2)) == Fractional.new(Rational(3,1))).should
|
321
|
+
(Fractional.new(Rational(3,2)) == Fractional.new(Rational(3,1))).should be_falsey
|
321
322
|
end
|
322
323
|
|
323
324
|
it "should be equal regardless of type" do
|
324
|
-
(Fractional.new(Rational(3,4)) == Fractional.new(0.75)).should
|
325
|
+
(Fractional.new(Rational(3,4)) == Fractional.new(0.75)).should be_truthy
|
325
326
|
end
|
326
327
|
end
|
327
328
|
|
@@ -355,7 +356,7 @@ end
|
|
355
356
|
|
356
357
|
describe "Frational", "comparsion" do
|
357
358
|
it "should use the numerics included comparsion module" do
|
358
|
-
(Fractional.new(Rational(-3,4)) < Fractional.new(Rational(1,2))).should
|
359
|
+
(Fractional.new(Rational(-3,4)) < Fractional.new(Rational(1,2))).should be_truthy
|
359
360
|
end
|
360
361
|
end
|
361
362
|
|
@@ -367,7 +368,6 @@ describe "Fractional#to_s" do
|
|
367
368
|
it "should return nice representations of single fractions" do
|
368
369
|
Fractional.new(0.75).to_s.should == "3/4"
|
369
370
|
Fractional.new(-0.3333).to_s.should == "-1/3"
|
370
|
-
|
371
371
|
end
|
372
372
|
|
373
373
|
it "should return nice representations of mixed fractions" do
|
@@ -434,6 +434,23 @@ describe "Fractional", "round" do
|
|
434
434
|
it "should round if passed a float" do
|
435
435
|
Fractional.round_to_nearest_fraction(1100.875, 0.5).should == Fractional.new(1101)
|
436
436
|
end
|
437
|
+
|
438
|
+
it "should round if passed a float" do
|
439
|
+
Fractional.round_to_human_fraction(0.9001).to_s.should == "9/10"
|
440
|
+
Fractional.round_to_human_fraction(-0.8012).to_s.should == "-4/5"
|
441
|
+
Fractional.round_to_human_fraction(0.337).to_s.should == "1/3"
|
442
|
+
Fractional.round_to_human_fraction(-1.331).to_s.should == "-1 1/3"
|
443
|
+
Fractional.round_to_human_fraction(5.691).to_s.should == "5 7/10"
|
444
|
+
Fractional.round_to_human_fraction(-3.668).to_s.should == "-3 2/3"
|
445
|
+
Fractional.round_to_human_fraction(2.0).to_s.should == "2"
|
446
|
+
Fractional.round_to_human_fraction(11).to_s.should == "11"
|
447
|
+
end
|
448
|
+
|
449
|
+
it "should round if passed 'to_human' that rounds to nearest whole number" do
|
450
|
+
Fractional.new(2.0, to_human: true).to_s.should == "2"
|
451
|
+
Fractional.new(-2.0, to_human: true).to_s.should == "-2"
|
452
|
+
end
|
453
|
+
|
437
454
|
end
|
438
455
|
|
439
456
|
##################################
|
@@ -473,14 +490,14 @@ describe "deprecated methods" do
|
|
473
490
|
end
|
474
491
|
|
475
492
|
it "Fraction.fraction?" do
|
476
|
-
Fractional.fraction?("3/4").should
|
493
|
+
Fractional.fraction?("3/4").should be_truthy
|
477
494
|
end
|
478
495
|
|
479
496
|
it "Fraction.mixed_fraction?" do
|
480
|
-
Fractional.mixed_fraction?("1 11/12").should
|
497
|
+
Fractional.mixed_fraction?("1 11/12").should be_truthy
|
481
498
|
end
|
482
499
|
|
483
500
|
it "Fraction.single_fraction?" do
|
484
|
-
Fractional.single_fraction?("-3/4").should
|
501
|
+
Fractional.single_fraction?("-3/4").should be_truthy
|
485
502
|
end
|
486
|
-
end
|
503
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fractional
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris O'Sullivan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: byebug
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: Fractional is a Ruby library for parsing fractions.
|
@@ -73,8 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .rspec
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
78
|
- Gemfile
|
79
79
|
- LICENSE
|
80
80
|
- README.rdoc
|
@@ -95,17 +95,17 @@ require_paths:
|
|
95
95
|
- lib
|
96
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
|
-
- -
|
98
|
+
- - ">="
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- -
|
103
|
+
- - ">="
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '0'
|
106
106
|
requirements: []
|
107
107
|
rubyforge_project:
|
108
|
-
rubygems_version: 2.
|
108
|
+
rubygems_version: 2.4.8
|
109
109
|
signing_key:
|
110
110
|
specification_version: 4
|
111
111
|
summary: 'You can use fractional to convert decimal numbers to string representations
|