numbers_in_words 0.1.0 → 0.1.1

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.
data/lib/words.rb CHANGED
@@ -1,222 +1,217 @@
1
1
  module WordsInNumbers
2
+ def in_numbers
3
+ text = to_s
2
4
 
3
- DIGITS= %w[zero one two three four five six seven eight nine]
4
-
5
- EXCEPTIONS = {
6
- "ten"=>10,
7
- "eleven"=>11,
8
- "twelve"=>12,
9
- "thirteen"=>13,
10
- "fourteen"=>14,
11
- "fifteen"=>15,
12
- "sixteen"=>16,
13
- "seventeen"=>17,
14
- "eighteen"=>18,
15
- "nineteen"=>19,
16
- "twenty"=>20,
17
- "thirty"=>30,
18
- "forty"=>40,
19
- "fifty"=>50,
20
- "sixty"=>60,
21
- "seventy"=>70,
22
- "eighty"=>80,
23
- "ninety"=>90
24
- }
25
-
26
-
27
- POWERS_OF_TEN ={
28
- "one"=>0,
29
- "ten"=> 1 ,
30
- "hundred"=> 2,
31
- "thousand"=> 3 ,
32
- "million"=> 6,
33
- "billion"=> 9,
34
- "trillion"=> 12,
35
- "quadrillion"=> 15,
36
- "quintillion"=> 18,
37
- "sextillion"=> 21,
38
- "septillion"=> 24,
39
- "octillion"=> 27,
40
- "nonillion"=> 30,
41
- "decillion"=> 33,
42
- "undecillion"=> 36,
43
- "duodecillion"=> 39,
44
- "tredecillion"=> 42,
45
- "quattuordecillion"=> 45,
46
- "quindecillion"=> 48,
47
- "sexdecillion"=> 51,
48
- "septendecillion"=> 54,
49
- "octodecillion"=> 57,
50
- "novemdecillion"=> 60,
51
- "vigintillion"=> 63,
52
- "unvigintillion"=> 66,
53
- "duovigintillion"=> 69,
54
- "trevigintillion"=> 72,
55
- "quattuorvigintillion"=> 75,
56
- "quinvigintillion"=> 78,
57
- "sexvigintillion"=> 81,
58
- "septenvigintillion"=> 84,
59
- "octovigintillion"=> 87,
60
- "novemvigintillion"=> 90,
61
- "trigintillion"=> 93,
62
- "untrigintillion"=> 96,
63
- "duotrigintillion"=> 99,
64
- "googol"=> 100
65
- }
66
-
67
- def strip_punctuation text
68
- #ignore punctuation
69
- text.downcase!
70
- text.gsub! /[^a-z ]/, " "
71
- to_remove = true
72
- until to_remove.nil?
73
- to_remove=text.gsub! " ", " " until to_remove.nil?
74
- end
75
- return text
76
- end
5
+ WordToNumber.new.instance_eval do
6
+ text = strip_punctuation text
7
+ #negative numbers
8
+ return -1 * (text.gsub(/^minus /, "")).in_numbers if text =~ /^minus /
77
9
 
78
- def decimal_portion text
79
- words = text.split " "
80
- integers = word_array_to_integers words
81
- decimal = "0." + integers.join()
82
- decimal.to_f
83
- end
10
+ #easy single word case
11
+ word = word_to_integer(text)
12
+ return word unless word.nil?
84
13
 
85
- def in_numbers
86
- text = self.to_s
87
- text = strip_punctuation text
88
- #negative numbers
89
- if text =~ /^minus /
90
- return -1 * (text.gsub(/^minus /, "")).in_numbers
91
- end
14
+ #decimals
15
+ match = text.match(/\spoint\s/)
16
+ if match
17
+ integer = match.pre_match.in_numbers
18
+
19
+ decimal = decimal_portion match.post_match
92
20
 
93
- #easy single word case
94
- word = word_to_integer(text)
95
- return word unless word.nil?
21
+ return integer + decimal
22
+ end
96
23
 
97
- #decimals
98
- match = text.match(/\spoint\s/)
99
- if match
100
- integer = match.pre_match
101
- integer = integer.in_numbers
24
+ #multiple word case
25
+ words = text.split " "
26
+ integers = word_array_to_integers words
102
27
 
103
- decimal = match.post_match
104
- decimal = decimal_portion(decimal)
105
- return integer + decimal
28
+ integer= parse_numbers(integers)
29
+ return integer unless integer.nil?
30
+ return nil
106
31
  end
32
+ end
107
33
 
