integer_expansion 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|