这绝对是个非常有趣的问题哈哈,但用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)相关推荐

  1. php 将数字转为大写,将数字小写转为大写 php

    将数字小写转为大写,这原来是一个类,我改写为一个函数.修复和增加了其中一些在实际工作中需要的功能.使其更加全面.100%可用. function change_num($num) { $d = arr ...

  2. EXCEL文本函数-数字小写换大写-英文大小写互换

    EXCEL中数字小写换大写方法一: 在单元格A2中输入小写数字123.12 B2处输入以下公式 =SUBSTITUTE(SUBSTITUTE(IF(A2<0,"负",&quo ...

  3. el-table合计行合并单元格并将数字小写转大写

    <el-table:data="billDetailsData"bordershow-summaryid="gy-table":summary-metho ...

  4. python将数字转变为中文读法-Python转换数字到中文大写格式

    今天有人在群里问到Python怎么把小写数字转换成中文的大写字符,觉得这个问题很有趣,于是想了一下,就开始写代码了. 以下是代码,感觉不足的地方就是如果是1001元,那么就会转换成 壹仟零佰零拾壹圆, ...

  5. python数字转汉字-Python转换数字到中文大写格式

    今天有人在群里问到Python怎么把小写数字转换成中文的大写字符,觉得这个问题很有趣,于是想了一下,就开始写代码了. 以下是代码,感觉不足的地方就是如果是1001元,那么就会转换成 壹仟零佰零拾壹圆, ...

  6. Python将数字转换成大写字母

    一.功能描述 实现类似 Excel 中的列序号功能. 二.代码 def getChars(length):return [getChar(index) for index in range(lengt ...

  7. php 数字小写转大写,php将金钱小写数字转为金钱大写的方法

    function change_num($num) { $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $e = array('元','拾', ...

  8. excel小写变大写技巧

    我们使用excel表格技巧来小写变大写,一般分为将字母小写变大写,另外一种是将数字小写变大写.对Excel感兴趣的朋友可加Excel学习交流群:284029260 下面分别介绍这两种情况: excel ...

  9. javascript数字转中文大写

    js 数字小写转大写 背景 js实现数字转大写 背景 有时候业务需要做大写[一二三四五六七八九十]的标题,那对于js普通的数据结构排序是按[0123456789].所以我们需要做一些数字的转换,实现小 ...

最新文章

  1. 计算机应用看法,对计算机应用教学方法改革的看法
  2. 论文排版中页码的设置方法
  3. mysql cluster 设置单向复制_mysql5.6做单向主从复制Replication
  4. 完整的url以及同源跨域处理
  5. Go 之父:聊聊我眼中的 Go 语言和环境
  6. [EDA]FPGA/CPLD 设计流程步骤及步骤概念
  7. 嵩天python爬虫_我自己爬-python爬虫快速入门(一)
  8. python有什么用途视频_使用Python管理多平台视频流的最佳方法是什么?
  9. springboot aop记录日志
  10. Web安全之跨站脚本攻击(XSS)
  11. PetShop之业务逻辑层设计
  12. mysql 绑定 cpu 节点_MySQL Cluster(MySQL集群)配置
  13. Redis系列(三)-Redis发布订阅及客户端编程
  14. java lbs_在 Java 中利用 redis 实现 LBS 服务
  15. 用于jqGrid获取SQL Server中数据的简单分页存储过程及sp_executesql的一点使用方法...
  16. 读书笔记 effective c++ Item 26 尽量推迟变量的定义
  17. Win10 安装MySQL(解压版)
  18. php是单进程语言,但是也有办法支持多进程
  19. 部署企业级项目管理系统(蝉道)
  20. 《学习笔记》面向对象(四)多态,instanceof关键字,抽象

热门文章

  1. Java用spring boot对接第三方企业微信
  2. 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?
  3. 基于 Sodor 的矩阵乘法加速器设计之C++
  4. php中的$_REQUEST是什么意思
  5. win10 无法打开计算器 显示需要打开新的应用
  6. 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)
  7. Vue.nextTick进阶分析
  8. RKMEDIA--VP使用
  9. Golang分布式应用之etcd
  10. 视频怎么加水印,视频加水的快速方法