integer_expansion 0.0.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.
- data/lib/integer_expansion.rb +27 -0
- data/lib/methods/commas.rb +3 -0
- data/lib/methods/english_number.rb +70 -0
- data/lib/methods/factorial.rb +4 -0
- data/lib/methods/new_roman.rb +23 -0
- data/lib/methods/old_roman.rb +12 -0
- metadata +55 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/methods/new_roman'
|
2
|
+
require File.dirname(__FILE__) + '/methods/old_roman'
|
3
|
+
require File.dirname(__FILE__) + '/methods/factorial'
|
4
|
+
require File.dirname(__FILE__) + '/methods/english_number'
|
5
|
+
require File.dirname(__FILE__) + '/methods/commas'
|
6
|
+
|
7
|
+
class Integer
|
8
|
+
def to_roman
|
9
|
+
new_roman(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_old_roman
|
13
|
+
old_roman(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def !
|
17
|
+
factorial(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_english
|
21
|
+
english_number(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_commas
|
25
|
+
commas(self)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
def english_number(number)
|
2
|
+
raise ArgumentError.new("Input be greater than or equal to 0.") if number < 0
|
3
|
+
return 'zero' if number == 0
|
4
|
+
string = ''
|
5
|
+
|
6
|
+
factor = number.to_s.length - 1
|
7
|
+
|
8
|
+
if factor >= 2
|
9
|
+
|
10
|
+
factor_check = [12,9,6,3] # trillions, billions, millions, thousands
|
11
|
+
factor_check.each do |x|
|
12
|
+
if factor >= x
|
13
|
+
lead_digits = (number % 10 ** (x + 3)) / 10 ** x # remove numbers from higher and lower factors
|
14
|
+
string += parser(lead_digits) + ' ' + factors(x) + ' ' if lead_digits != 0
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
string += 'and ' if ((number % 1000 < 100) && (number % 1000 != 0))
|
19
|
+
string += parser(number % 1000) # last three digits
|
20
|
+
string.chop! if number % 1000 == 0 # remove extra space if no ones or tens
|
21
|
+
else
|
22
|
+
string += small_number(number)
|
23
|
+
end
|
24
|
+
|
25
|
+
string
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def small_number(number) # numbers under 99
|
30
|
+
string = ''
|
31
|
+
small_hash = { 1 => 'one', 2 => 'two', 3 => 'three',
|
32
|
+
4 => 'four', 5 => 'five', 6 => 'six',
|
33
|
+
7 => 'seven', 8 => 'eight', 9 => 'nine',
|
34
|
+
11 => 'eleven', 12 => 'twelve', 13 => 'thirteen',
|
35
|
+
14 => 'fourteen', 15 => 'fifteen', 16 => 'sixteen',
|
36
|
+
17 => 'seventeen', 18 => 'eighteen', 19 => 'nineteen',
|
37
|
+
10 => 'ten', 20 => 'twenty', 30 => 'thirty',
|
38
|
+
40 => 'fourty', 50 => 'fifty', 60 => 'sixty',
|
39
|
+
70 => 'seventy', 80 => 'eighty', 90 => 'ninety'}
|
40
|
+
|
41
|
+
if number < 20
|
42
|
+
return small_hash[number]
|
43
|
+
else
|
44
|
+
extra = number % 10
|
45
|
+
string += small_hash[number - extra]
|
46
|
+
string += ' ' + small_hash[extra] if extra != 0
|
47
|
+
end
|
48
|
+
string
|
49
|
+
end
|
50
|
+
|
51
|
+
def parser(number) # decides is lead_digits needs to be processed as hundreds, or a small number
|
52
|
+
string = ''
|
53
|
+
string += hundreds(number) if number >= 100
|
54
|
+
string += small_number(number) if number < 100 && number != 0
|
55
|
+
string
|
56
|
+
end
|
57
|
+
|
58
|
+
def hundreds(number)
|
59
|
+
string = ''
|
60
|
+
string += small_number(number / 100 )
|
61
|
+
string += ' ' + factors(2)
|
62
|
+
string += ' and ' + small_number(number % 100) if number % 100 != 0
|
63
|
+
string
|
64
|
+
end
|
65
|
+
|
66
|
+
def factors(number) # 10 ** factor
|
67
|
+
hundred_hash = { 2 => 'hundred', 3 => 'thousand', 6 => 'million',
|
68
|
+
9 => 'billion', 12 => 'trillion'}
|
69
|
+
hundred_hash[number]
|
70
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# require './old_roman'
|
2
|
+
# necessary to run independently
|
3
|
+
|
4
|
+
def new_roman(year)
|
5
|
+
raise ArgumentError.new("Input must be greater than 0.") if year < 1
|
6
|
+
digits = year.to_s.split('').reverse
|
7
|
+
new_roman = []
|
8
|
+
nines_fours = [['IX','IV'], # ones
|
9
|
+
['XC','XL'], # tens
|
10
|
+
['CM','CD']] # hundreds
|
11
|
+
|
12
|
+
digits.each_with_index do |x,i|
|
13
|
+
if x == "9"
|
14
|
+
new_roman << nines_fours[i][0]
|
15
|
+
elsif x == "4"
|
16
|
+
new_roman << nines_fours[i][1]
|
17
|
+
else
|
18
|
+
new_roman << old_roman(x.to_i * (10 ** i))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
new_roman.reverse.join
|
23
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
def old_roman(year)
|
2
|
+
raise ArgumentError.new("Input must not be negative.") if year < 0
|
3
|
+
string = ''
|
4
|
+
string += 'M' * (year / 1000)
|
5
|
+
string += 'D' * (year % 1000 / 500)
|
6
|
+
string += 'C' * (year % 500 / 100)
|
7
|
+
string += 'L' * (year % 100 / 50)
|
8
|
+
string += 'X' * (year % 50 / 10)
|
9
|
+
string += 'V' * (year % 10 / 5)
|
10
|
+
string += 'I' * (year % 5 / 1)
|
11
|
+
string
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: integer_expansion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tyler Olson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-11 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! "1999.to_roman == 'MCMXCIX',\n 1999.to_old_roman
|
15
|
+
== 'MDCCCCLXXXXVIIII',\n 4.! == 24,\n 1999.to_english
|
16
|
+
\ == 'one thousand nine hundred and ninety nine',\n 1999.add_commas
|
17
|
+
\ == '1,999'"
|
18
|
+
email: tydotg@gmail.com
|
19
|
+
executables: []
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- lib/integer_expansion.rb
|
24
|
+
- lib/methods/commas.rb
|
25
|
+
- lib/methods/english_number.rb
|
26
|
+
- lib/methods/factorial.rb
|
27
|
+
- lib/methods/new_roman.rb
|
28
|
+
- lib/methods/old_roman.rb
|
29
|
+
homepage: http://rubygems.org/gems/integer_expansion
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirements: []
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 1.8.25
|
51
|
+
signing_key:
|
52
|
+
specification_version: 3
|
53
|
+
summary: ! 'Includes additional methods for the Ruby Integer class. Includes: #to_roman,
|
54
|
+
#to_old_roman, #!, #to_english and #add_commas'
|
55
|
+
test_files: []
|