module ChineseMoney

Display Chinese money

Constants

VERSION

Public Class Methods

show_money(total_money) click to toggle source

main method

# File lib/chinese_money.rb, line 7
def self.show_money(total_money)
  cn_upper_number =%w[零 壹 贰 叁 肆 伍 陆 柒 捌 玖]
  cn_upper_monetray_unit = %w[分 角 圆 拾 佰 仟 万 拾 佰 仟 亿 拾 佰 仟 兆 拾 佰 仟]
  cn_full = '整'
  cn_negative = '负'
  money_precision = 2
  cn_zeor_full = "零圆#{cn_full}"
  is_zero = false
  zero_size = 0
  num_index = 0
  num_unit = 0
  change_result = []
  my_total_price = total_money

  #  Too long too big/cannot support
  return '只支持总长度不超过17位的数字。' if my_total_price.to_i > 100000000000000

  #  For zero
  return cn_zeor_full if my_total_price.zero?

  #  For round
  my_number = my_total_price.round(money_precision) * 100
  scale = my_number % 100

  if scale.to_f.zero?
    num_index = 2
    my_number /= 100
    is_zero = true
  end

  if ((scale > 0) && (!(scale % 10 > 0))) 
    num_index = 1
    my_number /= 10
    is_zero = true
  end 

  loop do
    break if my_number <= 0

    num_unit = (my_number % 10).to_i
    if (num_unit > 0)
      change_result.prepend(cn_upper_monetray_unit[6]) if ((num_index == 9) && (zero_size >= 3))
      change_result.prepend(cn_upper_monetray_unit[10]) if ((num_index == 13) && (zero_size >= 3))
      change_result.prepend(cn_upper_monetray_unit[num_index])
      change_result.prepend(cn_upper_number[num_unit])
      is_zero = false
      zero_size = 0
    else
      zero_size += 1
      change_result.prepend(cn_upper_number[num_unit]) unless is_zero
      if num_index == 2
        change_result.prepend(cn_upper_monetray_unit[num_index]) if (my_number > 0) 
      elsif (((num_index - 2) % 4 == 0) && (my_number % 1000 > 0))
        change_result.prepend(cn_upper_monetray_unit[num_index])
      end
      is_zero = true
    end
    my_number = (my_number / 10).to_i
    num_index += 1
  end
  change_result.prepend(cn_negative) if my_total_price < 0
  change_result.append(cn_full) unless scale > 0
  change_result.join
end