conf/initializers/float.rb
# encoding: utf-8
class Float
Numbers = {"0" => "零", "1" => "壹", "2" => "贰", "3" => "叁", "4" => "肆", "5" => "伍", "6" => "陆", "7" => "柒", "8" => "捌", "9" => "玖"}
Positions = {"0" => "元", "1" => "拾", "2" => "佰", "3" => "仟", "4" => "万", "5" => "拾", "6" => "佰", "7" => "仟", "8" => "亿", "9" => "拾","10" => "佰", "11" => "仟"}
Fraction = {"0" => "角", "1" => "分"}
def to_zh
first_nu,last_nu = abs.to_s.split(".")
raise "小数点必须保留两位" if last_nu.length > 2
raise "单位必须小于或等于(亿)" if first_nu.length > 11
ary = []
fraction = []
num_to_zh = first_nu.reverse.split('').collect{|s| Numbers[s.to_s]}
num_to_zh.each_with_index{|x,v| ary.unshift(x == "零" ? ( v == 4 ? "万" : v == 8 ? "亿" : "零") : [x ,Positions[v.to_s]])}
last_nu.split('').each_with_index{|m,o| fraction << [Numbers[m.to_s],Fraction[o.to_s]]}
(self < 0 ? "负" : "") + (ary.join.gsub(/零+/,"零").gsub(/零亿/,"亿零").gsub(/零万/,"万零").gsub(/零+/,"零").gsub(/零$/,"元") + (last_nu == "0" ? "整" : fraction.join.gsub(/零角/,"零")))
end
end