效果圖:
實現代碼:
money = float(input("Please input the money:"))
cop = int(money)
Num = ['零','壹','貳','叄','肆','伍','陸','柒','捌','镹']
#用於存轉換后的漢字
UnitZ = ['','仟','佰','十']
#存轉換需要的單位(4數字一循環)
Integer = []
#存整數部分每一位數字
Decimal = []
#存小數部分每一位數字(一共兩位,精確到分)
Zheng = cop
Xiao = 0.00
#初始化小數,如果不手工指定精確2位則默認精確一位
End = []
if('.' in str(money)):#判斷輸入有沒有小數,沒有則使用初始化,有則重新計算Xiao變量(仔細讀代碼可以看出這個if是有問題的,本來是想沒有則用初始化Xiao的值,但現在才發現並木有,那就限制下必須輸入小數部分吧,在用戶輸入加個友情提示:必須精確到小數點后兩位~)
Xiao = money - cop
for i in range(2,4):#小數部分的存儲格式為0.XX,前面有一個“0”和一個“.”所以要空過去前兩個字符
a = str(Xiao)
Decimal.append(a[i])
for i in str(Zheng):
Integer.append(i)
# print(Integer)
# print(Decimal)
a = 0
b = 0
Ling = 1
for i in Integer:
i = int(i)
c = len(Integer)
a += 1
b = ((a + 4)-(c % 4)) % 4#前面的a+4是考慮到位置剛開始可能小於全部長度余4的值,比如索引a+1(當前讀取數字的第幾位)-(c數字總長度%4)得到當前位為四位循環體(千百十空)的第幾位(用於判斷轉換后數字后面跟的單位)
if (i != 0 and Ling == 0):
End.append('零')
Ling = 1
if(i != 0 and Ling != 0):
End.append(Num[i])
End.append(UnitZ[b])
if(i == 0):
Ling = 0
#我判斷連續零的方法:當前為零則計數器為0,這個是固定的。如果當前不為零並且計數器為零,說明該位上一位為零而這位不是零則在該位前面補個零(一定要在該位數字變換前插零),巧妙之處在於‘零’這個變換不是由數字位0來決定是否插入(這樣不管幾個0都不會隨意插‘零’),而交由0后面的非0來插入(0與非0之間肯定一個‘零’,不管非0前有幾個0)
#多說一句,三條if應該可以合並成一個if/elif語句,我沒試,想這個法子就好頭疼啊,一下也不想看了,不改了,你想改就改吧
if (c - a == 8): End.append('億')#每四位插一個大單位,不足四位也不用擔心會亂插
if (c - a == 4): End.append('萬')
End.append('元')
m = int(Decimal[0])
End.append(Num[m])
End.append('角')
n = int(Decimal[1])
End.append(Num[n])
End.append('分')
end = ''.join(End)
print(end)
#最后的元和角、分由於位數固定,懶得再給搞循環了,隨便手動插一下就算完了,不足之處在於,其實程序可以簡單不少,完全可以把整數和小數放在一起,補個標志位啥的或者計數器記下位數之類的,然后一套循環直接做出來,我覺得挺好,留給你當作業了,我不改了,交給你了
解析:
思路很簡單,把輸入的數字分成兩部分,整數和浮點數(單整數則小數部分初始化為0)。然后用兩個列表把整數和小數部分分別存起來,然后創建個列表把數字對應的大寫漢字存起來,用於一對一轉換。數字轉成漢字完成了,另一個就是單位問題,很巧,中文將四位數字為一組,分為萬、億、兆,我設置的上限是億(兆在現實中也用不到吧。。。),然后四位中都是千、百、十。確定好循環及千百十對應的位置關系,當轉換完一個數字就把千百十加進一個,每逢四位加一個大單位“萬、億”。另一個需要注意的是零,比較特殊,單個零不跟單位“千百十”,多個零連續則合成一個零,這里我通余4和總長度跟現長度的差進行調試了半天才解決。
我覺得比較重要的一個思路就是我一開始就決定了用列表的形式存儲最后的結果,然后內容是按字符逐個添加。由於有連續零等多個不確定列表長度的因素存在,所以在構建列表時是采用的append方法往最后面加,比較方便,最后把列表一轉字符串就得到結果了。
方向很重要!如果用開始就用字符串來存可能就不會那么簡單了,程序可以更簡單的,包括里面的一些我臨時用來計數的變量等,我覺得是可以再簡化簡化的,但在測試無誤后我又不想再費時間改了,有點晚啊,改好麻煩啊╮(╯▽╰)╭,就這樣吧,誰看了想改自己再改進吧。
好久沒寫博客了,也是因為最近做的練習少了,一方面因為最近在看Python基礎教程書,沒做到什么練習(看基礎書好無聊啊),另一方面是現在在花時間學英語,還准備考個英語六級啊,最近一直在看英文小說,看完幾個短篇的了,最近在看《傲慢與偏見》,加油啊!