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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM