kabal 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kabal/config.rb +1 -1
- data/lib/kabal/languages/english.rb +6 -7
- data/lib/kabal/languages/language.rb +42 -9
- data/lib/kabal/languages/russian.rb +1 -3
- data/lib/kabal/languages/russian/fractional_numbers.rb +12 -3
- data/lib/kabal/languages/russian/natural_numbers.rb +7 -14
- data/lib/kabal/supported_languages.rb +0 -1
- data/lib/kabal/version.rb +1 -1
- data/test/lib/kabal/languages/english_test.rb +7 -0
- data/yaml/support.yml +4 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 161b4c5b4dffadd7c6f4b1646bad9f812ffbbd75
|
4
|
+
data.tar.gz: 827cf85130f5c2e630feaa72b2fa38d0761b0ea6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77e8aacada18961448705cec34164e4d7dc705330349dc21f8e7f5ffaa00d6e0619eaffa0efd8aa284aac2b39e9bad19c0450f955e91ce158fa1b6cb5274228a
|
7
|
+
data.tar.gz: fd265f580a42da518ea712130cd7bd61bad020b193a9bc361f42740b894d4de6bfb6627cf684072efeb4b9e5522f555257729c4fe3e8a7427adfd9ece09ea5cf
|
data/lib/kabal/config.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'kabal/languages/language'
|
2
2
|
|
3
3
|
class Kabal::English < Kabal::Language
|
4
|
-
def
|
5
|
-
raise NumberOutRangeError.message if number < 0 or number >= 10 ** 12 or number % 1 != 0
|
4
|
+
def convert_number(number)
|
6
5
|
return single number if number >= 0 and number <= 19
|
7
6
|
return two_words number if number >= 0 and number <= 99
|
8
7
|
return three_words number if number >= 100 and number <= 999
|
@@ -10,19 +9,19 @@ class Kabal::English < Kabal::Language
|
|
10
9
|
end
|
11
10
|
|
12
11
|
def single(number)
|
13
|
-
names[
|
12
|
+
names["single"][number]
|
14
13
|
end
|
15
14
|
|
16
15
|
def two_words(number)
|
17
16
|
return single number if number <= 19
|
18
|
-
number_name = names[
|
17
|
+
number_name = names["two_words"][number / 10]
|
19
18
|
number_name += " " + single(number % 10) if (number % 10 != 0)
|
20
19
|
number_name
|
21
20
|
end
|
22
21
|
|
23
22
|
def three_words(number)
|
24
23
|
return two_words number if number <= 99
|
25
|
-
number_name = single(number / 100) + " " + names[
|
24
|
+
number_name = single(number / 100) + " " + names["ten_powers"][2]
|
26
25
|
number_name += " " + two_words(number % 100) if (number % 100 >= 10)
|
27
26
|
number_name += " and " + single(number % 100) if (number % 100 < 10)
|
28
27
|
number_name
|
@@ -45,9 +44,9 @@ class Kabal::English < Kabal::Language
|
|
45
44
|
|
46
45
|
def create_number_name(number)
|
47
46
|
if @number_name.nil?
|
48
|
-
@number_name = count_name(number) + " " + names[
|
47
|
+
@number_name = count_name(number) + " " + names["ten_powers"][number_order(number)]
|
49
48
|
elsif count(number) != 0
|
50
|
-
@number_name += " " + count_name(number) + " " + names[
|
49
|
+
@number_name += " " + count_name(number) + " " + names["ten_powers"][number_order(number)]
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
@@ -1,40 +1,73 @@
|
|
1
1
|
module Kabal
|
2
2
|
class Language
|
3
|
+
def initialize
|
4
|
+
@names = YamlLoader.yaml_object "languages/#{lang}"
|
5
|
+
@supports = YamlLoader.yaml_object("support")["support"][lang]
|
6
|
+
end
|
7
|
+
|
8
|
+
def convert(number)
|
9
|
+
check_supports_for number
|
10
|
+
convert_number number
|
11
|
+
end
|
12
|
+
|
3
13
|
def lang
|
4
14
|
languages = YamlLoader.yaml_object "languages"
|
5
15
|
@lang = languages[self.to_s.split(":")[-2]]
|
6
16
|
end
|
7
17
|
|
8
18
|
def supports_natural?
|
9
|
-
supports
|
10
|
-
supports["support"][lang]["natural"]
|
19
|
+
@supports["natural"]
|
11
20
|
end
|
12
21
|
|
13
22
|
#TODO реализовать метод supports_negative?
|
14
23
|
|
24
|
+
def min_value
|
25
|
+
eval @supports["natural"]["min"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def max_value
|
29
|
+
eval @supports["natural"]["max"]
|
30
|
+
end
|
31
|
+
|
15
32
|
def supports_fractional?
|
16
|
-
supports
|
17
|
-
supports["support"][lang]["fractional"]
|
33
|
+
@supports["fractional"]
|
18
34
|
end
|
19
35
|
|
20
36
|
def names
|
21
|
-
|
37
|
+
@names[lang]
|
22
38
|
end
|
23
39
|
|
24
40
|
def minus
|
25
|
-
|
41
|
+
names["minus"]
|
26
42
|
end
|
27
43
|
|
28
44
|
def whole
|
29
|
-
|
45
|
+
names["whole"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def fractional?(number)
|
49
|
+
number % 1 != 0
|
50
|
+
end
|
51
|
+
|
52
|
+
def natural_number_name(number)
|
53
|
+
#FIXME switch case next lines
|
54
|
+
return single(number) if number >= 0 and number <= 19
|
55
|
+
return two_words(number) if number >= 20 and number <= 99
|
56
|
+
return three_words(number) if number >= 100 and number <= 999
|
57
|
+
ten_powers(number) if number >= 1000
|
30
58
|
end
|
31
59
|
|
32
60
|
def natural?(number)
|
33
61
|
number % 1 == 0
|
34
62
|
end
|
35
63
|
|
36
|
-
def
|
37
|
-
number % 1 != 0
|
64
|
+
def check_supports_for(number)
|
65
|
+
if number % 1 != 0 and not supports_fractional?
|
66
|
+
raise NoSupportForFractionalNumberOnCurrentLanguages.message
|
67
|
+
end
|
68
|
+
if number >= max_value or number <= min_value
|
69
|
+
raise NumberOutRangeError.message
|
70
|
+
end
|
38
71
|
end
|
39
72
|
end
|
40
73
|
end
|
@@ -7,9 +7,7 @@ class Kabal::Russian < Kabal::Language
|
|
7
7
|
include Kabal::RussianRules::NaturalNumbers
|
8
8
|
include Kabal::RussianRules::FractionalNumbers
|
9
9
|
|
10
|
-
def
|
11
|
-
#FIXME find way to get min and max from yml file
|
12
|
-
raise NumberOutRangeError.message if number <= -(10 ** 102) or number >= 10 ** 102
|
10
|
+
def convert_number(number)
|
13
11
|
#FIXME find better way
|
14
12
|
@number_name = nil
|
15
13
|
need_minus?(number) ? (minus + " " + number_words(-number)) : number_words(number)
|
@@ -8,12 +8,20 @@ module Kabal
|
|
8
8
|
def fractional_ten_powers_name(number)
|
9
9
|
ten_powers_name = ""
|
10
10
|
if need_pre_word? number
|
11
|
-
|
11
|
+
ten_powers_name = fractional_pre_word(number) + fractional_order_word(number)
|
12
12
|
else
|
13
|
-
ten_powers_name = names[
|
13
|
+
ten_powers_name = names["fractional_ten_powers"][fractional_number_order(number)]
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
def fractional_order_word(number)
|
18
|
+
names["fractional_ten_powers"][fractional_number_order(number) - (fractional_number_order(number) % 3)]
|
19
|
+
end
|
20
|
+
|
21
|
+
def fractional_pre_word(number)
|
22
|
+
names["fractional_pre_words"][fractional_number_order(number) % 3]
|
23
|
+
end
|
24
|
+
|
17
25
|
def need_pre_word?(number)
|
18
26
|
fractional_number_order(number) > 3 and fractional_number_order(number) % 3 != 0
|
19
27
|
end
|
@@ -24,7 +32,8 @@ module Kabal
|
|
24
32
|
|
25
33
|
def fractional_part_name(number)
|
26
34
|
fractional_part = (number % 1).round(fractional_number_order(number))
|
27
|
-
|
35
|
+
fractional_order = ((fractional_part) * (10 ** fractional_number_order(number))).to_s.split('.')[0].to_i
|
36
|
+
feminine_natural_number_name(fractional_order) + " " + Declinations.name_with_declination(fractional_ten_powers_name(number), fractional_part)
|
28
37
|
end
|
29
38
|
|
30
39
|
def whole_part_name(number)
|
@@ -1,13 +1,6 @@
|
|
1
1
|
module Kabal
|
2
2
|
module RussianRules
|
3
3
|
module NaturalNumbers
|
4
|
-
def natural_number_name(number)
|
5
|
-
#FIXME switch case next lines
|
6
|
-
return single(number) if number >= 0 and number <= 19
|
7
|
-
return two_words(number) if number >= 20 and number <= 99
|
8
|
-
return three_words(number) if number >= 100 and number <= 999
|
9
|
-
ten_powers(number) if number >= 1000
|
10
|
-
end
|
11
4
|
|
12
5
|
def feminine_natural_number_name(number)
|
13
6
|
@feminine_name = true
|
@@ -17,28 +10,28 @@ module Kabal
|
|
17
10
|
def single(number)
|
18
11
|
if @feminine_name
|
19
12
|
@feminine_name = false
|
20
|
-
return names[
|
13
|
+
return names["single_feminine"][count(number) % 10] if count(number) % 10 == 1 or count(number) % 10 == 2
|
21
14
|
end
|
22
|
-
names[
|
15
|
+
names["single"][number]
|
23
16
|
end
|
24
17
|
|
25
18
|
def two_words(number)
|
26
19
|
return single number if number <= 19
|
27
|
-
number_name = names[
|
20
|
+
number_name = names["two_words"][number / 10]
|
28
21
|
number_name += " " + single(number % 10) if (number % 10 != 0)
|
29
22
|
number_name
|
30
23
|
end
|
31
24
|
|
32
25
|
def three_words(number)
|
33
26
|
return two_words number if number / 100 == 0
|
34
|
-
number_name = names[
|
27
|
+
number_name = names["three_words"][number / 100]
|
35
28
|
return number_name += " " + two_words(number % 100) if (number % 100 >= 20)
|
36
29
|
return number_name += " " + single(number % 100) if (number % 100 != 0)
|
37
30
|
number_name
|
38
31
|
end
|
39
32
|
def ten_powers(number)
|
40
33
|
#FIXME find better way
|
41
|
-
return names[
|
34
|
+
return names["ten_powers"][100] if number_is_google? number
|
42
35
|
less_thousands number if number_is_thousands? number
|
43
36
|
return @number_name if number_is_thousands? number
|
44
37
|
create_number_name number
|
@@ -55,9 +48,9 @@ module Kabal
|
|
55
48
|
|
56
49
|
def create_number_name(number)
|
57
50
|
if @number_name.nil?
|
58
|
-
@number_name = count_name(number) + " " + Declinations.name_with_declination(names[
|
51
|
+
@number_name = count_name(number) + " " + Declinations.name_with_declination(names["ten_powers"][number_order(number)], count(number))
|
59
52
|
elsif count(number) != 0
|
60
|
-
@number_name += " " + count_name(number) + " " + Declinations.name_with_declination(names[
|
53
|
+
@number_name += " " + count_name(number) + " " + Declinations.name_with_declination(names["ten_powers"][number_order(number)], count(number))
|
61
54
|
end
|
62
55
|
end
|
63
56
|
|
data/lib/kabal/version.rb
CHANGED
@@ -36,4 +36,11 @@ class EnglishTest < TestCase
|
|
36
36
|
def test_hundred_millions_with_and
|
37
37
|
assert_equal @eng.convert(111150021), "one hundred eleven million one hundred fifty thousand and twenty one"
|
38
38
|
end
|
39
|
+
|
40
|
+
def test_fractional_number
|
41
|
+
exception = assert_raises RuntimeError do
|
42
|
+
@eng.convert 0.1
|
43
|
+
end
|
44
|
+
assert_equal NoSupportForFractionalNumberOnCurrentLanguages.message, exception.message
|
45
|
+
end
|
39
46
|
end
|
data/yaml/support.yml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kabal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Kalashnikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|