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.
@@ -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: []