integer_expansion 1.0.0 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,6 @@ require File.dirname(__FILE__) + '/methods/new_roman'
2
2
  require File.dirname(__FILE__) + '/methods/old_roman'
3
3
  require File.dirname(__FILE__) + '/methods/factorial'
4
4
  require File.dirname(__FILE__) + '/methods/english_number'
5
- require File.dirname(__FILE__) + '/methods/commas'
6
5
 
7
6
  class Integer
8
7
  def to_roman
@@ -1,70 +1,49 @@
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
1
+ NUM_WORD_PAIRS = [[10 ** 12, 'trillion'],
2
+ [10 ** 9, 'billion'],
3
+ [10 ** 6, 'million'],
4
+ [10 ** 3, 'thousand'],
5
+ [10 ** 2, 'hundred'],
6
+ [90, 'ninety'],
7
+ [80, 'eighty'],
8
+ [70, 'seventy'],
9
+ [60, 'sixty'],
10
+ [50, 'fifty'],
11
+ [40, 'fourty'],
12
+ [30, 'thirty'],
13
+ [20, 'twenty'],
14
+ [19, 'nineteen'],
15
+ [18, 'eighteen'],
16
+ [17, 'seventeen'],
17
+ [16, 'sixteen'],
18
+ [15, 'fifteen'],
19
+ [14, 'fouteen'],
20
+ [13, 'thirteen'],
21
+ [12, 'twelve'],
22
+ [11, 'eleven'],
23
+ [10, 'ten'],
24
+ [ 9, 'nine'],
25
+ [ 8, 'eight'],
26
+ [ 7, 'seven'],
27
+ [ 6, 'six'],
28
+ [ 5, 'five'],
29
+ [ 4, 'four'],
30
+ [ 3, 'three'],
31
+ [ 2, 'two'],
32
+ [ 1, 'one']]
33
+
34
+ def english_number(num)
35
+ raise ArgumentError.new("Input be greater than or equal to 0.") if num < 0
36
+ return 'one' if num == 1
37
+ to_words_array = []
38
+
39
+ NUM_WORD_PAIRS.each do |pair|
40
+ if num > 99
41
+ lead_digits = (num % (pair[0] * 1000)) / pair[0]
42
+ to_words_array << english_number(lead_digits) if lead_digits > 0
16
43
  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)
44
+ to_words_array << pair[1] if (num / pair[0]) > 0
45
+ num %= pair[0]
23
46
  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]
47
+
48
+ to_words_array.join(' ')
70
49
  end
@@ -1,23 +1,22 @@
1
- # require './old_roman'
2
- # necessary to run independently
1
+ NEW_ROMAN_ARRAY = [[1000, 'M'],
2
+ [ 900, 'CM'],
3
+ [ 500, 'D'],
4
+ [ 400, 'CD'],
5
+ [ 100, 'C'],
6
+ [ 90, 'XC'],
7
+ [ 50, 'L'],
8
+ [ 40, 'XL'],
9
+ [ 10, 'X'],
10
+ [ 9, 'IX'],
11
+ [ 5, 'V'],
12
+ [ 4, 'IV'],
13
+ [ 1, 'I']]
3
14
 
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
15
+ def new_roman(number)
16
+ string = ''
17
+ NEW_ROMAN_ARRAY.each do |pair|
18
+ string += pair[1] * (number / pair[0])
19
+ number %= pair[0]
20
20
  end
21
-
22
- new_roman.reverse.join
23
- end
21
+ string
22
+ end
@@ -1,12 +1,16 @@
1
- def old_roman(year)
2
- raise ArgumentError.new("Input must not be negative.") if year < 0
1
+ OLD_ROMAN_ARRAY = [[1000, 'M'],
2
+ [ 500, 'D'],
3
+ [ 100, 'C'],
4
+ [ 50, 'L'],
5
+ [ 10, 'X'],
6
+ [ 5, 'V'],
7
+ [ 1, 'I']]
8
+
9
+ def old_roman(number)
3
10
  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
+ OLD_ROMAN_ARRAY.each do |pair|
12
+ string += pair[1] * (number / pair[0])
13
+ number %= pair[0]
14
+ end
11
15
  string
12
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: integer_expansion
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-27 00:00:00.000000000 Z
12
+ date: 2013-10-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: 1999#to_roman, 1999#to_old_roman, 4#fact, 1999#to_english, 1999#add_commas
15
15
  email: tydotg@gmail.com