一、背景

刚刚囫囵吞枣地学习完了python的基础语言,自己想尝试一下利用python解决一下生活中的实际问题,便尝试解决这个小写金额转大写。感兴趣的也可以尝试一下,不知道是不是我太菜了,捣鼓了蛮久的。

二、小写数字转大写的规则

1.中文大写金额数字应用正楷或行书填写,如壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整(正)等字样。

2.中文大写金额数字到"元"为止的,在"元"之后,应写"整"(或"正")字,在"角"之后,可以不写"整"(或"正")字。大写金额数字有"分"的,"分"后面不写"整"(或"正")字。

3.中文大写金额数字前应标明"人民币"字样,大写金额数字有"分"的,"分"后面不写"整"(或"正")字。

4.由于规则中存在一些“或”,这样不明确的不好写程序,所以将规则明确为:用“整”字;没有角或分写“整”字,这个“人名币”就不写了,我觉得我用不上美元。

三、思路

1.将用户输入的数字每一个对应翻译出它的汉字名称以及单位。

对应翻译
1 2 3 4 .5 6

2.这样对应翻译存在的问题

(1)加不加“整”的问题

(2)读“角”和“分”的问题

(3)有0怎么办,如101、100001、1000000000、1000000001、100、0、0.01、0.1等。

“零”的问题的规律是:有零要读零的;连续多个0只读一个“零”;万位,元位是0,或者数字连续为0,万位和元位为0,但千位,角位不是0,可以只写一个零。

(4)有0时有的单位要读,有的单位不用读。

3.解决思路:将小数部分和整数部分先分开。整数部分将各位的数字转换的汉字放在一个列表,删除掉不该存在的零得到列表A(不应该是删除,是将该位置变成空字符串''),数字对应的位名称翻译后放在另外一个列表,删除不该存在的位名称得到列表B(将该位置变成空字符串''),将A列表和B列表每一位的大写汉字和位名称组合起来。小数部分如果小数部分为零,直接最后加个整;如果角位为0,分不为0应该读零几分;如果角位不为0,分为0,读几角整;如果角位不为0,分不为0读几角几分。最后将整数部分和小数部分结合起来。

四、python实现过程

1.让用户可以知道功能

print('你好,本程序可以将数字金额转化为人名币大写!')
print('----------------------------------------------')

2.编写主函数

def main():number = 0number = input('请输入您要转换的数字金额(如3.33,36,100.1):')try:if number is int or float:zhuanhuan(number)except:choice = input('您输入的有误或数字过大,是否重新输入y/n:')if choice == 'y':print('----------------------------------------')main()c = input('是否继续转换?y/n:')if c == 'y':print('---------------------------------------------')main()

3.编写转换大小写的函数

(1)将要用到的小写数字与其对应的汉字保存到字典中。

(2)将单位保存到列表中

def zhuanhuan(n):lst_daxie = {'0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌','9': '玖'}# 2.创建一个列表存放整数部分相应的名称lst_word_zhengshu = ["元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"]# 3.创建一个列表存放小数部分的名称lst_word_xiaoshu = ['角', '分']

(3)将主函数中得到的数字转换为整数与小数两部分

    # 输入一个数,并分为整数和小数两部分number = float(n)  # 输入一个数字number = ('%.2f' % number)  # 对输入的数字进行保留两位小数处理depart = str(number).split('.')  # 先将浮点数转为字符串类型,再以“.”为分隔符分开zhengshu_part = depart[0]  # 整数部分xiaoshu_part = depart[1]  # 小数部分# print(zhengshu_part)  # 测试整数部分结果# print(xiaoshu_part)  # 测试小数部分结果

