integer_expansion 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,3 @@
1
+ def commas(number)
2
+ number.to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ',')
3
+ 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,4 @@
1
+ def factorial(year)
2
+ raise ArgumentError.new("Input be greater than or equal to 0.") if year < 0
3
+ year <= 1 ? 1 : year * factorial(year-1)
4
+ 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: []