使用python将数字转换为有意义的汉字
Google的面试题更强悍,是反着来的,暂时还不想折腾。俺写的这段程序理论上支持无限多个数字,只要你适当的给单位命名。注意,输入的数字不要超过你定义的最大单位噢,要不第一个单位就显示不出来了,读起来就不太符合习惯。
# coding=UTF-8
from re import sub
from math import ceil
chinese_digits = (u'零',u'一',u'二',u'三',u'四',u'五',u'六',u'七',u'八',u'九')
chinese_jinzhi = [u'亿亿亿',u'万亿亿',u'亿亿',u'万亿',u'亿',u'万',u'',u'千',u'百',u'十',u'']
def format_digit_with_jinzhi(digit,jinzhi):
if digit == 0:
return chinese_digits[digit]
return chinese_digits[digit] + jinzhi
def format4digits(digits,save_one_zero_at_head=False,ingore_one_befor_ten=False):
"""
save_one_zero_at_head 20001 一般为两万零一 而0001则为1
ingore_one_befor_ten 12 一般为 十二 而不是 一十二 但是2012 就为两千零一十二
"""
digits = '%04d' % digits
s = ''
jinzhi_index = -4
for digit in digits:
numeric_digit = int(digit)
s += format_digit_with_jinzhi(numeric_digit,chinese_jinzhi[jinzhi_index])
jinzhi_index+=1
#规则,总数只有4位数时开头不能为0,多余四位数必须保留一个零
#中间不能连续两个以上的0,替换为一个0,
#末尾不能为0
if save_one_zero_at_head:
s = sub(r"^"+u"零"+"{1,}",u'零',s)
else:
s = sub(r"^"+u"零"+"+",'',s)
if ingore_one_befor_ten:
s = sub(r""+u"一十",u'十',s)#前面没有零的情况下简写
s= sub(r""+u"零"+"+$",'',s)
s= sub(r""+u"零"+"{2,}",u'零',s)
return s
def number2hanzi(arg):
"""
数字转汉字
"""
arg = '%s' % arg #转为字符串
source = sub('\D','',arg)#提取数字
source_list = []
for i in range(int(ceil(len(source)/4.0))):
if i == 0:
source_list.insert(0,int(source[-4:]))
else:
source_list.insert(0,int(source[(-i-1)*4:(-i*4)]))
result = ''
old_result=''
first_part_danwei_index = chinese_jinzhi.index(u"万") - len(source_list) + 2 #列表中第一组数字的单位在单位列表中的索引
##特殊情况处理###
if False:
pass
elif len(source_list) == 1 and source_list[0] < 1:
#数字0
result = chinese_digits[0]
elif len(source_list) == 1 and source_list[0] < 100:
#只有在这种情况,才需要省略一的发音
result = format4digits(source_list[0],ingore_one_befor_ten=True)
else:
part_counter = 0
for part in source_list:
old_result = result
if len(source_list) > 1 and part_counter == (len(source_list) - 1):
#最后一组数字如果前面有0要保留至少一个零的发音
result+=format4digits(part,save_one_zero_at_head=True)
else:
result+=format4digits(part)
if old_result != result:#遇到上一组返回的结果为空,意味是四个零,需要把后缀单位去掉
result+=chinese_jinzhi[first_part_danwei_index+part_counter]
part_counter+=1
return result
while True:
q = raw_input('Enter a number:')
if q.lower() == 'quit':
break
else:
print number2hanzi(q)
使用python将数字转换为有意义的汉字
http://hellohtml5.blogspot.com/2010/06/python.html
没有评论:
发表评论