ziffern 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ziffern.rb +91 -38
  3. data/ziffern_spec.rb +18 -18
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18a6b3bbaa49bf77b2a43b7f599ee2ace027220c
4
- data.tar.gz: addfb473e2871b9220f88674d4287fd34faf8a43
3
+ metadata.gz: 5cadc04633b8f106d4c01957413527dd59f4831e
4
+ data.tar.gz: 5b0021a6b2eb4dd8aabe0d64f55d103e4a2458e4
5
5
  SHA512:
6
- metadata.gz: 841f50fce4240e1ad1d100434769051a1d43e9510953d83f6f74cb27cf486b76c747fdf96ad38015fd3409b90f1880cc5e66ebd3723d05901f8fb78290850d4c
7
- data.tar.gz: cf31aabdeb1891b87c63871cbeb5fb536692e8861c67539f36e6a61e5fe8078ba28831703051c930547770e9cb07b79bcaf08c97e021b567a8250272d5969436
6
+ metadata.gz: 885b3ef08c8bffc4a6d5222dcde118cc22c224ad14d2c4dd1f5786aa37f3e27829213b739c804e4cc101695950437fa18b31d395f319527d622f63f11edca393
7
+ data.tar.gz: 60b9d746600c8637a71e2dd7481d05a214089d71e122d006ccb7145395ceda0c1e89bad3298081a28bc66b53a5a4c06eaa1325882838bd6af050db09bfdcd2a2
data/ziffern.rb CHANGED
@@ -2,14 +2,61 @@ class Ziffern
2
2
 
3
3
  # http://de.wikipedia.org/wiki/Zahlennamen
4
4
 
