Browse | Submit A New Snippet | Create A Package

 

Language Numbers

Type:
Function
Category:
Math Functions
License:
Ruby License
Language:
Ruby
 
Description:
Language Numbers

Versions Of This Snippet::

zhang bee
Snippet ID Download Version Date Posted Author Delete
4370.12009-02-06 02:19zhang bee

Download a raw-text version of this code by clicking on "Download Version"

 


Latest Snippet Version: :0.1

# To change this template, choose Tools | Templates
# and open the template in the editor.
# 0 零 1 一 2 二 三 四 五六七八九十 百 千 万 亿 兆(10000亿)
# 1234_5678  一千万二百三十四万五千六百七十八
# 12303_0408 一亿二千三百零三万四百零八
# 汉语里,是万 亿 兆,5位来划分一个大的数字,四位为一个集合十百千万
# =>万:代表的是10的四次方。
#亿:代表的是10的八次方。
#
#兆:代表的是10的十二次方。
#
#京:代表的是10的十六次方。
#
#垓:代表的是10的二十次方。
#
#杼:代表的是10的二十四次方。
#
#穰:代表的是10的二十八次方。
#
#沟:代表的是10的三十二次方。
#
#涧:代表的是10的三十六次方。
#
#正:代表的是10的四十次方。
#
#载:代表的是10的四十四次方。
#
#极:代表的是10的四十八次方。
#
#恒河沙:代表的是10的五十二次方。
#
#阿僧□:代表的是10的五十六次方。
#
#那由它:代表的是10的六十次方。
#
#不可思议:代表的是10的六十四次方。
#
#无量:代表的是10的六十八次方。
#
#大数:代表的是10的七十二次方。

class String
  def each_char
    if block_given?
      scan(/./m) do |x|
        yield x
      end
    else
      scan(/./m)
    end
  end
end

class Integer

  #解决办法:将数字分为四个为一组的二维数组(倒置)(1234567-[[7654],[321]])
  def to_ch()
    #先将数字分成已四个数字为一组
    small_nums = %w[零 一 二 三 四 五 六 七 八 九 ]
    digit = %w['' 十 百 千]
    big_digit = %w[万 亿 兆 京 垓 杼 穰 沟 涧 正 载 极 恒河沙 阿僧□ 那由它 不可思议 无量 大数]

    nums = self.to_s.each_char
    nums.reverse!
    #rh = {},本来用的是hash,所以后面肯定会出错,
    #hash是无序的,他只是几个集合,而数组是有序的,按照索引排列
    rh = []
    temp = []
    j = 0
    p nums
    nums.each_index do |i|
      temp << nums[i].to_i
      if temp.size == 4
        rh << temp.clone
        temp.clear
        j += 1
      end
    end
    ch_num = ""
    rh << temp.clone if !temp.empty?
    p rh
    #分析数组,并解析为汉字
    rh.each_index do |key|
      value = rh[key]
      value.each_index do |i|
        digits = ""
        digits = digit[i].to_s if i > 0
        if value[i] != 0
          value[i] = small_nums[value[i]].to_s + digits
        end
      end
      
      if key > 0
        four_num = del_zero(value.reverse!.to_s)
        #bd = big_digit[(key-1)%3] #万亿兆也需要循环,不然数字超过兆是就出错了!
        #判断如果超过亿,并且万上没有数字,万要去掉;还有就是超过兆之后,兆前面没有数字,
        #并超过了万,这是时是万兆,这是兆是不能去的!
        bd = big_digit[key-1]
        if four_num == '' && rh[key + 1] != nil
          bd = ''
        end
        ch_num = four_num  + bd + ch_num if bd != ""
      else
        ch_num = del_zero(value.reverse!.to_s) + ch_num
      end
    end
    return ch_num
  end
  #将字符串重复的零为一个零,在将结尾的零去掉
  def del_zero(v)
    v.squeeze("0").gsub(/0/,"零").sub(/零$/,'')
  end
end

c = 1010_0200.to_ch()
puts c
d = 11_0000_0000_0000_0001_0001_1234.to_ch();
puts d



		

Submit a new version

You can submit a new version of this snippet if you have modified it and you feel it is appropriate to share with others..