直接上代码,每个步骤都有注释。难点在零的处理上。
# 用字典变量x来保存0~9,和中文大写
x = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'}
# 用元组变量y保存人民币金额的各种单位
y = ("元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟")
# 用列表变量c来存储初步生成的结果
c=[]
# 用字符串变量d来保存最后的结果
d=""
# 接收键盘输入的阿拉伯数字以字符串形式存储在变量n中
n = input("请输入一个大于零不超过十五位的数字:")
while len(n)>15 or int(n)<=0:
n = input("输入错误,请输入一个大于零不超过十五位的数字:")
# 将字符串n换成大写的数字金额
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的数字
# 先将c列表中的零都用x来替换,同时将零后的单位也用x替换;
# 但对元、万、亿这三个特殊单位不要替换。这三个单位是中文数字中的三个不同量级的基本单位,所以要保留。
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’则这些"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)
# 多显示一个万字: 当位数超过9位,而且万位左侧连续三个数字位均为0时出现这一问题
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]