• 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))
  • 相关阅读:
    es5和es6的区别
    如何将word文档内容在网页显示方法
    实现在线浏览PDF文件的方法
    移动端开发兼容问题
    常见的浏览器兼容问题和解决方法
    弹层
    猜数字游戏
    米字格画布
    时钟制作
    关于屏幕高度
  • 原文地址:https://www.cnblogs.com/kearney908/p/7085999.html
Copyright © 2020-2023  润新知