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



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

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



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

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



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

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



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

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



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

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:



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

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