直接上代碼,每個步驟都有注釋。難點在零的處理上。
# 用字典變量x來保存0~9,和中文大寫
x = {0:'零', 1:'壹', 2:'貳', 3:'叁', 4:'肆', 5:'伍', 6:'陸', 7:'柒', 8:'捌', 9:'玖'}
# 用元組變量y保存人民幣金額的各種單位
y = ("元","拾","佰","仟","萬","拾","佰","仟","億","拾","佰","仟","萬","拾","佰","仟")
# 用列表變量c來存儲初步生成的結果
c=[]
# 用字符串變量d來保存最后的結果
d=""
# 接收鍵盤輸入的阿拉伯數(shù)字以字符串形式存儲在變量n中
n = input("請輸入一個大于零不超過十五位的數(shù)字:")
while len(n)>15 or int(n)<=0:
? ? n = input("輸入錯誤,請輸入一個大于零不超過十五位的數(shù)字:")
# 將字符串n換成大寫的數(shù)字金額
k = len(n)-1
for i in n:
? ? j = int(i)
? ? c.append(x[j])
? ? c.append(y[k])
? ? k = k-1
print(c)? ? # 測試用,程序檢測完需刪除
# 處理帶有0的數(shù)字
# 先將c列表中的零都用x來替換,同時將零后的單位也用x替換;
# 但對元、萬、億這三個特殊單位不要替換。這三個單位是中文數(shù)字中的三個不同量級的基本單位,所以要保留。
k = len(c)-1
for i in range(k, 0, -2):
? ? if c[i-1]=='零':
? ? ? ? c[i-1]='x'
? ? if c[i] != '元' and c[i] != '萬' and c[i] != '億' and c[i-1] == 'x':? ? ? # 注意要滿足前一位為0,即c[i-1] == 'x'
? ? ? ? c[i] = 'x'
# print(c)? ? # 測試用,程序檢測完需刪除
# 確定哪些x需恢復'零',哪些需刪除
# 在元、萬、億這些單位左面如果連續(xù)出現(xiàn)‘x’則這些"x"不需要恢復為零,我們先將這些不需要恢復的"x"標記為"y"
for i in range(k, 0, -1):
? ? if (c[i] == "元" or c[i] == "萬" or c[i] == "億") and c[i-1] == "x" or c[i] == "y" and c[i-1] == "x":
? ? ? ? c[i-1] = 'y'
# print(c)
# 把需要的'零'恢復回來,即把位于最右側的x恢復為"零"其余x保持不變。
k = len(c)-2
for i in range(k,0,-1):
? ? if c[i] == 'x' and c[i+1] != '零' and c[i+1] != 'x':
? ? ? ? c[i] = '零'
# print(c)
# 多顯示一個萬字: 當位數(shù)超過9位,而且萬位左側連續(xù)三個數(shù)字位均為0時出現(xiàn)這一問題
k = len(c)
if k>=18 and c[k-16]=='y' and c[k-12]=='y' and c[k-14]=='y':
? ? c[k-9] = 'x'
# 將c列表刪除其中的'x'和'y',并轉換為字符串格式輸出。
for i in range(0, len(c)):
? ? if c[i] != 'x' and c[i] != 'y':
? ? ? ? d = d+c[i]
print(d)