鱼C论坛

 找回密码
 立即注册
查看: 2292|回复: 12

bug: 请输入要转换打印的数:202 print: 贰佰零拾贰圆

[复制链接]
发表于 2017-8-31 19:32:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题描述:
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。

在中文大写方式中,0到10以及100、1000、10000被依次表示为:    零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万

以下的例子示范了阿拉伯数字到人民币大写的转换规则:

1        壹圆

11        壹拾壹圆

111        壹佰壹拾壹圆

101        壹佰零壹圆

-1000        负壹仟圆

1234567        壹佰贰拾叁万肆仟伍佰陆拾柒圆

现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.

例如:a=1

则输出:壹圆


代码如下:
#### 数据输入与分解 ####
n = int(input("请输入要转换打印的数:"))

# 判断 n 的正负
flag=('' if n>0 else '负')
n = abs(n)#取绝对值

# 分解
a2 = int(n / 100)
a1 = int((n % 100) /10)#得到十位上的数123%100=23,int(23/10)=2
a0 = int(n%10)#123%10=3

#### 表示法转换 ####
def ts(a):
    # 转换函数
    table1 = [ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
    table2 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    # 找到各位数字 a 是在 table2 中的第 i 项,然后返回 table1 中相对应的项
    i = table2.index(a)#index获取元素的索引,建立两个列表,操作起来比字典更加方便,灵活
    return table1[i]

b2 = ts(a2)
b1 = ts(a1)
b0 = ts(a0)

#### 打印 ####
print(flag + b2 +"佰" +  b1 + "拾"+ b0 + "圆")


bug:
请输入要转换打印的数:202
贰佰零拾贰圆

请输入要转换打印的数:2
零佰零拾贰圆
应该是将:贰圆啦,这个bug怎么改????

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-31 21:18:35 | 显示全部楼层
  1. def ConvertMoney(number):
  2.         # 判断 n 的正负
  3.         flag=('' if number>0 else '负')
  4.         number = abs(number)#取绝对值
  5.         
  6.         result = []
  7.         num = 0
  8.         numdict = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'}
  9.         unit = ['亿','仟万','佰万','拾万','万','仟','佰','拾','圆']
  10.         temp = number
  11.         while temp:
  12.                 num = temp%10
  13.                 temp //= 10        
  14.                 result.append(numdict[num]+unit.pop())
  15.         result.append(flag)
  16.         result.reverse()
  17.         return ''.join(result)

  18. n = int(input("请输入要转换打印的数:"))   
  19. print(ConvertMoney(n))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-31 21:24:29 | 显示全部楼层
  1. def ts(a, flag):
  2.     table1 = [ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
  3.     table2 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
  4.     table3 = ['圆', '拾', '佰', '仟', '万', '拾万', '佰万', '亿']
  5.     s = [] # 收集对应的大写
  6.     L = 0 # 列表的长度

  7.     # 算出对应大写
  8.     for i in a:
  9.         if i != '-':
  10.             j = table2.index(int(i))
  11.             s.append(table1[j])

  12.     # 看是否为负数
  13.     if flag == '负':
  14.         L = len(a)-1
  15.         s.insert(0, '负')
  16.         for i in range(L): #将对应的单位放入
  17.             s.insert(L+1-i,table3[i])
  18.     else:
  19.         L = len(a)
  20.         for i in range(L): #将对应的单位放入
  21.             s.insert(L-i,table3[i])

  22.     return s

  23. if __name__ == '__main__':
  24.     n = input("请输入要转换打印的数:")
  25.     flag = ("" if int(n) > 0 else "负")
  26.     a = [i for i in n] #放入列表中
  27.     p = ts(a,flag)
  28.     print(''.join(p))
复制代码


当你输入小于100的数的时候,a2永远等于0,即b2永远为‘零’。
要解决这个问题,你就要在分解和输出的时候做变化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-1 09:59:44 | 显示全部楼层
bush牛 发表于 2017-8-31 21:24
当你输入小于100的数的时候,a2永远等于0,即b2永远为‘零’。
要解决这个问题,你就要在分解和输出的 ...

=
请输入要转换打印的数:202
贰佰零拾贰圆

这个应该是贰佰零贰圆
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-1 10:00:21 | 显示全部楼层

=
请输入要转换打印的数:202
贰佰零拾贰圆

这个应该是贰佰零贰圆
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 10:05:36 | 显示全部楼层
1141429506 发表于 2017-9-1 10:00
=
请输入要转换打印的数:202
贰佰零拾贰圆

2017-09-01_100145.png

跟你的一样没错。再说了发票上也是这样的吧。要成后面这样也容易。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 10:27:06 | 显示全部楼层
1141429506 发表于 2017-9-1 09:59
=
请输入要转换打印的数:202
贰佰零拾贰圆

建议你用二楼的方式比较好。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 10:33:00 | 显示全部楼层
先写一个,待优化。
  1. def convert(num):
  2.     table1 = [ '零', "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
  3.     table2 = ['圆', '拾', '佰', '仟', '万', '拾', '佰', '仟']
  4.     flag = '' if num > 0 else '负'
  5.     num = abs(num)
  6.     numlist = [table1[int(i)] for i in str(num)[::-1]]
  7.    
  8.     zip1 = zip(numlist, table2)
  9.     str1= ''
  10.     for i, j in zip1:
  11.          str1 = i + j + str1
  12.     str1 = str1.replace('零仟', '零')
  13.     str1 = str1.replace('零佰', '零')
  14.     str1 = str1.replace('零拾', '零')
  15.     str1 = str1.replace('零万', '万')
  16.     while '零零' in str1:
  17.         str1 = str1.replace('零零', '零')
  18.     str1 = str1.replace('零万', '万零')
  19.     return flag + str1
  20.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 11:28:34 | 显示全部楼层
本帖最后由 ba21 于 2017-9-1 12:35 编辑
  1. def ConvertMoney(number):
  2.         # 判断 n 的正负和0
  3.         if number > 0:
  4.             flag=''
  5.         elif number == 0:
  6.             flag='零圆'
  7.         else:
  8.             flag='负'
  9.         number = abs(number)#取绝对值
  10.         
  11.         result = []
  12.         num = 0
  13.         numdict = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'}
  14.         unit = ['亿','仟','佰','拾','万','仟','佰','拾','圆']
  15.         temp = number
  16.         upnum = 0
  17.         while temp:
  18.                 num = temp%10
  19.                 temp //= 10               
  20.                 if num !=0:
  21.                     result.append(numdict[num]+unit.pop())
  22.                     upnum = 1
  23.                 else:
  24.                     if upnum: #上一位是否为0,True表示不为0
  25.                         result.append(numdict[num])
  26.                     if temp == number//10 or temp == number//100000: #个位数为0时 ,万位为0
  27.                         result.append(unit.pop())
  28.                     else:
  29.                         unit.pop()   
  30.                     upnum = 0
  31.         result.append(flag)
  32.         result.reverse()
  33.         return ''.join(result)

  34. while 1:
  35.     n = int(input("请输入要转换打印的数:"))   
  36.     print(ConvertMoney(n))

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 11:31:51 | 显示全部楼层
本帖最后由 瓦蓝 于 2017-9-1 11:46 编辑
  1. w,s='',''
  2. p,m=[],[]

  3. n = str(input("请输入要转换打印的数:"))
  4. t={'0':"零", '1':"壹", '2':"贰", '3':"叁", '4':"肆", '5':"伍", '6':"陆", '7':"柒", '8':"捌", '9':"玖"}
  5. u={0:'仟',1:'佰',2:'拾',3:''}
  6. unit=['圆','万','亿','万亿']
  7. for i in n:
  8.     s=s+t[i]
  9. while s:
  10.     m.append(s[-4:])
  11.     s=s[:-4]

  12. l=len(m)
  13. m[l-1]='{:零>4}'.format(m[l-1])
  14. for j in range(l):
  15.     for k in range(4):
  16.         w=w+m[j][k]+u[k]
  17.     p.append(w)
  18.     w=''
  19. for a in range(l):
  20.     p[a]=p[a]+unit[a]
  21. p.reverse()
  22. pl=''.join(p)

  23. for c in range(4):
  24.     pl=pl.replace('零零', '零')
  25.     pl=pl.replace('零万亿', '')
  26.     pl= pl.replace('零仟', '零')
  27.     pl= pl.replace('零佰', '零')
  28.     pl=pl.replace('零拾', '零')
  29.     pl=pl.replace('零万', '万')
  30.     pl=pl.replace('零亿', '亿')
  31.     pl=pl.replace('零圆', '圆')
  32. if pl[0]=='零':
  33.     pl=pl[1:]
  34. print(pl)
复制代码



最多支持16位数
QQ截图20170901114616.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 11:51:20 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-4 16:16:55 | 显示全部楼层

请输入要转换打印的数:100000000
壹亿万圆

应该是壹亿元
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-18 17:28:34 | 显示全部楼层
瓦蓝 发表于 2017-9-1 11:31
最多支持16位数

曾经帮我解决过问题的大佬,,再次求助一下您,,,我最近在学爬虫,,,可是学校没有这门课而且周围也没什么人学,,,所以有一个不情之请:那个,,方便加一下微信吗?有时会问你一些问题
微信号:zhenzhen11414
(备注一下瓦蓝:我就知道是你了)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-23 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表