integer_expansion 1.0.0 → 1.2.2

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.
@@ -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