kearney

自学还没成才的python猿

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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))
posted on 2017-06-27 16:45  Gino森  阅读(8305)  评论(0编辑  收藏  举报