Module: NumberToKanji

Defined in:
lib/number_to_kanji.rb,
lib/number_to_kanji/version.rb,
lib/number_to_kanji/kanji_map.rb,
lib/number_to_kanji/small_number_to_kanji.rb,
lib/number_to_kanji/exceptions/negative_number_error.rb

Defined Under Namespace

Modules: Exceptions, SmallNumberToKanji

Constant Summary collapse

RANGE_END =
1_000_000_000_000_000_000_000_000
VERSION =
'1.0.1'
KANJI_MAP =
{ 0 => '', 1 => '', 2 => '', 3 => '', 4 => '', 5 => '', 6 => '', 7 => '', 8 => '', 9 => '' }.freeze
KANJI_UNITS =
['', '', '', '', '', ''].freeze

Class Method Summary collapse

Class Method Details

.call(number) ⇒ Object

Raises:

  • (::TypeError)


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/number_to_kanji.rb', line 12

def call(number)
  raise(::TypeError) unless number.is_a?(::Integer)
  raise(::NumberToKanji::Exceptions::NegativeNumberError) if number.negative?

  raise(::RangeError, 'Numbers equal to or larger than 10^24 is not supported.') if number >= ::NumberToKanji::RANGE_END

  return ::NumberToKanji::KANJI_MAP[0] if number.zero?

  # 四桁ごとに区切りつつ、位の小さい順に並んだ配列を作る。
  # 例: 123456789 => [6789, 2345, 1]
  # 例: 100006789 => [6789, 0, 1]
  separated_numbers = number.to_s.chars.reverse.each_slice(4).map(&:reverse).map(&:join).map { |i| Integer(i, 10) }

  kanji_with_unit_numbers =
    separated_numbers.map.with_index do |separated_number, index|
      _kanji_number_with_unit(separated_number, index)
    end

  kanji_with_unit_numbers.reverse.join
end