108
- #multiple word case
109
- words = text.split " "
110
- integers = word_array_to_integers words
34
+ class WordToNumber
35
+ DIGITS= %w[zero one two three four five six seven eight nine]
36
+
37
+ EXCEPTIONS = {
38
+ "ten" => 10,
39
+ "eleven" => 11,
40
+ "twelve" => 12,
41
+ "thirteen" => 13,
42
+ "fourteen" => 14,
43
+ "fifteen" => 15,
44
+ "sixteen" => 16,
45
+ "seventeen" => 17,
46
+ "eighteen" => 18,
47
+ "nineteen" => 19,
48
+ "twenty" => 20,
49
+ "thirty" => 30,
50
+ "forty" => 40,
51
+ "fifty" => 50,
52
+ "sixty" => 60,
53
+ "seventy" => 70,
54
+ "eighty" => 80,
55
+ "ninety" => 90
56
+ }
57
+
58
+
59
+ POWERS_OF_TEN ={
60
+ "one" => 0,
61
+ "ten" => 1 ,
62
+ "hundred" => 2,
63
+ "thousand" => 3 ,
64
+ "million" => 6,
65
+ "billion" => 9,
66
+ "trillion" => 12,
67
+ "quadrillion" => 15,
68
+ "quintillion" => 18,
69
+ "sextillion" => 21,
70
+ "septillion" => 24,
71
+ "octillion" => 27,
72
+ "nonillion" => 30,
73
+ "decillion" => 33,
74
+ "undecillion" => 36,
75
+ "duodecillion" => 39,
76
+ "tredecillion" => 42,
77
+ "quattuordecillion" => 45,
78
+ "quindecillion" => 48,
79
+ "sexdecillion" => 51,
80
+ "septendecillion" => 54,
81
+ "octodecillion" => 57,
82
+ "novemdecillion" => 60,
83
+ "vigintillion" => 63,
84
+ "unvigintillion" => 66,
85
+ "duovigintillion" => 69,
86
+ "trevigintillion" => 72,
87
+ "quattuorvigintillion" => 75,
88
+ "quinvigintillion" => 78,
89
+ "sexvigintillion" => 81,
90
+ "septenvigintillion" => 84,
91
+ "octovigintillion" => 87,
92
+ "novemvigintillion" => 90,
93
+ "trigintillion" => 93,
94
+ "untrigintillion" => 96,
95
+ "duotrigintillion" => 99,
96
+ "googol" => 100
97
+ }
98
+
99
+ def strip_punctuation text
100
+ text = text.downcase.gsub /[^a-z ]/, " "
101
+ to_remove = true
102
+
103
+ to_remove = text.gsub! " ", " " while to_remove
104
+
105
+ text
106
+ end
111
107
 
112
- i= parse_numbers(integers)
113
- return i unless i.nil?
114
- return nil
115
- end
108
+ def decimal_portion text
109
+ words = text.split " "
110
+ integers = word_array_to_integers words
111
+ decimal = "0." + integers.join()
112
+ decimal.to_f
113
+ end
116
114
 
117
115
 
