ada_numbers 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,151 @@
1
+ require_relative '../../utilities/integer_extensions'
2
+ require_relative '../../utilities/hash_extensions'
3
+ require_relative '../../utilities/string_extensions'
4
+ require_relative '../../utilities/settings'
5
+ require_relative '../../utilities/number_category'
6
+
7
+ require_relative '../../constants/en/written_numbers'
8
+ require_relative '../../constants/en/separators'
9
+ require_relative '../../constants/message'
10
+
11
+ module AdaNumbers
12
+ module WordsToNumberConverter
13
+ class En
14
+ @@use_short_scale = false
15
+
16
+ def self.convert(word)
17
+ select_scale
18
+
19
+ word = word.gsub(/\s+/, ' ').strip.
20
+ gsub(Separator::En::DASH, " #{Separator::En::NUMBERS_SEPARATOR} ").
21
+ gsub(Separator::En::COMMA, '').
22
+ title_case
23
+
24
+ words_to_convert = word.split " #{Separator::En::DECIMAL_SEPARATOR} "
25
+ words_to_convert = word.split " #{Separator::En::DECIMAL_SEPARATOR_ALTERNATIVE} " if words_to_convert.size == 1
26
+
27
+ case words_to_convert.size
28
+ when 1
29
+ return resolve_word word, @@use_short_scale
30
+ when 2
31
+ count_zeros = words_to_convert.last.split(' ').select { |w| w == WrittenNumber::En::ZERO }.size
32
+
33
+ whole_part = resolve_word words_to_convert.first, @@use_short_scale
34
+ decimal_part = resolve_word words_to_convert.last.gsub(WrittenNumber::En::ZERO, ""), @@use_short_scale
35
+
36
+ return Message::INVALID_NUMBER if whole_part == Message::INVALID_NUMBER || decimal_part == Message::INVALID_NUMBER
37
+
38
+ decimal_part = "#{'0' * count_zeros}#{decimal_part}" if count_zeros > 0
39
+ number = "#{whole_part}.#{decimal_part}"
40
+
41
+ return number.to_f
42
+ end
43
+
44
+ return Message::INVALID_NUMBER
45
+ end
46
+
47
+ private
48
+
49
+ def self.resolve_word(word, use_short_scale = false)
50
+ word = word.gsub /\s+/, ' '
51
+
52
+ # Try to get a direct match from the map
53
+ number = map_number_according_to_scale word, use_short_scale
54
+ return number unless number.nil?
55
+
56
+ # It was not found a direct match, so, let's find that bastard
57
+ string_tokens = word.split ' '
58
+ numeric_tokens = []
59
+
60
+ # The algorithm consists on iterating every token so that to find its direct match
61
+ # in the map and then stack it up. If the next number to be stacked requires a multiplier,
62
+ # we find it and stack it up after popping the later numbers. When all the matches are found
63
+ # The number is their sum
64
+ (0...string_tokens.size).each do |cursor|
65
+ token = string_tokens[cursor]
66
+
67
+ case token
68
+ when token == Separator::En::NUMBERS_SEPARATOR && (cursor == 0 || cursor == string_tokens.size - 1),
69
+ token == Separator::En::NUMBERS_SEPARATOR && WrittenNumber::En.numbers_that_ignore_separator.include?(string_tokens[cursor + 1]),
70
+ token == Separator::En::NUMBERS_SEPARATOR && cursor > 0 && string_tokens[cursor - 1] == Separator::En::NUMBERS_SEPARATOR
71
+ return Message::INVALID_NUMBER
72
+ when Separator::En::NUMBERS_SEPARATOR
73
+ next
74
+ end
75
+
76
+ number_has_incorrect_or_no_separator =
77
+ # cursor is valid for evaluation
78
+ cursor > 0 && (cursor + 1 < string_tokens.size - 1) &&
79
+ # number is not part of number that ignore separator nor its next neighbour
80
+ !WrittenNumber::En.numbers_that_ignore_separator.include?(token) &&
81
+ !WrittenNumber::En.numbers_that_ignore_separator.include?(string_tokens[cursor + 1]) &&
82
+ !WrittenNumber::En.unities_that_combine_with_separator.include?(token) &&
83
+ string_tokens[cursor - 1] != Separator::En::NUMBERS_SEPARATOR
84
+
85
+ number_is_in_incorrect_short_scale_format = use_short_scale && cursor > 0 &&
86
+ cursor < string_tokens.size - 1 && token == WrittenNumber::En::THOUSAND &&
87
+ WrittenNumber::En.not_to_combine_with_thousand.include?(string_tokens[cursor + 1])
88
+
89
+ return Message::INVALID_NUMBER if number_has_incorrect_or_no_separator || number_is_in_incorrect_short_scale_format
90
+
91
+ number = map_number_according_to_scale token, use_short_scale
92
+ return Message::INVALID_NUMBER if number.nil?
93
+
94
+ if compute_multiplier? token, numeric_tokens.size
95
+ multiplier, numeric_tokens = find_multiplier numeric_tokens
96
+ number *= multiplier
97
+ end
98
+
99
+ numeric_tokens.push number
100
+ end
101
+
102
+ numeric_tokens.sum
103
+ end
104
+
105
+ def self.map_number_according_to_scale(word, use_short_scale)
106
+ mapped_number = WrittenNumber::En.words_to_number_map.resolve(word)
107
+
108
+ number = if use_short_scale
109
+ mapped_number.nil? ? WrittenNumber::En.words_to_number_map_short_scale.resolve(word) : mapped_number
110
+ else
111
+ mapped_number.nil? ? WrittenNumber::En.words_to_number_map_long_scale.resolve(word) : mapped_number
112
+ end
113
+
114
+ number
115
+ end
116
+
117
+ def self.select_scale
118
+ @@use_short_scale = Settings.scale == Settings::Parameters::SCALES[:short]
119
+ end
120
+
121
+ def self.compute_multiplier?(token, number_of_numeric_tokes)
122
+ (token == WrittenNumber::En::HUNDRED ||
123
+ token == WrittenNumber::En::THOUSAND ||
124
+ token == WrittenNumber::En::MILLION ||
125
+ token == WrittenNumber::En::BILLION ||
126
+ token == WrittenNumber::En::TRILLION) &&
127
+ number_of_numeric_tokes != 0
128
+ end
129
+
130
+ def self.find_multiplier(numeric_tokens)
131
+ multiplier = numeric_tokens.pop
132
+
133
+ while numeric_tokens.size != 0
134
+ maybe_number = numeric_tokens.pop
135
+ break if maybe_number.nil?
136
+
137
+ number = maybe_number.to_i
138
+
139
+ if number.category > NumberCategory::HUNDRED
140
+ numeric_tokens.push(number)
141
+ break
142
+ end
143
+
144
+ multiplier += number
145
+ end
146
+
147
+ return multiplier, numeric_tokens
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,32 @@
1
+ require_relative './pt/number_to_words_converter'
2
+ require_relative './en/number_to_words_converter'
3
+
4
+ class Float
5
+ def to_words
6
+ case AdaNumbers::Settings.language
7
+ when AdaNumbers::Settings::Parameters::LANGUAGES[:en]
8
+ AdaNumbers::NumberToWordsConverter::En.convert self
9
+ else
10
+ AdaNumbers::NumberToWordsConverter::Pt.convert self
11
+ end
12
+ end
13
+
14
+ def to_w
15
+ to_words
16
+ end
17
+ end
18
+
19
+ class Integer
20
+ def to_words
21
+ case AdaNumbers::Settings.language
22
+ when AdaNumbers::Settings::Parameters::LANGUAGES[:en]
23
+ AdaNumbers::NumberToWordsConverter::En.convert self
24
+ else
25
+ AdaNumbers::NumberToWordsConverter::Pt.convert self
26
+ end
27
+ end
28
+
29
+ def to_w
30
+ to_words
31
+ end
32
+ end
@@ -0,0 +1,179 @@
1
+ require_relative '../../utilities/integer_extensions'
2
+ require_relative '../../utilities/hash_extensions'
3
+ require_relative '../../utilities/settings'
4
+ require_relative '../../utilities/number_category'
5
+
6
+ require_relative '../../constants/pt/written_numbers'
7
+ require_relative '../../constants/pt/separators'
8
+ require_relative '../../constants/message'
9
+
10
+ module AdaNumbers
11
+ module NumberToWordsConverter
12
+ class Pt
13
+ @@use_short_scale = false
14
+ @@number_tokens = []
15
+
16
+ def self.convert(number)
17
+ return convert_integer(number) if number.class == Integer
18
+ return convert_float(number)
19
+ end
20
+
21
+ private
22
+ def self.convert_integer(number)
23
+ return Message::UNSUPPORTED if number.number_of_digits > Settings::Parameters::DIGITS_LIMIT
24
+
25
+ select_scale
26
+ @@number_tokens.clear
27
+ return resolve_number number
28
+ end
29
+
30
+ def self.convert_float(number)
31
+ select_scale
32
+
33
+ str_number = number.to_s.split '.'
34
+
35
+ str_integer_part = str_number.first
36
+ str_decimal_part = str_number.size == 1? "0" : str_number.last
37
+
38
+ return Message::UNSUPPORTED if str_integer_part.size > Settings::Parameters::DIGITS_LIMIT || str_decimal_part.size > Settings::Parameters::DIGITS_LIMIT
39
+
40
+ whole_part = str_integer_part.to_i
41
+ decimal_part = str_decimal_part.to_i
42
+
43
+ @@number_tokens.clear
44
+ result = resolve_number whole_part
45
+
46
+ return result if decimal_part == 0
47
+
48
+ result += " #{Separator::Pt::DECIMAL_SEPARATOR.downcase} "
49
+ # just aggregating the zeros
50
+ result += str_decimal_part.split('').
51
+ take_while { |c| c == "0"}.
52
+ collect { |c| WrittenNumber::Pt::ZERO}.
53
+ join ' '
54
+
55
+ @@number_tokens.clear
56
+ result += result[-1] == ' '? resolve_number(decimal_part) :
57
+ " #{resolve_number(decimal_part)}"
58
+
59
+ return result
60
+ end
61
+
62
+ def self.select_scale
63
+ @@use_short_scale = Settings.scale == Settings::Parameters::SCALES[:short]
64
+ end
65
+
66
+ def self.resolve_number(number, flag = false)
67
+ result = ''
68
+ number_category = number.category
69
+
70
+ case number_category
71
+ when NumberCategory::UNITY
72
+ result = unities number
73
+ when NumberCategory::TEN
74
+ result = tens number
75
+ when NumberCategory::HUNDRED
76
+ result = hundreds number, flag
77
+ when NumberCategory::THOUSAND
78
+ result = thousands number
79
+ when NumberCategory::MILLION
80
+ result = millions number
81
+ when NumberCategory::THOUSAND_MILLIONS
82
+ result = thousand_millions number
83
+ when NumberCategory::BILLION
84
+ result = billions number
85
+ end
86
+
87
+ if result.empty?
88
+ str_number = number.to_s
89
+ bridge = number.bridge
90
+
91
+ flag_first_digits = (number_category == NumberCategory::HUNDRED ? number != 100 : false)
92
+
93
+ first_digits = (str_number[0...bridge] + '0'*number_category).to_i
94
+ other_digits = (str_number[bridge..-1]).to_i
95
+
96
+ flag_other_digits = other_digits != 100
97
+
98
+ resolve_number first_digits, flag_first_digits
99
+ resolve_number other_digits, flag_other_digits
100
+ else
101
+ @@number_tokens << result
102
+ end
103
+
104
+ add_separators_to_number @@number_tokens
105
+ end
106
+
107
+ def self.add_separators_to_number(number_tokens)
108
+ result = number_tokens.first
109
+
110
+ (1...number_tokens.size).each do |cursor|
111
+ current_token = number_tokens[cursor]
112
+
113
+ if WrittenNumber::Pt.numbers_that_ignore_separator.include? current_token
114
+ result += " #{current_token}"
115
+ else
116
+ result += " #{Separator::Pt::NUMBERS_SEPARATOR.downcase} #{current_token}"
117
+ end
118
+ end
119
+
120
+ return result
121
+ end
122
+
123
+ def self.unities(number)
124
+ WrittenNumber::Pt.numbers_to_words_map_unities.resolve number
125
+ end
126
+
127
+ def self.tens(number)
128
+ WrittenNumber::Pt.numbers_to_words_map_tens.resolve number
129
+ end
130
+
131
+ def self.hundreds(number, is_cent = false)
132
+ results = {
133
+ 200 => WrittenNumber::Pt::TWO_HUNDRED,
134
+ 300 => WrittenNumber::Pt::THREE_HUNDRED,
135
+ 400 => WrittenNumber::Pt::FOUR_HUNDRED,
136
+ 500 => WrittenNumber::Pt::FIVE_HUNDRED,
137
+ 600 => WrittenNumber::Pt::SIX_HUNDRED,
138
+ 700 => WrittenNumber::Pt::SEVEN_HUNDRED,
139
+ 800 => WrittenNumber::Pt::EIGHT_HUNDRED,
140
+ 900 => WrittenNumber::Pt::NINE_HUNDRED,
141
+ 100 => (is_cent ? WrittenNumber::Pt::ONE_HUNDRED : WrittenNumber::Pt::ONE_HUNDRED_SINGLE)
142
+ }
143
+
144
+ return results.resolve number
145
+ end
146
+
147
+ def self.thousands(number)
148
+ evaluate_thousands_and_over number, 1e3.to_i, WrittenNumber::Pt::THOUSAND, WrittenNumber::Pt::THOUSAND
149
+ end
150
+
151
+ def self.millions(number)
152
+ evaluate_thousands_and_over number, 1e6.to_i, WrittenNumber::Pt::MILLION_SINGULAR, WrittenNumber::Pt::MILLION_PLURAL
153
+ end
154
+
155
+ def self.thousand_millions(number)
156
+ singular = (@@use_short_scale ? WrittenNumber::Pt::BILLION_SINGULAR : WrittenNumber::Pt::THOUSAND_MILLION)
157
+ plural = (@@use_short_scale ? WrittenNumber::Pt::BILLION_PLURAL : WrittenNumber::Pt::THOUSAND_MILLION)
158
+
159
+ evaluate_thousands_and_over number, 1e9.to_i, singular, plural
160
+ end
161
+
162
+ def self.billions(number)
163
+ singular = (@@use_short_scale ? WrittenNumber::Pt::TRILLION_SINGULAR : WrittenNumber::Pt::BILLION_SINGULAR)
164
+ plural = (@@use_short_scale ? WrittenNumber::Pt::TRILLION_PLURAL : WrittenNumber::Pt::BILLION_PLURAL)
165
+
166
+ evaluate_thousands_and_over number, 1e12.to_i, singular, plural
167
+ end
168
+
169
+ def self.evaluate_thousands_and_over(number, category_identifier, singular, plural)
170
+ return singular if number == category_identifier
171
+ return '' if number%category_identifier != 0
172
+
173
+ partial_number = number.to_s[0...number.bridge].to_i
174
+ resolve_number partial_number
175
+ return plural
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,143 @@
1
+ require_relative '../../utilities/integer_extensions'
2
+ require_relative '../../utilities/hash_extensions'
3
+ require_relative '../../utilities/string_extensions'
4
+ require_relative '../../utilities/settings'
5
+ require_relative '../../utilities/number_category'
6
+
7
+ require_relative '../../constants/pt/written_numbers'
8
+ require_relative '../../constants/pt/separators'
9
+ require_relative '../../constants/message'
10
+
11
+ module AdaNumbers
12
+ module WordsToNumberConverter
13
+ class Pt
14
+ @@use_short_scale = false
15
+
16
+ def self.convert(word)
17
+ select_scale
18
+
19
+ word = word.gsub(/\s+/, ' ').strip.title_case
20
+
21
+ words_to_convert = word.split " #{Separator::Pt::DECIMAL_SEPARATOR} "
22
+ words_to_convert = word.split " #{Separator::Pt::DECIMAL_SEPARATOR_ALTERNATIVE} " if words_to_convert.size == 1
23
+
24
+ case words_to_convert.size
25
+ when 1
26
+ return resolve_word word, @@use_short_scale
27
+ when 2
28
+ count_zeros = words_to_convert.last.split(' ').select {|w| w == WrittenNumber::Pt::ZERO}.size
29
+
30
+ whole_part = resolve_word words_to_convert.first, @@use_short_scale
31
+ decimal_part = resolve_word words_to_convert.last.gsub(WrittenNumber::Pt::ZERO, ""), @@use_short_scale
32
+
33
+ return Message::INVALID_NUMBER if whole_part == Message::INVALID_NUMBER || decimal_part == Message::INVALID_NUMBER
34
+
35
+ decimal_part = "#{'0'*count_zeros}#{decimal_part}" if count_zeros > 0
36
+ number = "#{whole_part}.#{decimal_part}"
37
+
38
+ return number.to_f
39
+ end
40
+
41
+ return Message::INVALID_NUMBER
42
+ end
43
+
44
+ private
45
+ def self.resolve_word(word, use_short_scale = false)
46
+ word = word.gsub /\s+/, ' '
47
+
48
+ # Try to get a direct match from the map
49
+ number = map_number_according_to_scale word, use_short_scale
50
+ return number unless number.nil?
51
+
52
+ # It was not found a direct match, so, let's find that bastard
53
+ string_tokens = word.split ' '
54
+ numeric_tokens = []
55
+
56
+ # The algorithm consists on iterating every token so that to find its direct match
57
+ # in the map and then stack it up. If the next number to be stacked requires a multiplier,
58
+ # we find it and stack it up after popping the later numbers. When all the matches are found
59
+ # The number is their sum
60
+ (0...string_tokens.size).each do |cursor|
61
+ token = string_tokens[cursor]
62
+
63
+ case token
64
+ when token == Separator::Pt::NUMBERS_SEPARATOR && (cursor == 0 || cursor == string_tokens.size - 1),
65
+ token == Separator::Pt::NUMBERS_SEPARATOR && WrittenNumber::Pt.numbers_that_ignore_separator.include?(string_tokens[cursor + 1]),
66
+ token == Separator::Pt::NUMBERS_SEPARATOR && cursor > 0 && string_tokens[cursor - 1] == Separator::Pt::NUMBERS_SEPARATOR
67
+ return Message::INVALID_NUMBER
68
+ when Separator::Pt::NUMBERS_SEPARATOR
69
+ next
70
+ end
71
+
72
+ token = "#{WrittenNumber::Pt::ONE} #{token}" if join_one? token
73
+
74
+ number_has_incorrect_or_no_separator = cursor > 0 &&
75
+ !WrittenNumber::Pt.numbers_that_ignore_separator.include?(token) &&
76
+ string_tokens[cursor - 1] != Separator::Pt::NUMBERS_SEPARATOR
77
+
78
+ number_is_in_incorrect_short_scale_format = use_short_scale && cursor > 0 &&
79
+ cursor < string_tokens.size - 1 && token == WrittenNumber::Pt::THOUSAND &&
80
+ WrittenNumber::Pt.not_to_combine_with_thousand.include?(string_tokens[cursor + 1])
81
+
82
+ return Message::INVALID_NUMBER if number_has_incorrect_or_no_separator || number_is_in_incorrect_short_scale_format
83
+
84
+ number = map_number_according_to_scale token, use_short_scale
85
+ return Message::INVALID_NUMBER if number.nil?
86
+
87
+ if compute_multiplier? token, numeric_tokens.size
88
+ multiplier, numeric_tokens = find_multiplier numeric_tokens
89
+ number *= multiplier
90
+ end
91
+
92
+ numeric_tokens.push number
93
+ end
94
+
95
+ numeric_tokens.sum
96
+ end
97
+
98
+ def self.map_number_according_to_scale(word, use_short_scale)
99
+ mapped_number = WrittenNumber::Pt.words_to_number_map.resolve(word)
100
+
101
+ number = if use_short_scale
102
+ mapped_number.nil? ? WrittenNumber::Pt.words_to_number_map_short_scale.resolve(word) : mapped_number
103
+ else
104
+ mapped_number.nil? ? WrittenNumber::Pt.words_to_number_map_long_scale.resolve(word) : mapped_number
105
+ end
106
+
107
+ number
108
+ end
109
+
110
+ def self.select_scale
111
+ @@use_short_scale = Settings.scale == Settings::Parameters::SCALES[:short]
112
+ end
113
+
114
+ def self.join_one?(token)
115
+ token != WrittenNumber::Pt::ONE && token != WrittenNumber::Pt::THOUSAND &&
116
+ (WrittenNumber::Pt::MILLION_SINGULAR.include?(token) ||
117
+ WrittenNumber::Pt::BILLION_SINGULAR.include?(token) ||
118
+ WrittenNumber::Pt::TRILLION_SINGULAR.include?(token))
119
+ end
120
+
121
+ def self.compute_multiplier?(token, number_of_numeric_tokes)
122
+ (token == WrittenNumber::Pt::THOUSAND ||
123
+ token == WrittenNumber::Pt::MILLION_SINGULAR ||
124
+ token == WrittenNumber::Pt::MILLION_PLURAL ||
125
+ token == WrittenNumber::Pt::BILLION_SINGULAR ||
126
+ token == WrittenNumber::Pt::BILLION_PLURAL ||
127
+ token == WrittenNumber::Pt::TRILLION_SINGULAR ||
128
+ token == WrittenNumber::Pt::TRILLION_PLURAL) &&
129
+ number_of_numeric_tokes != 0
130
+ end
131
+
132
+ def self.find_multiplier(numeric_tokens)
133
+ multiplier = numeric_tokens.pop
134
+
135
+ while numeric_tokens.size != 0
136
+ multiplier += numeric_tokens.pop
137
+ end
138
+
139
+ return multiplier, numeric_tokens
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,17 @@
1
+ require_relative './pt/words_to_number_converter'
2
+ require_relative './en/words_to_number_converter'
3
+
4
+ class String
5
+ def to_number
6
+ case AdaNumbers::Settings.language
7
+ when AdaNumbers::Settings::Parameters::LANGUAGES[:en]
8
+ AdaNumbers::WordsToNumberConverter::En.convert self
9
+ else
10
+ AdaNumbers::WordsToNumberConverter::Pt.convert self
11
+ end
12
+ end
13
+
14
+ def to_n
15
+ to_number
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ class Hash
2
+ def resolve(value)
3
+ return resolve_for_int_str(value) if value.class == Integer
4
+ return resolve_for_str_int(value)
5
+ end
6
+
7
+ private
8
+ def resolve_for_int_str(number)
9
+ (self[number].nil?)? '' : self[number]
10
+ end
11
+
12
+ def resolve_for_str_int(words)
13
+ self[words]
14
+ end
15
+ end
@@ -0,0 +1,39 @@
1
+ class Integer
2
+ extend AdaNumbers
3
+ def number_of_digits
4
+ self.to_s.size
5
+ end
6
+
7
+ def category
8
+ case self.number_of_digits
9
+ when 2
10
+ return AdaNumbers::NumberCategory::TEN
11
+ when 3
12
+ return AdaNumbers::NumberCategory::HUNDRED
13
+ when 4..6
14
+ return AdaNumbers::NumberCategory::THOUSAND
15
+ when 7..9
16
+ return AdaNumbers::NumberCategory::MILLION
17
+ when 10..12
18
+ return AdaNumbers::NumberCategory::THOUSAND_MILLIONS
19
+ when 13..15
20
+ return AdaNumbers::NumberCategory::BILLION
21
+ end
22
+
23
+ AdaNumbers::NumberCategory::UNITY
24
+ end
25
+
26
+ def bridge
27
+ n_digits = self.number_of_digits
28
+
29
+ case n_digits
30
+ when 5, 8, 11, 14
31
+ return 2
32
+ when 6, 9, 12, 15
33
+ return 3
34
+ end
35
+
36
+ return 1
37
+ end
38
+ end
39
+
@@ -0,0 +1,11 @@
1
+ module AdaNumbers
2
+ class NumberCategory
3
+ UNITY = 0
4
+ TEN = 1
5
+ HUNDRED = 2
6
+ THOUSAND = 3
7
+ MILLION = 6
8
+ THOUSAND_MILLIONS = 9
9
+ BILLION = 12
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AdaNumbers
4
+ class Settings
5
+ class Parameters
6
+ LANGUAGES = {
7
+ en: :english,
8
+ pt: :portuguese
9
+ }
10
+
11
+ SCALES = {
12
+ short: :short,
13
+ long: :long
14
+ }
15
+
16
+ DIGITS_LIMIT = 15
17
+
18
+ class << self
19
+ attr_accessor :hello
20
+ end
21
+ end
22
+
23
+ @language = Parameters::LANGUAGES[:pt]
24
+ @scale = Parameters::SCALES[:long]
25
+
26
+ class << self
27
+ attr_accessor :language, :scale
28
+
29
+ def reset
30
+ @language = Parameters::LANGUAGES[:pt]
31
+ @scale = Parameters::SCALES[:long]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ class String
2
+ def title_case
3
+ self.split(' ').map { |w| w.capitalize }.join ' '
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module AdaNumbers
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'ada_numbers/version'
2
+
3
+ require 'ada_numbers/converters/number_to_words_converter_extensions'
4
+ require 'ada_numbers/converters/pt/number_to_words_converter'
5
+ require 'ada_numbers/converters/en/number_to_words_converter'
6
+
7
+ require 'ada_numbers/converters/words_to_number_converter_extensions'
8
+ require 'ada_numbers/converters/pt/words_to_number_converter'
9
+
10
+ module AdaNumbers
11
+ class Error < StandardError; end
12
+ # Your code goes here...
13
+ end