numbers_in_words 0.0.6 → 0.0.7
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/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
|
-
|