118
- # Example: 364,895,457,898
119
- #three hundred and sixty four billion eight hundred and ninety five million
120
- #four hundred and fifty seven thousand eight hundred and ninety eight
121
- #
122
- #3 100 60 4 10^9, 8 100 90 5 10^6, 4 100 50 7 1000, 8 100 90 8
123
- # memory answer
124
- #x1. 3 add to memory because answer and memory are zero 3 0
125
- #x2. memory * 100 (because memory<100) 300 0
126
- #x3. 60 add to memory because memory > 60 360 0
127
- #x3. 4 add to memory because memory > 4 364 0
128
- #x4. multiply memory by 10^9 because memory < power of ten 364*10^9 0
129
- #x5. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364*10^9
130
- #x6. 8 add to memory because not finished 8 ''
131
- #x7. multiply memory by 100 because memory < 100 800 ''
132
- #x8. add 90 to memory because memory > 90 890 ''
133
- #x9. add 5 to memory because memory > 5 895 ''
134
- #x10. multiply memory by 10^6 because memory < power of ten 895*10^6 ''
135
- #x11. add memory to answer (and reset) because memory power ten > 2 0 364895 * 10^6
136
- #x12. 4 add to memory because not finished 4 ''
137
- #x13. memory * 100 because memory < 100 400 ''
138
- #x14. memory + 50 because memory > 50 450 ''
139
- #x15. memory + 7 because memory > 7 457 ''
140
- #x16. memory * 1000 because memory < 1000 457000 ''
141
- #x17. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364895457000
142
- #x18. 8 add to memory because not finished 8 ''
143
- #x19. memory * 100 because memory < 100 800 ''
144
- #x14. memory + 90 because memory > 90 890 ''
145
- #x15. memory + 8 because memory > 8 898 ''
146
- #16. finished so add memory to answer
147
-
148
- #Example
149
- #2001
150
- #two thousand and one
151
- #2 1000 1
152
- # memory answer
153
- #1. add 2 to memory because first 2 0
154
- #2. multiply memory by 1000 because memory < 1000 2000 0
155
- #3. add memory to answer,reset, because power of ten>2 0 2000
156
- #4. add 1 to memory 1 2000
157
- #5. finish - add memory to answer 0 2001
158
- def parse_numbers(integers)
159
- memory = 0
160
- answer = 0
161
- reset = true #reset each time memory is reset
162
- integers.each_with_index do |i, index|
163
- if reset
164
- reset = false
165
- memory += i
166
- else
167
- #x4. multiply memory by 10^9 because memory < power of ten
168
- if is_power_of_ten?(i)
169
- if power_of_ten(i)> 2
170
- memory *= i
171
- #17. add memory to answer (and reset) (memory pow of ten > 2)
172
- answer += memory
173
- memory = 0
174
- reset = true
116
+ private
117
+
118
+ # Example: 364,895,457,898
119
+ #three hundred and sixty four billion eight hundred and ninety five million
120
+ #four hundred and fifty seven thousand eight hundred and ninety eight
121
+ #
122
+ #3 100 60 4 10^9, 8 100 90 5 10^6, 4 100 50 7 1000, 8 100 90 8
123
+ # memory answer
124
+ #x1. 3 add to memory because answer and memory are zero 3 0
125
+ #x2. memory * 100 (because memory<100) 300 0
126
+ #x3. 60 add to memory because memory > 60 360 0
127
+ #x3. 4 add to memory because memory > 4 364 0
128
+ #x4. multiply memory by 10^9 because memory < power of ten 364*10^9 0
129
+ #x5. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364*10^9
130
+ #x6. 8 add to memory because not finished 8 ''
131
+ #x7. multiply memory by 100 because memory < 100 800 ''
132
+ #x8. add 90 to memory because memory > 90 890 ''
133
+ #x9. add 5 to memory because memory > 5 895 ''
134
+ #x10. multiply memory by 10^6 because memory < power of ten 895*10^6 ''
135
+ #x11. add memory to answer (and reset) because memory power ten > 2 0 364895 * 10^6
136
+ #x12. 4 add to memory because not finished 4 ''
137
+ #x13. memory * 100 because memory < 100 400 ''
138
+ #x14. memory + 50 because memory > 50 450 ''
139
+ #x15. memory + 7 because memory > 7 457 ''
140
+ #x16. memory * 1000 because memory < 1000 457000 ''
141
+ #x17. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364895457000
142
+ #x18. 8 add to memory because not finished 8 ''
143
+ #x19. memory * 100 because memory < 100 800 ''
144
+ #x14. memory + 90 because memory > 90 890 ''
145
+ #x15. memory + 8 because memory > 8 898 ''
146
+ #16. finished so add memory to answer
147
+
148
+ #Example
149
+ #2001
150
+ #two thousand and one
151
+ #2 1000 1
152
+ # memory answer
153
+ #1. add 2 to memory because first 2 0
154
+ #2. multiply memory by 1000 because memory < 1000 2000 0
155
+ #3. add memory to answer,reset, because power of ten>2 0 2000
156
+ #4. add 1 to memory 1 2000
157
+ #5. finish - add memory to answer 0 2001
158
+ def parse_numbers(integers)
159
+ memory = 0
160
+ answer = 0
161
+ reset = true #reset each time memory is reset
162
+ integers.each_with_index do |integer, index|
163
+ if reset
164
+ reset = false
165
+ memory += integer
166
+ else
167
+ #x4. multiply memory by 10^9 because memory < power of ten
168
+ if is_power_of_ten?(integer)
169
+ if power_of_ten(integer)> 2
170
+ memory *= integer
171
+ #17. add memory to answer (and reset) (memory pow of ten > 2)
172
+ answer += memory
173
+ memory = 0
174
+ reset = true
175
+ end
175
176
  end
176
- end
177
177
 
178
- if memory < i
179
- memory *= i
180
- else
181
- memory += i
178
+ if memory < integer
179
+ memory *= integer
180
+ else
181
+ memory += integer
182
+ end
182
183
  end
183
184
  end
