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.
- checksums.yaml +4 -4
- data/ziffern.rb +91 -38
- data/ziffern_spec.rb +18 -18
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cadc04633b8f106d4c01957413527dd59f4831e
|
4
|
+
data.tar.gz: 5b0021a6b2eb4dd8aabe0d64f55d103e4a2458e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
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,
|
85
|
+
convert(number.to_i.abs, "eins")
|
43
86
|
end
|
44
87
|
|
45
|
-
def convert(number, one=
|
88
|
+
def convert(number, one = "ein")
|
46
89
|
case number
|
47
90
|
when 1 then one
|
48
|
-
when 0..19 then
|
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,
|
51
|
-
when 1000..999_999 then quantify_by_factor(1000,
|
52
|
-
else
|
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
|
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
|
-
|
86
|
-
|
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
|
-
|
89
|
-
|
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
|
-
|
96
|
-
|
141
|
+
[convert(amount, "eine"), pluralize_big_name(amount, big_name)].join(" ")
|
142
|
+
end
|
97
143
|
|
98
|
-
|
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 => [
|
102
|
-
def
|
103
|
-
|
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
|
106
|
-
|
107
|
-
|
153
|
+
until remainder.zero?
|
154
|
+
remainder, slice = remainder.divmod(1000)
|
155
|
+
result << slice
|
108
156
|
end
|
109
157
|
|
110
|
-
|
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
|
168
|
+
return "" if decimals.empty?
|
116
169
|
|
117
|
-
|
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(
|
8
|
-
|
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
|
+
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:
|
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:
|
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.
|
84
|
+
rubygems_version: 2.5.1
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Converts numbers to text, in German.
|