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
|