python 将中文数字转换成阿拉伯数字
日常遇到的中文数字主要有两种情况:
1.“二零零一”这种类型,只包含[0-9]对应的十个中文字,需要转换成数字:2001。这种情况的转换十分简单。
2. “三百二十一”这种类型,还有“十百千万亿……”等汉字,需要转换成数字:321,这种情况比较复杂。
思考:
1. “四千三百二十一”,即万以内的数字,转换的思路是:4*1000+3*100+2*10+1
2. “四千三百二十一万”,转换的思路是:(4*1000+3*100+2*10+1)*10000 。
3. 通过递归,依次对字符串兆、亿、万前后切片,并作相应处理。
测试结果:
1. “四万万”,错误转换成了“5,0000”.可以修改程序解决,但是没什么必要,因为日常很少这样使用。
2. “二百五”是“250”,但是程序会转换成205。这个可以修改程序完全解决的。但是还没改。
3.除了上面说的情况,没看到其他什么问题。
1 # 中文数字包含的汉字与其对应的阿拉伯数字构成的字典。字典也可以进一步扩展为支持伍、陆、柒这些汉字
2 dic = {"〇":0,"零":0,"一":1,"么":1,"二":2,"两":2,"三":3,"四":4,"五":5,"六":6,"七":7,"八":8,"九":9,"十":10,"百":100,"千":1000,"万":10000,"亿":100000000,"兆":1000000000000}
3
4 def chi_num(text):
5 if len(text) == 0:
6 result = 0
7 # 如果字符串和"十百千万亿兆"没有并集,直接简单转换
8 elif len(set(text).intersection("十百千万亿兆")) == 0:
9 result = simply_convert(text)
10 # 以“兆”字为分隔点,将字符串切割成两个字符串组成的列表,注意列表中的字符串可能为空
11 elif "兆" in text:
12 # 兆、亿、万在字符串一般最多出现一次。特殊情况,比如"四万万",会转换错误
13 text = text.split(sep="兆",maxsplit=1)
14 # 如果text=['','']需要返回1*dic['兆']
15 result = max(decwise_add(text[0]),1)*dic["兆"] + chi_num(text[1])
16 elif "亿" in text:
17 text = text.split(sep="亿",maxsplit=1)
18 result = max(decwise_add(text[0]),1)*dic["亿"] + chi_num(text[1])
19 elif "万" in text:
20 text = text.split(sep="万",maxsplit=1)
21 result = max(decwise_add(text[0]),1)*dic["万"] + chi_num(text[1])
22 else:
23 result = decwise_add(text)
24 return result
25
26 def simply_convert(text):
27 result=""
28 for i in text:
29 result += str(dic[i])
30 return int(result)
31
32 # 一万以内的数字(比如“一千二百三十四“)通过"1*1000+2*100+3*10+4"这样的方式进行转换
33 def decwise_add(text):
34 #将字符串中的每个汉字转换成对应的阿拉伯数字
35 temp=[dic[i] for i in text]
36 result=0
37 for i in range(len(temp)):
38 if (temp[i]>9) and (i>0):
39 temp[i]*=temp[i-1]
40 temp[i-1] =0
41 for i in temp:
42 result+=i
43 return result
44
45 if __name__ == '__main__':
46
47 test_num= ['四万万',
48 '十',
49 '百',
50 '千',
51 '万',
52 '百万',
53 '亿',
54 '十亿',
55 '兆',
56 '千兆',
57 '么么零',
58 '九么么',
59 '一九八九',
60 '二〇二三',
61 '九',
62 '十一',
63 '一百二十三',
64 '一千二百零三',
65 '一万一千一百零一',
66 '十万零三千六百零九',
67 '一百二十三万四千五百六十七',
68 '一千一百二十三万四千五百六十七',
69 '一亿一千一百二十三万四千五百六十七',
70 '一百零二亿五千零一万零一千零三十八',
71 '一千一百一十一亿一千一百二十三万四千五百六十七',
72 '一兆一千一百一十一亿一千一百二十三万四千五百六十七',
73 ]
74 import re
75 # 每四位数字添加一个逗号分隔符
76 def formatNum(num):
77 num=str(num)
78 pattern=r'(\d+)(\d{4})((,\d{4})*)'
79 while True:
80 num,count=re.subn(pattern,r'\1,\2\3',num)
81 if count==0:
82 break
83 return num
84 for i in test_num:
85 print(formatNum(chi_num(i)),"----",i)
输出内容:
5,0000 ---- 四万万
10 ---- 十
100 ---- 百
1000 ---- 千
1,0000 ---- 万
100,0000 ---- 百万
1,0000,0000 ---- 亿
10,0000,0000 ---- 十亿
1,0000,0000,0000 ---- 兆
1000,0000,0000,0000 ---- 千兆
110 ---- 么么零
911 ---- 九么么
1989 ---- 一九八九
2023 ---- 二〇二三
9 ---- 九
11 ---- 十一
123 ---- 一百二十三
1203 ---- 一千二百零三
1,1101 ---- 一万一千一百零一
10,3609 ---- 十万零三千六百零九
123,4567 ---- 一百二十三万四千五百六十七
1123,4567 ---- 一千一百二十三万四千五百六十七
1,1123,4567 ---- 一亿一千一百二十三万四千五百六十七
102,5001,1038 ---- 一百零二亿五千零一万零一千零三十八
1111,1123,4567 ---- 一千一百一十一亿一千一百二十三万四千五百六十七
1,1111,1123,4567 ---- 一兆一千一百一十一亿一千一百二十三万四千五百六十七
python 将中文数字转换成阿拉伯数字的更多相关文章
- Python 3 实现数字转换成Excel列名(10进制到26进制的转换函数)
背景: 最近在看一些Python爬虫的相关知识,讲爬取的一些数据写入到Excel表中,当时当列的数目不确定的情况下,如何通过遍历的方式讲爬取的数据写入到Excel中. 开发环境: Python 3 ...
- 在C#中将数字转换成中文
上篇我们讲了在MSSQL中将数字转换成中文,这篇我们讲讲在C#中将数字转换成中文 下篇将讲一下如何将金额转换成中文金额,废话不多说,具体代码如下: /// <summary> /// 数字 ...
- js 将数字转换成中文大写
//完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五. const toChinesNum = ...
- python中数字转换成字符串
数字转换成字符串: num=123 str='%d' %num str就变成了"123"
- Python2.X如何将Unicode中文字符串转换成 string字符串
Python2.X如何将Unicode中文字符串转换成 string字符串 普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:unicodestring = u&q ...
- C# 数字转换成汉字大写 数值转换成汉字大写
1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...
- 比较java与c语言中数字转换成字符的不同
java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...
- 算法--java实现将数字转换成人民币大写(迅雷面试题)
今天去迅雷面试,是个数字转换成人民币的算法题: public class Rmb { /** * 人民币的基本信息和操作 * * @author soyoungboy * @version 1.0 * ...
- js字符串转换成数字与数字转换成字符串的实现方法
转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...
- java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断
题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...
随机推荐
- Kubernetes入门实践(YAML)
YAML是Kubernetes的标准工作语言 YAML介绍 Kubernetes使用了YAML语言一个非常关键的特性,叫作"声明式",对应的有另外一个词: "命令式&qu ...
- Docker应用部署(Nginx、Tomcat)
Docker hub官方链接: https://hub.docker.com 部署Nginx 官方已经给出了方法: https://hub.docker.com/_/nginx 运行容器 $ dock ...
- 一个可用于生产项目 基于 .NET 6 自研ORM
Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...
- 【Visual Leak Detector】源码编译 VLD 库
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇介绍 VLD 源码的编译.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. VLD 库的依赖文件 2. 源码 ...
- 面试最常问的数组转树,树转数组 c++ web框架paozhu实现
刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这 ...
- cryptohack wp day(3)
第二节模运算----第一题( GCD ) 在做这道题前,了解下欧几里得算法: 欧几里得算法,也叫辗转相除法,用于求解两个非负整数a和b的最大公约数(Greatest Common Divisor, G ...
- 原来Spring能注入集合和Map的computeIfAbsent是这么好用!
大家好,我是3y,今天继续来聊我的开源项目austin啊,但实际内容更新不多.这文章主是想吹下水,主要聊聊我在更新项目中学到的小技巧. 今天所说的小技巧可能有很多人都会,但肯定也会有跟我一样之前没用过 ...
- TCP/IP网络模型
在网络模型中有分为7层模型(OSI模型)和5层模型和TCP/IP模型 OSI模型将应用层和表示层作为独立的两层,而TCP/IP模型将它们合并为一个应用层. 两种对比来说,TCP/IP模型更符合实际开发 ...
- CD的认知与学习
cd命令的作用 ●ls可以理解成当前而cd是切换到那一层 ls查看当前目录下的所有文件(不包含隐藏): ls /查看/下的所有文件 cd 切换到哪个文件下 pwd命令的作用 通过ls来验证当前的工作目 ...
- 2022-06-30:以下golang代码输出什么?A:0;B:2;C:运行错误。 package main import “fmt“ func main() { ints := make
2022-06-30:以下golang代码输出什么?A:0:B:2:C:运行错误. package main import "fmt" func main() { ints := ...