Class: ChineseNumber::Converter

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

Constant Summary collapse

NUMBERS =
%w[         ].freeze
DIGIT_UNITS =
["", "", "", ""].freeze
SECTION_UNITS =
["", "", "", "", ""].freeze
INTEGER_PATTERN =
/\A[+-]?\d+\z/.freeze

Class Method Summary collapse

Class Method Details

.run(input_num) ⇒ Object

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/chinese_number.rb', line 16

def self.run(input_num)
  return unless input_num

  normalized = normalize(input_num)
  sign = normalized.delete_prefix!("-") ? "" : ""
  normalized.delete_prefix!("+")
  normalized = normalized.sub(/\A0+/, "")

  return "#{sign}零元整" if normalized.empty?

  groups = normalized.reverse.scan(/\d{1,4}/).map { |group| group.reverse.to_i }
  raise ArgumentError, "number is too large to convert" if groups.length > SECTION_UNITS.length

  converted_groups = groups.each_with_index.map do |group, index|
    next if group.zero?

    group_to_chinese(group) + SECTION_UNITS[index]
  end

  result = []
  pending_zero = false

  converted_groups.reverse.each_with_index do |group, index|
    original_group = groups.reverse[index]

    if group
      result << NUMBERS[0] if pending_zero || (index.positive? && original_group < 1000)
      result << group
      pending_zero = false
    elsif result.any?
      pending_zero = true
    end
  end

  "#{sign}#{result.join}元整"
end