ziffern 1.1.4 → 1.1.5

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