# 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