(4)将整数转化为大写

    # 将整数部分转化为大写length = len(zhengshu_part)fenjikuai = length // 4kaitou = length % 4if length % 4 == 0:kaitou = 4res = []  # res用于存放转换的结果lst_number = [i for i in zhengshu_part]  # 将数字存储在列表中# print(lst_number)  # 测试看存储数字的列表lst_hanzi = []  # 生成一个用于放汉字的列表for i in zhengshu_part:lst_hanzi.append(lst_daxie[i])# print(lst_hanzi)  # 检测看放汉字的列表是否成功放进汉字lst_weimingcheng = []  # 生成一个用于放位名称的列表for i in range(length):lst_weimingcheng.insert(0, lst_word_zhengshu[i])# print(lst_weimingcheng)  # 检测列表lst_cunfang_0_deweizhi = []  # 生成存放0的位置的列表for i in range(length):if lst_number[i] == '0':lst_cunfang_0_deweizhi.append(i)# print(lst_cunfang_0_deweizhi)  # 检测存放0的位置的列表# 删掉不该存在的位名称,删掉是将该列表元素用空字符串即代替for i in lst_cunfang_0_deweizhi:if lst_weimingcheng[i] != '元' and lst_weimingcheng[i] != '万' and lst_weimingcheng[i] != '亿':lst_weimingcheng[i] = ''  # 如果位名称为拾仟佰时其对应的数字为0,删除位名称elif lst_weimingcheng[i] == '万':  # ‘元’和‘亿’对应的数字位0时,位名称肯定保留,但为万时,如果为万亿的万应该保留,如果为万元的万时且其千万百万十万都为0,此时应该删除万。if lst_weimingcheng[i + 4] == '元':if '亿' in lst_weimingcheng:if lst_number[i - 1] == lst_number[i - 2] == lst_number[i - 3] == 0:lst_weimingcheng[i] = ''if zhengshu_part == '0':lst_weimingcheng = ['']# print('删除不正确的位名称后', lst_weimingcheng)# 删掉整数不该存在的零for i in lst_cunfang_0_deweizhi:if lst_weimingcheng[i] == '元' or lst_weimingcheng[i] == '万' or lst_weimingcheng[i] == '亿':lst_hanzi[i] = ''if i + 1 < length:  # 避免出现删选大于列表范围if lst_hanzi[i + 1] == '零':  # 当出现零以后,如果下一位也是零则可以删除本位的零lst_hanzi[i] = ''if zhengshu_part == '0':lst_hanzi = ['']# print('删除不正确零', lst_hanzi)

(5)将小数部分转化为大写

    # 处理小数部分的情况lst_xiaoshu_res = []if xiaoshu_part == '00':lst_xiaoshu_res.append('整')  # 如果小数部分为零,直接最后加个整if xiaoshu_part[0] == '0' and xiaoshu_part[1] != '0':  # 如果角位为0,分不为0if zhengshu_part == '0':lst_xiaoshu_res.append(lst_daxie[xiaoshu_part[1]] + '分')else:lst_xiaoshu_res.append('零' + lst_daxie[xiaoshu_part[1]] + '分')if xiaoshu_part[0] != '0' and xiaoshu_part[1] == '0':  # 如果角位不为0,分为0lst_xiaoshu_res.append(lst_daxie[xiaoshu_part[0]] + '角整')if xiaoshu_part[0] != '0' and xiaoshu_part[1] != '0':  # 如果角位不为0,分不为0lst_xiaoshu_res.append(lst_daxie[xiaoshu_part[0]] + '角' + lst_daxie[xiaoshu_part[1]] + '分')# print(lst_xiaoshu_res)

(6)将整数与小数结合,输出结果

    # 将转换的结果合成到一起for i in range(length):res.append(lst_hanzi[i])res.append(lst_weimingcheng[i])res.append(lst_xiaoshu_res[0])if number == '0.00':res = ['零元整']print('转换为人名币大写金额为:', ''.join(res))

(7)让程序以主函数运行

if __name__ == '__main__':main()

(8)实验一下

五、补充分享

1.感觉这个问题到最后就成了一个逻辑问题,我不知道我的逻辑思路是不是最简单的。而且我这个转换的是有长度限制的,最多读到千万亿位。

2.其实Excel就可以实现金额小写转换为大写,我只是把这条路自己走一遍。

3.现在的金额大写来源(网上找的哦):大写金额数字的使用始于明朝。朱元璋因为当时的一件重大贪污案“郭桓案”而发布法令,其中明确要求记账的数字必须由“一、二、三、四、五、六、七、八、九、十、百、千”改为“壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰(陌)、仟(阡)”等复杂的汉字,用以增加涂改帐册的难度。后来“陌”和“阡”被改写成“佰、仟”,并一直使用至今。

