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