185
+ answer += memory
184
186
  end
185
- answer += memory
186
- end
187
187
 
188
- def power_of_ten integer
189
- Math.log10(integer)
190
- end
188
+ def power_of_ten integer
189
+ Math.log10(integer)
190
+ end
191
191
 
192
- def is_power_of_ten? integer
193
- power_of_ten(integer)==power_of_ten(integer).to_i
194
- end
192
+ def is_power_of_ten? integer
193
+ power_of_ten(integer)==power_of_ten(integer).to_i
194
+ end
195
195
 
196
- #handles simple single word numbers
197
- #e.g. one, seven, twenty, eight, thousand etc
198
- def word_to_integer word
199
- text = word.to_s.chomp.strip
200
- #digits 0-9
201
- digit = DIGITS.index(text)
202
- return digit unless digit.nil?
203
-
204
- #digits which are exceptions
205
- exception = EXCEPTIONS[text]
206
- return exception unless exception.nil?
207
-
208
- power = POWERS_OF_TEN[text]
209
- return 10**power unless power.nil?
210
- return nil
211
- end
196
+ #handles simple single word numbers
197
+ #e.g. one, seven, twenty, eight, thousand etc
198
+ def word_to_integer word
199
+ text = word.to_s.chomp.strip
200
+ #digits 0-9
201
+ digit = DIGITS.index(text)
202
+ return digit unless digit.nil?
203
+
204
+ #digits which are exceptions
205
+ exception = EXCEPTIONS[text]
206
+ return exception unless exception.nil?
207
+
208
+ power = POWERS_OF_TEN[text]
209
+ return 10**power unless power.nil?
210
+ end
212
211
 
213
- def word_array_to_integers words
214
- out = []
215
- words.map do |i|
216
- word = word_to_integer(i)
217
- out << word unless word.nil?
212
+ def word_array_to_integers words
213
+ words.map { |i| word_to_integer i }.compact
218
214
  end
219
- return out
220
215
  end
221
216
  end
222
217
 
@@ -1,29 +1,28 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = %q{numbers_in_words}
5
- s.version = "0.1.0"
4
+ s.name = "numbers_in_words"
5
+ s.version = "0.1.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Mark Burns"]
9
- s.date = %q{2010-04-06}
10
- s.description = %q{#in_words method for integers and #in_numbers for strings}
11
- s.email = %q{markthedeveloper@googlemail.com}
9
+ s.date = "2012-04-10"
10
+ s.description = "#in_words method for integers and #in_numbers for strings"
11
+ s.email = "markthedeveloper@gmail.com"
12
12
  s.extra_rdoc_files = ["CHANGELOG", "README", "lib/numbers.rb", "lib/numbers_in_words.rb", "lib/words.rb"]
13
- s.files = ["CHANGELOG", "Manifest", "README", "Rakefile", "examples/display_numbers_in_words.rb", "init.rb", "lib/numbers.rb", "lib/numbers_in_words.rb", "lib/words.rb", "numbers_in_words.gemspec", "spec/numbers_in_words_spec.rb", "spec/words_in_numbers_spec.rb"]
14
- s.homepage = %q{http://rubygems.org/gems/numbers_in_words}
13
+ s.files = ["CHANGELOG", "Manifest", "README", "Rakefile", "examples/display_numbers_in_words.rb", "init.rb", "lib/numbers.rb", "lib/numbers_in_words.rb", "lib/words.rb", "spec/numbers_in_words_spec.rb", "spec/words_in_numbers_spec.rb", "numbers_in_words.gemspec"]
14
+ s.homepage = "http://rubygems.org/gems/numbers_in_words"
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Numbers_in_words", "--main", "README"]
16
16
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{numbers_in_words}
18
- s.rubygems_version = %q{1.3.6}
19
- s.summary = %q{Example: 123.in_words #=> "one hundred and twenty three", "seventy-five point eight".in_numbers #=> 75.8}
17
+ s.rubyforge_project = "numbers_in_words"
18
+ s.rubygems_version = "1.8.17"
19
+ s.summary = "Example: 123.in_words #=> \"one hundred and twenty three\", \"seventy-five point eight\".in_numbers #=> 75.8"
20
20
 
21
21
  if s.respond_to? :specification_version then
22
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
22
  s.specification_version = 3
24
23
 
25
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
- s.add_development_dependency(%q<active_support>, [">= 0"])
24
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
+ s.add_runtime_dependency(%q<active_support>, [">= 0"])
27
26
  else
28
27
  s.add_dependency(%q<active_support>, [">= 0"])
29
28
  end