python学完基础后实践练习:阿拉伯数字金额转人名币大写相关推荐

  1. 学完python基础后应该学什么专业_小白刚入门Python,学完基础后,接下来的学习步骤!...

    需要多长时间来学习Python自学?如果是自学,学习python从零基础,这将需要大约半年到一年半的时间,这取决于每个人的理解.当然,如果你有其他编程语言的经验,开始比较快.大约需要2 ~ 3个月用P ...

  2. python自学步骤-小白刚入门Python,学完基础后,接下来的学习步骤!

    自学Python要学多久可以学会? 如果是自学,从零基础开端学习python的话,按照每个人理解能力的不同,大致上需求半年到一年半左右的时刻,当然,如果有其它编程言语的经历,入门还是比较快的,大概需求 ...

  3. 学python先学什么基础_python学完基础学什么

    相信一个python的初学者一定已经学完了基础的编程知识,和其他编程语言差不多,基础的数据类型.判断.循环.函数,或许你还学了面向对象.然而,当你学完这些后,或许一本python的入门书籍你已经学完了 ...

  4. python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议

    原标题:学员 | 斥巨资学完数据分析后,给大家总结了7个小建议 写在前面 各位小灶er,大家好,我是人见人爱还会卖课的coco姐,数据分析课程上线大半年了,很多同学还在观望:这个课程是否适合自己呢?非 ...

  5. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  6. python学完可以干啥-Python学完可以做什么

    原标题:Python学完可以做什么 人工智能近年来极其火热,就业前景非常乐观,众多互联网企业兴起,越来越多的传统行业也开始使用人工智能分析,我们从招聘网站上面就可以看得出,人工智能相关的岗位越来越吃香 ...

  7. 学完Java后找工作难吗?需要满足什么条件?

    在如今互联网快速发展的背景下,我国Java开发产业尤其是移动互联网发展迅速.国内软件行业目前人才需求量高,企业求贤若渴,在企业需求的推动下 Java开发者的工资也在不断上涨.学完Java后好找工作的依 ...

  8. Java学完基础语法之后,应该学什么?

    学习Java对于刚刚开始接触的人来说,通常都是比较懵的,计算机语言都很复杂,学习需要系统化,流程化的一步步来.许多人刚刚开始学习Java不知道先学什么?这里可以明确告诉大家,先学基础语法是肯定没错的, ...

  9. 学完HTML5后可以开发哪些互联网产品呢?

    随着HTML5开发的火热,如今国内各行业都开始进入HTML5领域,抢占红利,造就了职场新贵,HTML5开发成了一轮企业热招岗位.那么,学完HTML5后可以开发哪些互联网产品呢?接下来小千先来简单介绍下 ...

  10. Python学完之后从业情况怎么样?

    有打算学习Python的同学会问,Python学完之后从业情况怎么样?薪资待遇怎样?就Python的职业发展方向,这里小千简单的做一些分析,给大家提供一些参考. 1.Linux运维工程师 这个职位主要 ...

最新文章

  1. Maven settings.xml配置详解
  2. Linux 批量依赖库拷贝(ldd)
  3. [LeetCode] Reverse Linked List II
  4. gradle之gradlew最全指令攻略
  5. java swing列表数据加监听,【Java Swing公开课|Java监听列表项选择事件怎么用,看完这篇文章你一定就会了】- 环球网校...
  6. php自动加载基类文件
  7. Flutter MaterialButton 实现圆角边框按钮
  8. 接口、抽象类、类之间的关系
  9. 12月数据库榜单,整体排名稳定如昨,Oracle 分数接连下降
  10. keil窗口显示不全_使用Keil语言的嵌入式C编程教程(下)
  11. 计算机丨浏览器访问出现DNS_PROBE_POSSIBLE解决方法
  12. linux通过usb链接网络,Nokia N9 通过USB连接使用PC(Linux)主机的网络
  13. php超小免杀大马_php大马免杀技巧 | bypass waf
  14. 云在脚下 三大云存储方案对比与选型指导
  15. zzuli oj 1077
  16. android 外边距,外边距(padding)重叠的及解决办法
  17. TortoiseSVN文件夹及文件图标不显示解决方法
  18. 中国石油大学《高等数学二》第二次在线作业
  19. 人机交互与计算机科学,阐述人机交互方式的变革引领计算机科学的发展
  20. 数学建模用python好吗_用 Python 做数学建模

热门文章

  1. 文件打开模式r,w,a,r+,w+,a+的区别和联系
  2. 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:4.工厂模式之工厂方法模式
  3. 一北大毕业生的返乡报告:家乡面目全非 备感无力
  4. 泛微OA流程中如何引用自开发的JS
  5. 企业邮箱收发信息服务器怎么设置,企业邮箱服务器如何配置POP3和SMTP?
  6. curl 命令详解(超详细)
  7. Tether市值十月下跌超过10亿美元
  8. SQL Server Management Studio(SSMS)对象资源管理器的使用以及查询分析器的使用
  9. 百度网盘里的html怎么用,百度网盘怎么用?
  10. IP地址冲突的原因及其解决方法