5
- NINETEEN = %w[ null eins zwei drei vier fünf sechs sieben acht neun zehn elf zwölf
6
- dreizehn vierzehn fünfzehn sechzehn siebzehn achtzehn neunzehn ]
7
-
8
- TENS = [nil, nil] + %w[ zwanzig dreißig vierzig fünfzig sechzig siebzig achtzig neunzig ]
9
-
10
- BIG = %w[
11
- M B Tr Quadr Quint Sext Sept Okt Non Dez Undez Dodez Tredez
12
- Quattuordez Quindez Sedez Septendez Dodevigint Undevigint Vigint
5
+ FIRST_TWENTY = %w[
6
+ null
7
+ eins
8
+ zwei
9
+ drei
10
+ vier
11
+ fünf
12
+ sechs
13
+ sieben
14
+ acht
15
+ neun
16
+ zehn
17
+ elf
18
+ zwölf
19
+ dreizehn
20
+ vierzehn
21
+ fünfzehn
22
+ sechzehn
23
+ siebzehn
24
+ achtzehn
25
+ neunzehn
26
+ ]
27
+
28
+ TENS = [nil, nil] + %w[
29
+ zwanzig
30
+ dreißig
31
+ vierzig
32
+ fünfzig
33
+ sechzig
34
+ siebzig
35
+ achtzig
36
+ neunzig
37
+ ]
38
+
39
+ LARGE_NUMBERS = %w[
40
+ M
41
+ B
42
+ Tr
43
+ Quadr
44
+ Quint
45
+ Sext
46
+ Sept
47
+ Okt
48
+ Non
49
+ Dez
50
+ Undez
51
+ Dodez
52
+ Tredez
53
+ Quattuordez
54
+ Quindez
55
+ Sedez
56
+ Septendez
57
+ Dodevigint
58
+ Undevigint
59
+ Vigint
13
60
  ].flat_map { |prefix|
14
61
  %W[ #{prefix}illion #{prefix}illiarde ]
15
62
  }
@@ -31,25 +78,21 @@ class Ziffern
31
78
  end
32
79
 
33
80
  def convert_sign(number)
34
- if number.to_f < 0
35
- "minus "
36
- else
37
- ""
38
- end
81
+ number.to_f < 0 ? "minus " : ""
39
82
  end
40
83
 
41
84
  def convert_integer(number)
42
- convert(number.to_i.abs, 'eins')
85
+ convert(number.to_i.abs, "eins")
43
86
  end
44
87
 
45
- def convert(number, one='ein')
88
+ def convert(number, one = "ein")
46
89
  case number
47
90
  when 1 then one
48
- when 0..19 then NINETEEN[number]
91
+ when 0..19 then FIRST_TWENTY[number]
49
92
  when 20..99 then twenty_to_99(number)
50
- when 100..999 then quantify_by_factor(100, 'hundert', number)
51
- when 1000..999_999 then quantify_by_factor(1000, 'tausend', number)
52
- else bignums(number)
93
+ when 100..999 then quantify_by_factor(100, "hundert", number)
94
+ when 1000..999_999 then quantify_by_factor(1000, "tausend", number)
95
+ else convert_large_number(number)
53
96
  end
54
97
  end
55
98
 
@@ -72,7 +115,7 @@ class Ziffern
72
115
  text
73
116
  end
74
117
 
75
- def bignums(number)
118
+ def convert_large_number(number)
76
119
  number_of_millions, remainder = number.divmod(1000_000)
77
120
 
78
121
  text = convert_millions(number_of_millions)
@@ -82,39 +125,49 @@ class Ziffern
82
125
  end
83
126
 
84
127
  def convert_millions(number_of_millions)
85
- pairs = pair_with_big_names(number_of_millions)
86
- fail TooLargeNumberError if pairs.size > BIG.size
128
+ named_number_groups = slice_by_factor(number_of_millions, 1000)
129
+ large_number_names = large_number_names(named_number_groups.count)
87
130
 
88
- pairs
89
- .reject { |amount,| amount.zero? }
131
+ fail TooLargeNumberError if named_number_groups.size > LARGE_NUMBERS.size
132
+
133
+ named_number_groups
134
+ .zip(large_number_names)
135
+ .reject { |amount, _| amount.zero? }
90
136
  .map { |amount, name| quantify_big_name(amount, name) }
91
- .join(' ')
137
+ .join(" ")
92
138
  end
93
139
 
94
140
  def quantify_big_name(amount, big_name)
95
- quantity = convert(amount, 'eine')
96
- big_name = big_name.sub(/(e?)$/, 'en') unless amount == 1
141
+ [convert(amount, "eine"), pluralize_big_name(amount, big_name)].join(" ")
142
+ end
97
143
 
98
- "#{quantity} #{big_name}"
144
+ def pluralize_big_name(amount, big_name)
145
+ amount == 1 ? big_name : big_name.sub(/(e?)$/, "en")
99
146
  end
100
147
 
101
- # 12345678 => [[12, "Billion"], [345, "Milliarde"], [678, "Million"]]
102
- def pair_with_big_names(number_of_millions)
103
- number_groups = []
148
+ # slice_by_factor(12345678, 1000) => [12, 345, 678]
149
+ def slice_by_factor(number, factor)
150
+ result = []
151
+ remainder = number
104
152
 
105
- until number_of_millions.zero?
106
- number_of_millions, last_3 = number_of_millions.divmod(1000)
107
- number_groups << last_3
153
+ until remainder.zero?
154
+ remainder, slice = remainder.divmod(1000)
155
+ result << slice
108
156
  end
109
157
 
110
- number_groups.zip(BIG).reverse
158
+ result.reverse
159
+ end
160
+
161
+ # large_number_names(3) => ["Billion", "Milliarde", "Million"]
162
+ def large_number_names(count)
163
+ LARGE_NUMBERS.take(count).reverse
111
164
  end
112
165
 
113
166
  def convert_decimals(number)
114
167
  decimals = get_decimals_as_string(number)
115
- return '' if decimals.empty?
168
+ return "" if decimals.empty?
116
169
 
117
- ' Komma ' + convert_digits(decimals)
170
+ " Komma " + convert_digits(decimals)
118
171
  end
119
172
 
120
173
  def get_decimals_as_string(number)
@@ -122,6 +175,6 @@ class Ziffern
122
175
  end
123
176
 
124
177
  def convert_digits(number)
125
- number.to_s.chars.map { |digit| convert_integer(digit) }.join(' ')
178
+ number.to_s.chars.map { |digit| convert_integer(digit) }.join(" ")
126
179
  end
127
180
  end
data/ziffern_spec.rb CHANGED
@@ -4,8 +4,8 @@ describe Ziffern do
4
4
 
5
5
  subject { Ziffern.new }
6
6
 
7
- def self.test_german_numbers(hash)
8
- hash.each do |integer, german|
7
+ def self.test_german_numbers(tests)
8
+ tests.each do |integer, german|
9
9
  instance_eval do
10
10
  it "converts #{integer} to #{german}" do
11
11
  expect(subject.to_german(integer)).to eq german
@@ -15,34 +15,34 @@ describe Ziffern do
15
15
  end
16
16
 
17
17
  context 'numbers up to 20' do
18
- test_german_numbers({
18
+ test_german_numbers(
19
19
  0 => "null",
20
20
  1 => "eins",
21
21
  13 => "dreizehn",
22
22
  19 => "neunzehn",
23
- })
23
+ )
24
24
  end
25
25
 
26
26
  context 'numbers up to 100' do
27
- test_german_numbers({
27
+ test_german_numbers(
28
28
  20 => "zwanzig",
29
29
  21 => "einundzwanzig",
30
30
  63 => "dreiundsechzig",
31
31
  99 => "neunundneunzig",
32
- })
32
+ )
33
33
  end
34
34
 
35
35
  context 'numbers up to 1000' do
36
- test_german_numbers({
36
+ test_german_numbers(
37
37
  100 => "einhundert",
38
38
  101 => "einhunderteins",
39
39
  234 => "zweihundertvierunddreißig",
40
40
  999 => "neunhundertneunundneunzig",
41
- })
41
+ )
42
42
  end
43
43
 
44
44
  context 'numbers up to one million' do
45
- test_german_numbers({
45
+ test_german_numbers(
46
46
  1000 => "eintausend",
47
47
  1001 => "eintausendeins",
48
48
  101000 => "einhunderteintausend",
@@ -50,48 +50,48 @@ describe Ziffern do
50
50
  1234 => "eintausendzweihundertvierunddreißig",
51
51
  10_000 => "zehntausend",
52
52
  999_999 => "neunhundertneunundneunzigtausendneunhundertneunundneunzig",
53
- })
53
+ )
54
54
  end
55
55
 
56
56
  context 'really big numbers' do
57
- test_german_numbers({
57
+ test_german_numbers(
58
58
  1_000_000 => "eine Million",
59
59
  1_000_001 => "eine Million eins",
60
60
  2_204_510 => "zwei Millionen zweihundertviertausendfünfhundertzehn",
61
61
  1_203_400_021 => "eine Milliarde zweihundertdrei Millionen vierhunderttausendeinundzwanzig",
62
62
  3_000_000_000_000_099 => "drei Billiarden neunundneunzig",
63
63
  10 ** 123 => "eine Vigintilliarde"
64
- })
64
+ )
65
65
  end
66
66
 
67
67
  context 'negative numbers' do
68
- test_german_numbers({
68
+ test_german_numbers(
69
69
  -1 => "minus eins",
70
70
  -20 => "minus zwanzig",
71
71
  -21 => "minus einundzwanzig",
72
72
  -63 => "minus dreiundsechzig",
73
73
  -99 => "minus neunundneunzig",
74
- })
74
+ )
75
75
  end
76
76
 
77
77
  context 'decimals' do
78
- test_german_numbers({
78
+ test_german_numbers(
79
79
  0.1234 => "null Komma eins zwei drei vier",
80
80
  5.6789 => "fünf Komma sechs sieben acht neun",
81
81
  5.0 => "fünf Komma null",
82
82
  -5.6 => "minus fünf Komma sechs",
83
83
  -567.89 => "minus fünfhundertsiebenundsechzig Komma acht neun",
84
84
  -0.001 => "minus null Komma null null eins"
85
- })
85
+ )
86
86
  end
87
87
 
88
88
  context 'strings' do
89
- test_german_numbers({
89
+ test_german_numbers(
90
90
  '-0' => "null",
91
91
  '-123' => "minus einhundertdreiundzwanzig",
92
92
  '-123.1' => "minus einhundertdreiundzwanzig Komma eins",
93
93
  '5.00' => "fünf Komma null null",
94
- })
94
+ )
95
95
  end
96
96
 
97
97
  context 'errors' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ziffern
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jimmy Börjesson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
55
  description:
56
- email: lagginglion@gmail.com
56
+ email: alcesleo@gmail.com
57
57
  executables: []
58
58
  extensions: []
59
59
  extra_rdoc_files: []
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  version: '0'
82
82
  requirements: []
83
83
  rubyforge_project:
84
- rubygems_version: 2.4.5
84
+ rubygems_version: 2.5.1
85
85
  signing_key:
86
86
  specification_version: 4
87
87
  summary: Converts numbers to text, in German.