Class: EasyToDictateNumbers::NumberToDictable

Inherits:
Object
  • Object
show all
Defined in:
lib/easy_to_dictate_numbers.rb

Constant Summary collapse

ONES =
%w[zero one two three four five six seven eight nine].freeze
TEENS =
%w[ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen].freeze
TENS =
%w[twenty thirty forty fifty sixty seventy eighty ninety].freeze

Class Method Summary collapse

Class Method Details

.four_digit_number_to_words(number) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/easy_to_dictate_numbers.rb', line 45

def self.four_digit_number_to_words(number)
  high_pair, low_pair = number.divmod(100)
  words = []
  words << "#{two_digit_number_to_words(high_pair)} hundred" unless high_pair.zero?
  words << two_digit_number_to_words(low_pair) unless low_pair.zero? || high_pair.zero?
  words.join(' ')
end

.large_number_to_words(number) ⇒ Object



53
54
55
# File 'lib/easy_to_dictate_numbers.rb', line 53

def self.large_number_to_words(number)
  number.to_s.chars.map { |digit| ONES[digit.to_i] }.each_slice(3).map { |digit| digit.join(' ') }.join(', ')
end

.number_to_words(number) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/easy_to_dictate_numbers.rb', line 15

def self.number_to_words(number)
  validate_number(number)

  case number.digits.count
  when 1, 2 then two_digit_number_to_words(number)
  when 3 then three_digit_number_to_words(number)
  when 4 then four_digit_number_to_words(number)
  else large_number_to_words(number)
  end
end

.three_digit_number_to_words(number) ⇒ Object



38
39
40
41
42
43
# File 'lib/easy_to_dictate_numbers.rb', line 38

def self.three_digit_number_to_words(number)
  first_digit, remainder = number.divmod(100)
  words = [ONES[first_digit], 'hundred']
  words << two_digit_number_to_words(remainder) unless remainder.zero?
  words.join(' ')
end

.two_digit_number_to_words(number) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/easy_to_dictate_numbers.rb', line 30

def self.two_digit_number_to_words(number)
  return ONES[number] if number < 10
  return TEENS[number - 10] if number < 20

  div, mod = number.divmod(10)
  TENS[div - 2] + (mod.zero? ? '' : " #{ONES[mod]}")
end

.validate_number(number) ⇒ Object

Raises:



26
27
28
# File 'lib/easy_to_dictate_numbers.rb', line 26

def self.validate_number(number)
  raise Error, 'Please enter a non-negative number' if number.negative?
end