http://siroh.blog.sohu.com/274593310.html
1 ''' 2 人民币数字转大写汉字 3 ''' 4 5 # coding: utf-8 6 import warnings 7 from decimal import Decimal 8 9 def cncurrency(value, capital=True, prefix=False, classical=None): 10 ''' 11 参数: 12 capital: True 大写汉字金额 13 False 一般汉字金额 14 classical: True 元 15 False 圆 16 prefix: True 以'人民币'开头 17 False, 无开头 18 ''' 19 if not isinstance(value, (Decimal, str, int)): 20 msg = ''' 21 由于浮点数精度问题,请考虑使用字符串,或者 decimal.Decimal 类。 22 因使用浮点数造成误差而带来的可能风险和损失作者概不负责。 23 ''' 24 warnings.warn(msg, UserWarning) 25 # 默认大写金额用圆,一般汉字金额用元 26 if classical is None: 27 classical = True if capital else False 28 29 # 汉字金额前缀 30 if prefix is True: 31 prefix = '人民币' 32 else: 33 prefix = '' 34 35 # 汉字金额字符定义 36 dunit = ('角', '分') 37 if capital: 38 num = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖') 39 iunit = [None, '拾', '佰', '仟', '万', '拾', '佰', '仟','亿', '拾', '佰', '仟', '万', '拾', '佰', '仟'] 40 else: 41 num = ('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九') 42 iunit = [None, '十', '百', '千', '万', '十', '百', '千','亿', '十', '百', '千', '万', '十', '百', '千'] 43 if classical: 44 iunit[0] = '元' if classical else '圆' 45 # 转换为Decimal,并截断多余小数 46 47 if not isinstance(value, Decimal): 48 value = Decimal(value).quantize(Decimal('0.01')) 49 50 # 处理负数 51 if value < 0: 52 prefix += '负' # 输出前缀,加负 53 value = - value # 取正数部分,无须过多考虑正负数舍入 54 # assert - value + value == 0 55 # 转化为字符串 56 s = str(value) 57 if len(s) > 19: 58 raise ValueError('金额太大了,不知道该怎么表达。') 59 istr, dstr = s.split('.') # 小数部分和整数部分分别处理 60 istr = istr[::-1] # 翻转整数部分字符串 61 so = [] # 用于记录转换结果 62 63 # 零 64 if value == 0: 65 return prefix + num[0] + iunit[0] 66 haszero = False # 用于标记零的使用 67 if dstr == '00': 68 haszero = True # 如果无小数部分,则标记加过零,避免出现“圆零整” 69 70 # 处理小数部分 71 # 分 72 if dstr[1] != '0': 73 so.append(dunit[1]) 74 so.append(num[int(dstr[1])]) 75 else: 76 so.append('整') # 无分,则加“整” 77 # 角 78 if dstr[0] != '0': 79 so.append(dunit[0]) 80 so.append(num[int(dstr[0])]) 81 elif dstr[1] != '0': 82 so.append(num[0]) # 无角有分,添加“零” 83 haszero = True # 标记加过零了 84 85 # 无整数部分 86 if istr == '0': 87 if haszero: # 既然无整数部分,那么去掉角位置上的零 88 so.pop() 89 so.append(prefix) # 加前缀 90 so.reverse() # 翻转 91 return ''.join(so) 92 93 # 处理整数部分 94 for i, n in enumerate(istr): 95 n = int(n) 96 if i % 4 == 0: # 在圆、万、亿等位上,即使是零,也必须有单位 97 if i == 8 and so[-1] == iunit[4]: # 亿和万之间全部为零的情况 98 so.pop() # 去掉万 99 so.append(iunit[i]) 100 if n == 0: # 处理这些位上为零的情况 101 if not haszero: # 如果以前没有加过零 102 so.insert(-1, num[0]) # 则在单位后面加零 103 haszero = True # 标记加过零了 104 else: # 处理不为零的情况 105 so.append(num[n]) 106 haszero = False # 重新开始标记加零的情况 107 else: # 在其他位置上 108 if n != 0: # 不为零的情况 109 so.append(iunit[i]) 110 so.append(num[n]) 111 haszero = False # 重新开始标记加零的情况 112 else: # 处理为零的情况 113 if not haszero: # 如果以前没有加过零 114 so.append(num[0]) 115 haszero = True 116 117 # 最终结果 118 so.append(prefix) 119 so.reverse() 120 return ''.join(so) 121 122 i=input('请输入金额:') 123 print (cncurrency(i))