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

实现代码:
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[i])
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[i])
End.append(UnitZ[b])
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基础教程书,没做到什么练习(看基础书好无聊啊),另一方面是现在在花时间学英语,还准备考个英语六级啊,最近一直在看英文小说,看完几个短篇的了,最近在看《傲慢与偏见》,加油啊!
Python学习之--数字转人民币读法(解决问题的方法很重要)的更多相关文章
- python学习之数字
数字python中的数字比较典型,典型在可以表示很小的数,也可以表示很大的数,c语言的数字类型如果表示很大的数的话,可能会报溢出错误,但是python不会,python 数字类型的完整工具包括整数和浮 ...
- Python学习day08-python进阶(2)-内置方法
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
- Python学习_02_数字和运算
python具有强大的科学运算功能,python由于支持更加强大的面向对象和动态特性,相比R语言.matlab.mathmatic等传统的科学计算工具具有非常大的优势. Python的数字 pytho ...
- Python学习笔记-数字,列表,元祖,切片,循环
数字 1,加减乘除:+,-,*,/ 2,平方:** 3,立方:**3 4,字符串转换:str(数字) 5,浮点数:带小数点 0.2 Python编程建议 import this >>&g ...
- 数字转人民币读法-python3
""" 2 把一个浮点数分解成证书备份和小数部分 3 """ 4 def divide(num): 5 intnum = int(num) ...
- Mooc中国大学Python学习笔记--数字类型及操作
整数类型 只需知道整数无限制,pow(),4进制表示形式 与数学中整数的概念一致 --可正可负,没有取值范限制 --pow(x,y)函数:计算x^y,想算多大算多大 -十进制:10 -二进制,以0b或 ...
- [Python学习笔记] 数字类型及操作
数字类型 整数类型 十进制:1110,-123 二进制:以0B或0b开头 0b110,-0B101 八进制:以0O或0o开头 0o123,-0O567 十六进制:以0X或0x开头 0x555,-0X8 ...
- Python学习笔记-数字类型
如何定义一个数字类型 定义var1为一个INT类型,所以在5/3 输出的是 1. var1 = 5 var1=var1/3 print var1 定义var1为一个INT类型,因为var1是INT类型 ...
- Python学习-猜数字游戏
菩萨蛮·黄鹤楼 茫茫九派流中国,沉沉一线穿南北.烟雨莽苍苍,龟蛇锁大江. 黄鹤知何去,剩有游人处.把酒酹滔滔,心潮逐浪高! --coding:UTF-8-- import random secret ...
随机推荐
- <数据分析>初级入门
1.何为数据分析? 数据分析是指用适当的统计方法对收集来的大量数据进行分析,将它们加以汇总和理解消化,以求最大化地开发数据的功能,发挥数据的作用. 直接的理解:提炼杂乱无章的数据背后的信息,总结出研究 ...
- LGP5495 Dirichlet 前缀和
题目 不是很明白为什么要叫做模板 考虑到\(a_i\)能对\(b_j\)产生贡献,当且仅当\(a_i=\prod p_k^{a_k},b_j=\prod p_k^{b_k},\forall k \ a ...
- nodejs和vuejs的关系
转自:https://blog.csdn.net/myKurt/article/details/79914078 nodejs类比Java中:JVM 详述: 就前端来说nodejs具有划时代的意义, ...
- 2019-5-21-Total-Commander-显示文件包含文件名扩展
title author date CreateTime categories Total Commander 显示文件包含文件名扩展 lindexi 2019-5-21 11:37:6 +0800 ...
- login-Linux必学的60个命令
1.作用 login的作用是登录系统,它的使用权限是所有用户. 2.格式 login [name][-p ][-h 主机名称] 3.主要参数 -p:通知login保持现在的环境参数. -h:用来向远程 ...
- uoj279 题目交流通道
题目:告诉你每两个点之间的最短路距离.构造每条边边权<=m的无向完全图.求有多少种不同边权的图满足最短路限制?n<=400. 标程: #include<cstdio> #inc ...
- Spring Boot 配置 Security 密码加密
依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...
- codevs1222 信与信封的问题
二分图匹配. 先匹配一次,一定是完美匹配.然后枚举每条边,去掉它,若是不能完美匹配,这条边就必须. #include<cstdio> #include<cstring> #in ...
- php链表笔记:单链表反转
<?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/1 * Time: 11:41 */ /** * 1.链表的反转 ...
- js获取网页屏高 屏宽
<SCRIPT LANGUAGE="JavaScript"> <!-- //document.body.scrollTop 滚动条的上端距离 //document ...