Python实现数字小写转大写(just for fun)
这绝对是个非常有趣的问题哈哈,但用python列表实现就变得比较烧脑,正常人不会非常较真这样的程序,我也只是闲来无事,如果代码还是有bug,那么我也没办法。
注:经过广泛搜索和仔细深究,似乎没有几套开源代码能100%满足要求
参考标准:大小写转换器_人民币大写在线转换工具
代码实现
首先将一个数字根据小数点,进行分割。建立字典和数据集(left_chinese, right_chinese),这里left_chinese不加元,是因为后面可以统一处理,避免庸人自扰。
def Digital_to_Chinese(digital):if not isinstance(digital, str): # 首先将内容转换为浮点数str_digital = str(digital)else:str_digital = digitalprint("小写数字", digital)chinese = {'1': '壹', '2': '贰', '3': '叁','4': '肆', '5': '伍', '6': '陆','7': '柒', '8': '捌', '9': '玖', '0': '零'}left_chinese = ['', '拾', '佰', '仟', '万'] # 小数点左边right_chinese = ["角", "分"] # 小数点右边left_Str, right_Str = "", "" # 根据小数点将浮点数分成整数小数两部分if '.' in str_digital:left_Str, right_Str = str_digital.split('.')else:left_Str = str_digital # 没有的话就直接都是整数部分leftStrArr = [] # 处理整数部分
将左边数字从高位向低位读取,再翻转——即从低向高。之后,把每个数字对应的权重附在数字后面(empty, 拾, 佰, 仟, 万),同样的思路也适用于右半块数字。
if left_Str:leftStrArr = [chinese[v] for v in left_Str] # 使用列表推导式获取大写中文列表leftStrArr.reverse() # 由于数字是从前到后读,所以从低位向高位转换需要倒置列表for i in range(0, len(leftStrArr)):if leftStrArr[i] != "零": # 只要这一位不是0,就在后面赋值他对应的权重,如果为0则i自增1将其略过leftStrArr[i] += left_chinese[i]leftStrArr.reverse()rightStrArr = [] # 处理小数部分if right_Str:rightStrArr = [chinese[v] for v in right_Str]for i in range(0, len(rightStrArr)):if rightStrArr[i] != "零":rightStrArr[i] += right_chinese[i] # 和前面一样的道理
之后,我们需要进行二次处理,首先刚刚那样的算法会多输出0,比如 2001 会被写成 两仟零零壹,针对这个问题我们可以直接去重处理,这里注意,101是不会被去除的,因为那是[壹佰,零,壹],所以不会被去重。
但这并不完美,因为还会有这样的问题:10 会被写成 壹拾零,解决方法是判断末尾字符是否为零,是则删去不是则跳过。
此外,由于正常的计费只到“分”,所以右半部分正常情况下不需要过多的处理,因此代码就写完了。
leftStrArr_temp = []for xleft in leftStrArr:if xleft not in leftStrArr_temp: # 去重,防止出现 xx零零xxleftStrArr_temp.append(xleft)leftStrArr_temp.reverse()for temp in leftStrArr_temp: # 去掉末尾的零if temp == "零":leftStrArr_temp.remove(temp)else:breakleftStrArr_temp.reverse()print("------\n左", ''.join(leftStrArr_temp))rightStrArr_temp = []for xright in rightStrArr:if xright not in rightStrArr_temp:rightStrArr_temp.append(xright)print("右", ''.join(rightStrArr_temp))return ''.join(leftStrArr_temp) + "元" + ''.join(rightStrArr_temp) # 将列表合并成一个字符串,作为结果返回
测试
# test = input("请输入测试用例:")
test_list = [1, 1.1, 11.01, 10.10, 10.01, 101.01, 2300.02, 34004.09]
for test in test_list:print("结果", Digital_to_Chinese(test), "\n------\n")
这个测试应该没有问题,整数部分的高位可以直接加在列表中,低位部分各位可以自行完善。结果如下:
小写数字 | 左串 | 右串 | 结果 |
1 | 壹 | 空 | 壹元 |
1.1 | 壹 | 壹角 | 壹元壹角 |
11.01 | 壹拾壹 | 零壹分 | 壹拾壹元零壹分 |
10.1 | 壹拾 | 壹角 | 壹拾元壹角 |
10.01 | 壹拾 | 零壹分 | 壹拾元零壹分 |
101.01 | 壹佰零壹 | 零壹分 | 壹佰零壹元零壹分 |
2300.02 | 贰仟叁佰 | 零贰分 | 贰仟叁佰元零贰分 |
34004.09 | 叁万肆仟零肆 | 零玖分 | 叁万肆仟零肆元零玖分 |
Python实现数字小写转大写(just for fun)相关推荐
- php 将数字转为大写,将数字小写转为大写 php
将数字小写转为大写,这原来是一个类,我改写为一个函数.修复和增加了其中一些在实际工作中需要的功能.使其更加全面.100%可用. function change_num($num) { $d = arr ...
- EXCEL文本函数-数字小写换大写-英文大小写互换
EXCEL中数字小写换大写方法一: 在单元格A2中输入小写数字123.12 B2处输入以下公式 =SUBSTITUTE(SUBSTITUTE(IF(A2<0,"负",&quo ...
- el-table合计行合并单元格并将数字小写转大写
<el-table:data="billDetailsData"bordershow-summaryid="gy-table":summary-metho ...
- python将数字转变为中文读法-Python转换数字到中文大写格式
今天有人在群里问到Python怎么把小写数字转换成中文的大写字符,觉得这个问题很有趣,于是想了一下,就开始写代码了. 以下是代码,感觉不足的地方就是如果是1001元,那么就会转换成 壹仟零佰零拾壹圆, ...
- python数字转汉字-Python转换数字到中文大写格式
今天有人在群里问到Python怎么把小写数字转换成中文的大写字符,觉得这个问题很有趣,于是想了一下,就开始写代码了. 以下是代码,感觉不足的地方就是如果是1001元,那么就会转换成 壹仟零佰零拾壹圆, ...
- Python将数字转换成大写字母
一.功能描述 实现类似 Excel 中的列序号功能. 二.代码 def getChars(length):return [getChar(index) for index in range(lengt ...
- php 数字小写转大写,php将金钱小写数字转为金钱大写的方法
function change_num($num) { $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $e = array('元','拾', ...
- excel小写变大写技巧
我们使用excel表格技巧来小写变大写,一般分为将字母小写变大写,另外一种是将数字小写变大写.对Excel感兴趣的朋友可加Excel学习交流群:284029260 下面分别介绍这两种情况: excel ...
- javascript数字转中文大写
js 数字小写转大写 背景 js实现数字转大写 背景 有时候业务需要做大写[一二三四五六七八九十]的标题,那对于js普通的数据结构排序是按[0123456789].所以我们需要做一些数字的转换,实现小 ...
最新文章
- 计算机应用看法,对计算机应用教学方法改革的看法
- 论文排版中页码的设置方法
- mysql cluster 设置单向复制_mysql5.6做单向主从复制Replication
- 完整的url以及同源跨域处理
- Go 之父:聊聊我眼中的 Go 语言和环境
- [EDA]FPGA/CPLD 设计流程步骤及步骤概念
- 嵩天python爬虫_我自己爬-python爬虫快速入门(一)
- python有什么用途视频_使用Python管理多平台视频流的最佳方法是什么?
- springboot aop记录日志
- Web安全之跨站脚本攻击(XSS)
- PetShop之业务逻辑层设计
- mysql 绑定 cpu 节点_MySQL Cluster(MySQL集群)配置
- Redis系列(三)-Redis发布订阅及客户端编程
- java lbs_在 Java 中利用 redis 实现 LBS 服务
- 用于jqGrid获取SQL Server中数据的简单分页存储过程及sp_executesql的一点使用方法...
- 读书笔记 effective c++ Item 26 尽量推迟变量的定义
- Win10 安装MySQL(解压版)
- php是单进程语言,但是也有办法支持多进程
- 部署企业级项目管理系统(蝉道)
- 《学习笔记》面向对象(四)多态,instanceof关键字,抽象