class ChineseCapital::Number

Attributes

config[RW]

Public Class Methods

configure() { |config| ... } click to toggle source
# File lib/chinese_capital/number.rb, line 17
def configure
  yield(config)
end
parse(num) click to toggle source
# File lib/chinese_capital/number.rb, line 21
def parse(num)
  result = []
  b_num = BigDecimal(num.to_s)

  normal_zero = config.normal[:figure][0]
  return normal_zero if b_num.zero?

  temp = b_num.abs.divmod(1)
  round_section = temp[0].to_s('F').to_i
  decimal_section = temp[1].to_s('F').split('.')[1]

  result_round_section = round_section_zh(round_section)
  result << result_round_section unless result_round_section.empty?
  result << normal_zero if temp[1] != 0 && result.empty?
  result << config.normal[:point_unit] unless temp[1].zero?
  result << decimal_section_zh(decimal_section) unless temp[1].zero?
  result.unshift(config.normal[:minus_unit]) if b_num < 0
  result.join
end
reset() click to toggle source
# File lib/chinese_capital/number.rb, line 13
def reset
  @config = Configuration.new
end
to_money(num) click to toggle source
# File lib/chinese_capital/number.rb, line 41
def to_money(num)
  result = []

  # 金额只保留前两位小数
  b_num = BigDecimal(num.to_s).truncate(2)

  money_zero = config.money[:figure][0]
  return "#{money_zero}#{config.money[:unit]}#{config.money[:round_unit]}" if b_num.zero?

  temp = b_num.abs.divmod(1)
  round_section = temp[0].to_s('F').to_i
  decimal_section = temp[1].to_s('F').split('.')[1]

  result_round_section = round_section_zh(round_section, 'money')
  result << result_round_section unless result_round_section.empty?
  result << config.money[:unit] unless result_round_section.empty?
  unless temp[1].zero?
    result_decimal_section = decimal_section_zh(decimal_section, 'money')
    result_decimal_section.gsub!(/(?<=\A|["#{money_zero}"])["#{money_zero}"]+/, '') if result.empty?
    result << result_decimal_section
  end
  result << config.money[:round_unit] if BigDecimal(decimal_section).zero?
  result.unshift(config.money[:minus_unit]) if b_num < 0 && result
  result.join
end

Private Class Methods

decimal_section_zh(num, parse_type='normal') click to toggle source
# File lib/chinese_capital/number.rb, line 104
def decimal_section_zh(num, parse_type='normal')
  figure_type = config.send(parse_type.to_sym)[:figure]
  figures = if parse_type == 'money'
              num.chars.map(&:to_i).zip(config.money[:decimal_units])
            else
              num.chars.map(&:to_i).zip([])
            end

  figures.map do |figure, unit|
    if figure.zero?
      figure_type[0]
    else
      "#{figure_type[figure]}#{unit}"
    end
  end.join
end
round_section_unit(unit_index, parse_type) click to toggle source
# File lib/chinese_capital/number.rb, line 99
def round_section_unit(unit_index, parse_type)
  major_units = config.send(parse_type.to_sym)[:major_units]
  major_units[1] * (unit_index % 2) + major_units[2] * (unit_index / 2)
end
round_section_zh(num, parse_type='normal') click to toggle source
# File lib/chinese_capital/number.rb, line 69
def round_section_zh(num, parse_type='normal')
  result = []
  unit_index = -1

  figure_type = config.send(parse_type.to_sym)[:figure]
  unit_type = config.send(parse_type.to_sym)[:minor_units]

  num.to_s.chars.map(&:to_i).reverse.each_slice(4) do |figures|
    section = figures.zip(unit_type).map do |figure, unit|
      figure ||= 0
      if figure.zero?
        figure_type[0]
      else
        "#{figure_type[figure]}#{unit}"
      end
    end.reverse.join

    unit_index += 1

    section.gsub!(/["#{figure_type[0]}"]+\z/x, '')

    next if section.empty?

    result << round_section_unit(unit_index, parse_type)
    result << section
  end

  result.reverse.join.gsub(/(?<=\A|["#{figure_type[0]}"])["#{figure_type[0]}"]+/, '')
end