numbers_in_words 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +11 -0
- data/Rakefile +13 -0
- data/index_cyclo.html +83 -0
- data/lib/numbers_in_words.rb_cyclo.html +100 -0
- data/lib/words_in_numbers.rb +199 -0
- data/lib/words_in_numbers.rb_cyclo.html +92 -0
- data/numbers_in_words.gemspec +33 -0
- data/numbers_in_words.rb +8 -0
- data/spec/numbers_in_words_spec.rb +1 -0
- data/spec/words_in_numbers_spec.rb +94 -0
- metadata +41 -15
- data/README +0 -70
data/Manifest
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Manifest
|
2
|
+
Rakefile
|
3
|
+
examples/display_numbers_in_words.rb
|
4
|
+
index_cyclo.html
|
5
|
+
lib/numbers_in_words.rb
|
6
|
+
lib/numbers_in_words.rb_cyclo.html
|
7
|
+
lib/words_in_numbers.rb
|
8
|
+
lib/words_in_numbers.rb_cyclo.html
|
9
|
+
numbers_in_words.rb
|
10
|
+
spec/numbers_in_words_spec.rb
|
11
|
+
spec/words_in_numbers_spec.rb
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
Echoe.new('numbers_in_words','0.0.7') do |e|
|
5
|
+
e.description = ""
|
6
|
+
e.url = "http://rubygems.org/gems/numbers_in_words"
|
7
|
+
e.author = "Mark Burns"
|
8
|
+
e.email = "markthedeveloper@googlemail.com"
|
9
|
+
e.ignore_pattern = ["tmp/*",".git/*"]
|
10
|
+
e.development_dependencies = ['active_support']
|
11
|
+
end
|
12
|
+
|
13
|
+
|
data/index_cyclo.html
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
<html><head><title>Index for cyclomatic complexity</title></head>
|
2
|
+
<style>
|
3
|
+
body {
|
4
|
+
margin: 20px;
|
5
|
+
padding: 0;
|
6
|
+
font-size: 12px;
|
7
|
+
font-family: bitstream vera sans, verdana, arial, sans serif;
|
8
|
+
background-color: #efefef;
|
9
|
+
}
|
10
|
+
|
11
|
+
table {
|
12
|
+
border-collapse: collapse;
|
13
|
+
/*border-spacing: 0;*/
|
14
|
+
border: 1px solid #666;
|
15
|
+
background-color: #fff;
|
16
|
+
margin-bottom: 20px;
|
17
|
+
}
|
18
|
+
|
19
|
+
table, th, th+th, td, td+td {
|
20
|
+
border: 1px solid #ccc;
|
21
|
+
}
|
22
|
+
|
23
|
+
table th {
|
24
|
+
font-size: 12px;
|
25
|
+
color: #fc0;
|
26
|
+
padding: 4px 0;
|
27
|
+
background-color: #336;
|
28
|
+
}
|
29
|
+
|
30
|
+
th, td {
|
31
|
+
padding: 4px 10px;
|
32
|
+
}
|
33
|
+
|
34
|
+
td {
|
35
|
+
font-size: 13px;
|
36
|
+
}
|
37
|
+
|
38
|
+
.class_name {
|
39
|
+
font-size: 17px;
|
40
|
+
margin: 20px 0 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
.class_complexity {
|
44
|
+
margin: 0 auto;
|
45
|
+
}
|
46
|
+
|
47
|
+
.class_complexity>.class_complexity {
|
48
|
+
margin: 0;
|
49
|
+
}
|
50
|
+
|
51
|
+
.class_total_complexity, .class_total_lines, .start_token_count, .file_count {
|
52
|
+
font-size: 13px;
|
53
|
+
font-weight: bold;
|
54
|
+
}
|
55
|
+
|
56
|
+
.class_total_complexity, .class_total_lines {
|
57
|
+
color: #c00;
|
58
|
+
}
|
59
|
+
|
60
|
+
.start_token_count, .file_count {
|
61
|
+
color: #333;
|
62
|
+
}
|
63
|
+
|
64
|
+
.warning {
|
65
|
+
background-color: yellow;
|
66
|
+
}
|
67
|
+
|
68
|
+
.error {
|
69
|
+
background-color: #f00;
|
70
|
+
}
|
71
|
+
</style>
|
72
|
+
|
73
|
+
<body>
|
74
|
+
<h1>Index for cyclomatic complexity</h1>
|
75
|
+
|
76
|
+
<hr/>
|
77
|
+
<h2 class="class_name">Analyzed Files</h2>
|
78
|
+
<ul>
|
79
|
+
<li>
|
80
|
+
<p class="file_name"><a href="./lib/words_in_numbers.rb_cyclo.html">lib/words_in_numbers.rb</a>
|
81
|
+
</li>
|
82
|
+
</ul>
|
83
|
+
</body></html>
|
@@ -0,0 +1,100 @@
|
|
1
|
+
<html><head><title>Cyclometric Complexity</title></head>
|
2
|
+
<style>
|
3
|
+
body {
|
4
|
+
margin: 20px;
|
5
|
+
padding: 0;
|
6
|
+
font-size: 12px;
|
7
|
+
font-family: bitstream vera sans, verdana, arial, sans serif;
|
8
|
+
background-color: #efefef;
|
9
|
+
}
|
10
|
+
|
11
|
+
table {
|
12
|
+
border-collapse: collapse;
|
13
|
+
/*border-spacing: 0;*/
|
14
|
+
border: 1px solid #666;
|
15
|
+
background-color: #fff;
|
16
|
+
margin-bottom: 20px;
|
17
|
+
}
|
18
|
+
|
19
|
+
table, th, th+th, td, td+td {
|
20
|
+
border: 1px solid #ccc;
|
21
|
+
}
|
22
|
+
|
23
|
+
table th {
|
24
|
+
font-size: 12px;
|
25
|
+
color: #fc0;
|
26
|
+
padding: 4px 0;
|
27
|
+
background-color: #336;
|
28
|
+
}
|
29
|
+
|
30
|
+
th, td {
|
31
|
+
padding: 4px 10px;
|
32
|
+
}
|
33
|
+
|
34
|
+
td {
|
35
|
+
font-size: 13px;
|
36
|
+
}
|
37
|
+
|
38
|
+
.class_name {
|
39
|
+
font-size: 17px;
|
40
|
+
margin: 20px 0 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
.class_complexity {
|
44
|
+
margin: 0 auto;
|
45
|
+
}
|
46
|
+
|
47
|
+
.class_complexity>.class_complexity {
|
48
|
+
margin: 0;
|
49
|
+
}
|
50
|
+
|
51
|
+
.class_total_complexity, .class_total_lines, .start_token_count, .file_count {
|
52
|
+
font-size: 13px;
|
53
|
+
font-weight: bold;
|
54
|
+
}
|
55
|
+
|
56
|
+
.class_total_complexity, .class_total_lines {
|
57
|
+
color: #c00;
|
58
|
+
}
|
59
|
+
|
60
|
+
.start_token_count, .file_count {
|
61
|
+
color: #333;
|
62
|
+
}
|
63
|
+
|
64
|
+
.warning {
|
65
|
+
background-color: yellow;
|
66
|
+
}
|
67
|
+
|
68
|
+
.error {
|
69
|
+
background-color: #f00;
|
70
|
+
}
|
71
|
+
</style>
|
72
|
+
<body>
|
73
|
+
<div class="class_complexity">
|
74
|
+
<h2 class="class_name">Module : NumbersInWords</h2>
|
75
|
+
<div class="class_total_complexity">Total Complexity: 36</div>
|
76
|
+
<div class="class_total_lines">Total Lines: 197</div>
|
77
|
+
<table width="100%" border="1">
|
78
|
+
<tr><th>Method</th><th>Complexity</th><th># Lines</th></tr>
|
79
|
+
<tr><td>english_group</td><td>5</td><td>13</td></tr>
|
80
|
+
<tr><td>in_english</td><td class="warning">10</td><td>31</td></tr>
|
81
|
+
</table>
|
82
|
+
</div>
|
83
|
+
<div class="class_complexity">
|
84
|
+
<h2 class="class_name">Class : Fixnum</h2>
|
85
|
+
<div class="class_total_complexity">Total Complexity: 0</div>
|
86
|
+
<div class="class_total_lines">Total Lines: 2</div>
|
87
|
+
<table width="100%" border="1">
|
88
|
+
<tr><th>Method</th><th>Complexity</th><th># Lines</th></tr>
|
89
|
+
</table>
|
90
|
+
</div>
|
91
|
+
<div class="class_complexity">
|
92
|
+
<h2 class="class_name">Class : Bignum</h2>
|
93
|
+
<div class="class_total_complexity">Total Complexity: 0</div>
|
94
|
+
<div class="class_total_lines">Total Lines: 2</div>
|
95
|
+
<table width="100%" border="1">
|
96
|
+
<tr><th>Method</th><th>Complexity</th><th># Lines</th></tr>
|
97
|
+
</table>
|
98
|
+
</div>
|
99
|
+
</body>
|
100
|
+
</html>
|
@@ -0,0 +1,199 @@
|
|
1
|
+
module WordsInNumbers
|
2
|
+
|
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 in_numbers
|
68
|
+
#easy single word case
|
69
|
+
text = self.to_s
|
70
|
+
text.downcase!
|
71
|
+
text.gsub! /[^a-z ]/, " "
|
72
|
+
to_remove = true
|
73
|
+
until to_remove.nil?
|
74
|
+
to_remove=text.gsub! " ", " " until to_remove.nil?
|
75
|
+
end
|
76
|
+
|
77
|
+
if text =~ /^minus /
|
78
|
+
return -1 * (text.gsub(/^minus /, "")).in_numbers
|
79
|
+
end
|
80
|
+
word = word_to_integer(text)
|
81
|
+
return word unless word.nil?
|
82
|
+
words = text.split " "
|
83
|
+
integers = word_array_to_integers words
|
84
|
+
|
85
|
+
i= parse_numbers(integers)
|
86
|
+
return i unless i.nil?
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
# Example: 364,895,457,898
|
92
|
+
#three hundred and sixty four billion eight hundred and ninety five million
|
93
|
+
#four hundred and fifty seven thousand eight hundred and ninety eight
|
94
|
+
#
|
95
|
+
#3 100 60 4 10^9, 8 100 90 5 10^6, 4 100 50 7 1000, 8 100 90 8
|
96
|
+
# memory answer
|
97
|
+
#x1. 3 add to memory because answer and memory are zero 3 0
|
98
|
+
#x2. memory * 100 (because memory<100) 300 0
|
99
|
+
#x3. 60 add to memory because memory > 60 360 0
|
100
|
+
#x3. 4 add to memory because memory > 4 364 0
|
101
|
+
#x4. multiply memory by 10^9 because memory < power of ten 364*10^9 0
|
102
|
+
#x5. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364*10^9
|
103
|
+
#x6. 8 add to memory because not finished 8 ''
|
104
|
+
#x7. multiply memory by 100 because memory < 100 800 ''
|
105
|
+
#x8. add 90 to memory because memory > 90 890 ''
|
106
|
+
#x9. add 5 to memory because memory > 5 895 ''
|
107
|
+
#x10. multiply memory by 10^6 because memory < power of ten 895*10^6 ''
|
108
|
+
#x11. add memory to answer (and reset) because memory power ten > 2 0 364895 * 10^6
|
109
|
+
#x12. 4 add to memory because not finished 4 ''
|
110
|
+
#x13. memory * 100 because memory < 100 400 ''
|
111
|
+
#x14. memory + 50 because memory > 50 450 ''
|
112
|
+
#x15. memory + 7 because memory > 7 457 ''
|
113
|
+
#x16. memory * 1000 because memory < 1000 457000 ''
|
114
|
+
#x17. add memory to answer (and reset)memory > 8 (memory pow of ten > 2) 0 364895457000
|
115
|
+
#x18. 8 add to memory because not finished 8 ''
|
116
|
+
#x19. memory * 100 because memory < 100 800 ''
|
117
|
+
#x14. memory + 90 because memory > 90 890 ''
|
118
|
+
#x15. memory + 8 because memory > 8 898 ''
|
119
|
+
#16. finished so add memory to answer
|
120
|
+
|
121
|
+
#Example
|
122
|
+
#2001
|
123
|
+
#two thousand and one
|
124
|
+
#2 1000 1
|
125
|
+
# memory answer
|
126
|
+
#1. add 2 to memory because first 2 0
|
127
|
+
#2. multiply memory by 1000 because memory < 1000 2000 0
|
128
|
+
#3. add memory to answer,reset, because power of ten>2 0 2000
|
129
|
+
#4. add 1 to memory 1 2000
|
130
|
+
#5. finish - add memory to answer 0 2001
|
131
|
+
def parse_numbers(integers)
|
132
|
+
memory = 0
|
133
|
+
answer = 0
|
134
|
+
reset = true #reset each time memory is reset
|
135
|
+
integers.each_with_index do |i, index|
|
136
|
+
if reset
|
137
|
+
reset = false
|
138
|
+
memory += i
|
139
|
+
else
|
140
|
+
#x4. multiply memory by 10^9 because memory < power of ten
|
141
|
+
if is_power_of_ten?(i)
|
142
|
+
if power_of_ten(i)> 2
|
143
|
+
memory *= i
|
144
|
+
#17. add memory to answer (and reset) (memory pow of ten > 2)
|
145
|
+
answer += memory
|
146
|
+
memory = 0
|
147
|
+
reset = true
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
if memory < i
|
152
|
+
memory *= i
|
153
|
+
else
|
154
|
+
memory += i
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
answer += memory
|
159
|
+
end
|
160
|
+
|
161
|
+
def power_of_ten integer
|
162
|
+
Math.log10(integer)
|
163
|
+
end
|
164
|
+
|
165
|
+
def is_power_of_ten? integer
|
166
|
+
power_of_ten(integer)==power_of_ten(integer).to_i
|
167
|
+
end
|
168
|
+
|
169
|
+
#handles simple single word numbers
|
170
|
+
#e.g. one, seven, twenty, eight, thousand etc
|
171
|
+
def word_to_integer word
|
172
|
+
text = word.to_s.chomp.strip
|
173
|
+
#digits 0-9
|
174
|
+
digit = DIGITS.index(text)
|
175
|
+
return digit unless digit.nil?
|
176
|
+
|
177
|
+
#digits which are exceptions
|
178
|
+
exception = EXCEPTIONS[text]
|
179
|
+
return exception unless exception.nil?
|
180
|
+
|
181
|
+
power = POWERS_OF_TEN[text]
|
182
|
+
return 10**power unless power.nil?
|
183
|
+
return nil
|
184
|
+
end
|
185
|
+
|
186
|
+
def word_array_to_integers words
|
187
|
+
out = []
|
188
|
+
words.map do |i|
|
189
|
+
word = word_to_integer(i)
|
190
|
+
out << word unless word.nil?
|
191
|
+
end
|
192
|
+
return out
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
class String
|
197
|
+
include WordsInNumbers
|
198
|
+
end
|
199
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
<html><head><title>Cyclometric Complexity</title></head>
|
2
|
+
<style>
|
3
|
+
body {
|
4
|
+
margin: 20px;
|
5
|
+
padding: 0;
|
6
|
+
font-size: 12px;
|
7
|
+
font-family: bitstream vera sans, verdana, arial, sans serif;
|
8
|
+
background-color: #efefef;
|
9
|
+
}
|
10
|
+
|
11
|
+
table {
|
12
|
+
border-collapse: collapse;
|
13
|
+
/*border-spacing: 0;*/
|
14
|
+
border: 1px solid #666;
|
15
|
+
background-color: #fff;
|
16
|
+
margin-bottom: 20px;
|
17
|
+
}
|
18
|
+
|
19
|
+
table, th, th+th, td, td+td {
|
20
|
+
border: 1px solid #ccc;
|
21
|
+
}
|
22
|
+
|
23
|
+
table th {
|
24
|
+
font-size: 12px;
|
25
|
+
color: #fc0;
|
26
|
+
padding: 4px 0;
|
27
|
+
background-color: #336;
|
28
|
+
}
|
29
|
+
|
30
|
+
th, td {
|
31
|
+
padding: 4px 10px;
|
32
|
+
}
|
33
|
+
|
34
|
+
td {
|
35
|
+
font-size: 13px;
|
36
|
+
}
|
37
|
+
|
38
|
+
.class_name {
|
39
|
+
font-size: 17px;
|
40
|
+
margin: 20px 0 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
.class_complexity {
|
44
|
+
margin: 0 auto;
|
45
|
+
}
|
46
|
+
|
47
|
+
.class_complexity>.class_complexity {
|
48
|
+
margin: 0;
|
49
|
+
}
|
50
|
+
|
51
|
+
.class_total_complexity, .class_total_lines, .start_token_count, .file_count {
|
52
|
+
font-size: 13px;
|
53
|
+
font-weight: bold;
|
54
|
+
}
|
55
|
+
|
56
|
+
.class_total_complexity, .class_total_lines {
|
57
|
+
color: #c00;
|
58
|
+
}
|
59
|
+
|
60
|
+
.start_token_count, .file_count {
|
61
|
+
color: #333;
|
62
|
+
}
|
63
|
+
|
64
|
+
.warning {
|
65
|
+
background-color: yellow;
|
66
|
+
}
|
67
|
+
|
68
|
+
.error {
|
69
|
+
background-color: #f00;
|
70
|
+
}
|
71
|
+
</style>
|
72
|
+
<body>
|
73
|
+
<div class="class_complexity">
|
74
|
+
<h2 class="class_name">Module : WordsInNumbers</h2>
|
75
|
+
<div class="class_total_complexity">Total Complexity: 21</div>
|
76
|
+
<div class="class_total_lines">Total Lines: 194</div>
|
77
|
+
<table width="100%" border="1">
|
78
|
+
<tr><th>Method</th><th>Complexity</th><th># Lines</th></tr>
|
79
|
+
<tr><td>in_numbers</td><td>6</td><td>22</td></tr>
|
80
|
+
<tr><td>parse_numbers</td><td>6</td><td>28</td></tr>
|
81
|
+
</table>
|
82
|
+
</div>
|
83
|
+
<div class="class_complexity">
|
84
|
+
<h2 class="class_name">Class : String</h2>
|
85
|
+
<div class="class_total_complexity">Total Complexity: 0</div>
|
86
|
+
<div class="class_total_lines">Total Lines: 2</div>
|
87
|
+
<table width="100%" border="1">
|
88
|
+
<tr><th>Method</th><th>Complexity</th><th># Lines</th></tr>
|
89
|
+
</table>
|
90
|
+
</div>
|
91
|
+
</body>
|
92
|
+
</html>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{numbers_in_words}
|
5
|
+
s.version = "0.0.7"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Mark Burns"]
|
9
|
+
s.date = %q{2010-04-06}
|
10
|
+
s.description = %q{}
|
11
|
+
s.email = %q{markthedeveloper@googlemail.com}
|
12
|
+
s.extra_rdoc_files = ["lib/numbers_in_words.rb", "lib/numbers_in_words.rb_cyclo.html", "lib/words_in_numbers.rb", "lib/words_in_numbers.rb_cyclo.html"]
|
13
|
+
s.files = ["Manifest", "Rakefile", "examples/display_numbers_in_words.rb", "index_cyclo.html", "lib/numbers_in_words.rb", "lib/numbers_in_words.rb_cyclo.html", "lib/words_in_numbers.rb", "lib/words_in_numbers.rb_cyclo.html", "numbers_in_words.rb", "spec/numbers_in_words_spec.rb", "spec/words_in_numbers_spec.rb", "numbers_in_words.gemspec"]
|
14
|
+
s.homepage = %q{http://rubygems.org/gems/numbers_in_words}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Numbers_in_words"]
|
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{}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_development_dependency(%q<active_support>, [">= 0"])
|
27
|
+
else
|
28
|
+
s.add_dependency(%q<active_support>, [">= 0"])
|
29
|
+
end
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<active_support>, [">= 0"])
|
32
|
+
end
|
33
|
+
end
|
data/numbers_in_words.rb
ADDED
@@ -38,6 +38,7 @@ describe Fixnum do
|
|
38
38
|
-123456789.in_words.should == "minus one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine"
|
39
39
|
end
|
40
40
|
it "should handle decimals" do
|
41
|
+
pending
|
41
42
|
1.1.in_words.should == "one point one"
|
42
43
|
1.2345678.in_words.should == "one point two three four five six seven eight"
|
43
44
|
1000.2345678.in_words.should == "one thousand point two three four five six seven eight"
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'lib/words_in_numbers'
|
2
|
+
describe WordsInNumbers do
|
3
|
+
it "should do the digits 0-10" do
|
4
|
+
"zero".in_numbers.should == 0
|
5
|
+
"one".in_numbers.should == 1
|
6
|
+
"two".in_numbers.should == 2
|
7
|
+
"three".in_numbers.should == 3
|
8
|
+
"four".in_numbers.should == 4
|
9
|
+
"five".in_numbers.should == 5
|
10
|
+
"six".in_numbers.should == 6
|
11
|
+
"seven".in_numbers.should == 7
|
12
|
+
"eight".in_numbers.should == 8
|
13
|
+
"nine".in_numbers.should == 9
|
14
|
+
end
|
15
|
+
it "should handle numbers for which there is one word" do
|
16
|
+
"ten".in_numbers.should == 10
|
17
|
+
"eleven".in_numbers.should == 11
|
18
|
+
"twelve".in_numbers.should == 12
|
19
|
+
"thirteen".in_numbers.should == 13
|
20
|
+
"fourteen".in_numbers.should == 14
|
21
|
+
"fifteen".in_numbers.should == 15
|
22
|
+
"sixteen".in_numbers.should == 16
|
23
|
+
"seventeen".in_numbers.should == 17
|
24
|
+
"eighteen".in_numbers.should == 18
|
25
|
+
"nineteen".in_numbers.should == 19
|
26
|
+
"twenty".in_numbers.should == 20
|
27
|
+
end
|
28
|
+
it "should handle two word numbers up to 100" do
|
29
|
+
"twenty one".in_numbers.should == 21
|
30
|
+
"twenty two".in_numbers.should == 22
|
31
|
+
"twenty three".in_numbers.should == 23
|
32
|
+
"twenty four".in_numbers.should == 24
|
33
|
+
"twenty five".in_numbers.should == 25
|
34
|
+
"twenty six".in_numbers.should == 26
|
35
|
+
"twenty seven".in_numbers.should == 27
|
36
|
+
"twenty eight".in_numbers.should == 28
|
37
|
+
"seventy six".in_numbers.should == 76
|
38
|
+
"ninety nine".in_numbers.should == 99
|
39
|
+
end
|
40
|
+
it "should handle hundreds" do
|
41
|
+
"one hundred".in_numbers.should == 100
|
42
|
+
"two hundred".in_numbers.should == 200
|
43
|
+
"three hundred".in_numbers.should == 300
|
44
|
+
"nine hundred".in_numbers.should == 900
|
45
|
+
"one hundred and seventy six".in_numbers.should == 176
|
46
|
+
"one hundred and seventy nine".in_numbers.should == 179
|
47
|
+
"nine hundred and ninety nine".in_numbers.should == 999
|
48
|
+
|
49
|
+
end
|
50
|
+
it "should handle unusual hundreds" do
|
51
|
+
"eleven hundred".in_numbers.should == 1100
|
52
|
+
"twelve hundred".in_numbers.should == 1200
|
53
|
+
"thirteen hundred".in_numbers.should == 1300
|
54
|
+
"fifteen hundred".in_numbers.should == 1500
|
55
|
+
"nineteen hundred".in_numbers.should == 1900
|
56
|
+
|
57
|
+
end
|
58
|
+
it "should handle thousands" do
|
59
|
+
"two thousand and one".in_numbers.should == 2001
|
60
|
+
"one thousand".in_numbers.should == 1000
|
61
|
+
"two thousand".in_numbers.should == 2000
|
62
|
+
"three thousand".in_numbers.should == 3000
|
63
|
+
"nine thousand".in_numbers.should == 9000
|
64
|
+
"nine thousand two hundred".in_numbers.should == 9200
|
65
|
+
"nine thousand two hundred and seven".in_numbers.should == 9207
|
66
|
+
"nine thousand two hundred and ninety seven".in_numbers.should == 9297
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should handle larger numbers" do
|
70
|
+
"one million".in_numbers.should == 1000000
|
71
|
+
"two googol five billion and seventy six".in_numbers.should == (2*10**100 + 5*10**9 + 76)
|
72
|
+
"thirty seven million".in_numbers.should == 37 * 10**6
|
73
|
+
"twenty six googol".in_numbers.should == 26 * 10**100
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should handle numbers in hundreds of thousands etc" do
|
77
|
+
"nine hundred thousand".in_numbers.should == 900000
|
78
|
+
"three hundred and fifty seven thousand".in_numbers.should == 357000
|
79
|
+
"five million three hundred and fifty seven thousand".in_numbers.should == 5357000
|
80
|
+
"nine hundred and ninety nine trillion".in_numbers.should == 999 * 10**12
|
81
|
+
end
|
82
|
+
it "should handle negative numbers" do
|
83
|
+
"minus one".in_numbers.should == -1
|
84
|
+
"minus two googol".in_numbers.should == -2 * 10**100
|
85
|
+
"minus nine hundred and ninety nine trillion".in_numbers.should == -999 * 10**12
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should ignore punctuation and capitalisation" do
|
89
|
+
"Minus one".in_numbers.should == -1
|
90
|
+
"FIVE Million, three hundred and fifty-seVen Thousand".in_numbers.should == 5357000
|
91
|
+
"FIVE,,./';';';[] Million, three hundred and fifty-seVen Thousand".in_numbers.should == 5357000
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 7
|
9
|
+
version: 0.0.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mark Burns
|
@@ -16,28 +16,53 @@ cert_chain: []
|
|
16
16
|
|
17
17
|
date: 2010-04-06 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
21
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: active_support
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
32
|
+
description: ""
|
22
33
|
email: markthedeveloper@googlemail.com
|
23
34
|
executables: []
|
24
35
|
|
25
36
|
extensions: []
|
26
37
|
|
27
|
-
extra_rdoc_files:
|
28
|
-
|
29
|
-
files:
|
30
|
-
- README
|
38
|
+
extra_rdoc_files:
|
31
39
|
- lib/numbers_in_words.rb
|
40
|
+
- lib/numbers_in_words.rb_cyclo.html
|
41
|
+
- lib/words_in_numbers.rb
|
42
|
+
- lib/words_in_numbers.rb_cyclo.html
|
43
|
+
files:
|
44
|
+
- Manifest
|
45
|
+
- Rakefile
|
32
46
|
- examples/display_numbers_in_words.rb
|
47
|
+
- index_cyclo.html
|
48
|
+
- lib/numbers_in_words.rb
|
49
|
+
- lib/numbers_in_words.rb_cyclo.html
|
50
|
+
- lib/words_in_numbers.rb
|
51
|
+
- lib/words_in_numbers.rb_cyclo.html
|
52
|
+
- numbers_in_words.rb
|
33
53
|
- spec/numbers_in_words_spec.rb
|
54
|
+
- spec/words_in_numbers_spec.rb
|
55
|
+
- numbers_in_words.gemspec
|
34
56
|
has_rdoc: true
|
35
|
-
homepage: http://
|
57
|
+
homepage: http://rubygems.org/gems/numbers_in_words
|
36
58
|
licenses: []
|
37
59
|
|
38
60
|
post_install_message:
|
39
|
-
rdoc_options:
|
40
|
-
|
61
|
+
rdoc_options:
|
62
|
+
- --line-numbers
|
63
|
+
- --inline-source
|
64
|
+
- --title
|
65
|
+
- Numbers_in_words
|
41
66
|
require_paths:
|
42
67
|
- lib
|
43
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -52,14 +77,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
77
|
- - ">="
|
53
78
|
- !ruby/object:Gem::Version
|
54
79
|
segments:
|
55
|
-
-
|
56
|
-
|
80
|
+
- 1
|
81
|
+
- 2
|
82
|
+
version: "1.2"
|
57
83
|
requirements: []
|
58
84
|
|
59
85
|
rubyforge_project: numbers_in_words
|
60
86
|
rubygems_version: 1.3.6
|
61
87
|
signing_key:
|
62
88
|
specification_version: 3
|
63
|
-
summary:
|
89
|
+
summary: ""
|
64
90
|
test_files: []
|
65
91
|
|
data/README
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
Installation
|
2
|
-
============
|
3
|
-
|
4
|
-
|
5
|
-
gem install numbers_in_words
|
6
|
-
|
7
|
-
or
|
8
|
-
|
9
|
-
sudo gem install numbers_in_words
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
The file numbers_to_words defines a module NumbersToWords which is included in Fixnum and Bignum.
|
14
|
-
The in_words method can then be used on any Fixnum or Bignum object.
|
15
|
-
|
16
|
-
E.g.
|
17
|
-
>require 'numbers_in_words'
|
18
|
-
>112.in_words
|
19
|
-
#=> one hundred and twelve
|
20
|
-
|
21
|
-
To try it out the program display_numbers_to_words.rb expects two integer parameters to define a
|
22
|
-
range. It then prints out all numbers in words included in this range.
|
23
|
-
|
24
|
-
e.g.
|
25
|
-
|
26
|
-
>ruby display_numbers_to_words.rb 1 11
|
27
|
-
one
|
28
|
-
two
|
29
|
-
three
|
30
|
-
four
|
31
|
-
five
|
32
|
-
six
|
33
|
-
seven
|
34
|
-
eight
|
35
|
-
nine
|
36
|
-
ten
|
37
|
-
eleven
|
38
|
-
|
39
|
-
Whilst creating this project I realized that in English:
|
40
|
-
|
41
|
-
* Numbers are grouped in groups of threes
|
42
|
-
* Numbers less than 1,000 are grouped by hundreds and then by tens
|
43
|
-
* There are specific rules for when we put an "and" in between numbers
|
44
|
-
|
45
|
-
It makes sense to manage the numbers by these groups, so
|
46
|
-
I created a method groups_of which will split any integer into
|
47
|
-
groups of a certain size. It returns a hash with the power of ten
|
48
|
-
as the key and the multiplier as the value. E.g:
|
49
|
-
|
50
|
-
> 31245.groups_of(3)
|
51
|
-
#=>
|
52
|
-
{0=>245,3=>31} #i.e. 31 thousands, and 245 ones
|
53
|
-
|
54
|
-
> 245.group_of(2)
|
55
|
-
#=>
|
56
|
-
{0=>45,2=>2} #i.e. 2 hundreds, and 45 ones
|
57
|
-
|
58
|
-
I also created a method group_words takes a block and a size parameter
|
59
|
-
This method which could be used by different languages.
|
60
|
-
(In Japanese numbers are grouped in groups of 4, so it makes sense to try and
|
61
|
-
separate the language related stuff from the number grouping related stuff)
|
62
|
-
|
63
|
-
Example of usage:
|
64
|
-
245.group_words(2,"English") do |power, name, digits|
|
65
|
-
puts "#{digits}*10^#{power} #{digits} #{name}s"
|
66
|
-
end
|
67
|
-
|
68
|
-
2*10^2= 2 hundreds
|
69
|
-
45*10^0 = 45 ones
|
70
|
-
|