Class: EasyToDictateNumbers::NumberToDictable

Inherits:
Object
  • Object
show all
Defined in:
lib/easy_to_dictate_numbers/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_as_string) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 90

def four_digit_number_to_words(number_as_string)
  number = number_as_string.to_i

  return repeat_zeroes(4) if number.zero?
  return single_thousands_to_words(number_as_string) if (number % 1000).zero?

  high_pair = number_as_string[0..1]
  low_pair = number_as_string[2..3]

  [
    two_digit_number_to_words(high_pair),
    low_pair.to_i.zero? ? 'hundred' : two_digit_number_to_words(low_pair)
  ].join(' ')
end

.large_number_to_words(number_as_string) ⇒ Object



105
106
107
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 105

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

.leading_zeroes_to_words(number_as_string) ⇒ Object



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

def leading_zeroes_to_words(number_as_string)
  leading_zeroes = number_as_string.match(/^0+/).to_s
  leading_zeroes.empty? ? '' : repeat_zeroes(leading_zeroes.length)
end

.number_to_words(number_to_dictate) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 18

def number_to_words(number_to_dictate)
  number_as_string = number_to_dictate.to_s
  validate_number(number_as_string)

  leading_zeroes_words = leading_zeroes_to_words(number_as_string)

  number_without_leading_zeroes = number_without_leading_zeroes(number_as_string)
  number_without_leading_zeroes_words = number_without_leading_zeroes_to_words(number_without_leading_zeroes)

  [leading_zeroes_words, number_without_leading_zeroes_words].reject(&:empty?).join(' ')
end

.number_without_leading_zeroes(number_as_string) ⇒ Object



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

def number_without_leading_zeroes(number_as_string)
  number_as_string.sub(/^0+/, '')
end

.number_without_leading_zeroes_to_words(number_as_string) ⇒ Object



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

def number_without_leading_zeroes_to_words(number_as_string)
  case number_as_string.length
  when 1 then one_digit_number_to_words(number_as_string)
  when 2 then two_digit_number_to_words(number_as_string)
  when 3 then three_digit_number_to_words(number_as_string)
  when 4 then four_digit_number_to_words(number_as_string)
  else large_number_to_words(number_as_string)
  end
end

.one_digit_number_to_words(number_as_string) ⇒ Object



63
64
65
66
67
68
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 63

def one_digit_number_to_words(number_as_string)
  number = number_as_string.to_i
  return repeat_zeroes(1) if number.zero?

  ONES[number]
end

.repeat_zeroes(number_of_zeroes) ⇒ Object



44
45
46
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 44

def repeat_zeroes(number_of_zeroes)
  number_of_zeroes.times.map { ONES[0] }.join(' ')
end

.single_thousands_to_words(number_as_string) ⇒ Object



57
58
59
60
61
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 57

def single_thousands_to_words(number_as_string)
  number = number_as_string.to_i / 1000

  [one_digit_number_to_words(number), 'thousand'].join(' ')
end

.three_digit_number_to_words(number_as_string) ⇒ Object



80
81
82
83
84
85
86
87
88
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 80

def three_digit_number_to_words(number_as_string)
  number = number_as_string.to_i
  return repeat_zeroes(3) if number.zero?

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

.two_digit_number_to_words(number_as_string) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 70

def two_digit_number_to_words(number_as_string)
  number = number_as_string.to_i

  return repeat_zeroes(2) if number.zero?
  return TEENS[number - 10] if number < 20

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

.validate_number(number_as_string) ⇒ Object



30
31
32
# File 'lib/easy_to_dictate_numbers/easy_to_dictate_numbers.rb', line 30

def validate_number(number_as_string)
  raise NonNumberCharactersPresent if number_as_string.match?(/[^0-9]/)
end