Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 607|回复: 0

Python学习之--数字转人民币读法(解决问题的方法很重要)

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-21 06:19:51 | 显示全部楼层 |阅读模式

    效果图:

    实现代码:

    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)
    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)
    End.append(UnitZ)
    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基础教程书,没做到什么练习(看基础书好无聊啊),另一方面是现在在花时间学英语,还准备考个英语六级啊,最近一直在看英文小说,看完几个短篇的了,最近在看《傲慢与偏见》,加油啊!
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

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

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 11:35 , Processed in 0.067366 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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