日常遇到的中文数字主要有两种情况:

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 将中文数字转换成阿拉伯数字的更多相关文章

  1. Python 3 实现数字转换成Excel列名(10进制到26进制的转换函数)

    背景: 最近在看一些Python爬虫的相关知识,讲爬取的一些数据写入到Excel表中,当时当列的数目不确定的情况下,如何通过遍历的方式讲爬取的数据写入到Excel中. 开发环境: Python 3  ...

  2. 在C#中将数字转换成中文

    上篇我们讲了在MSSQL中将数字转换成中文,这篇我们讲讲在C#中将数字转换成中文 下篇将讲一下如何将金额转换成中文金额,废话不多说,具体代码如下: /// <summary> /// 数字 ...

  3. js 将数字转换成中文大写

    //完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五. const toChinesNum = ...

  4. python中数字转换成字符串

    数字转换成字符串: num=123 str='%d' %num str就变成了"123"

  5. Python2.X如何将Unicode中文字符串转换成 string字符串

    Python2.X如何将Unicode中文字符串转换成 string字符串   普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:unicodestring = u&q ...

  6. C# 数字转换成汉字大写 数值转换成汉字大写

    1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...

  7. 比较java与c语言中数字转换成字符的不同

    java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...

  8. 算法--java实现将数字转换成人民币大写(迅雷面试题)

    今天去迅雷面试,是个数字转换成人民币的算法题: public class Rmb { /** * 人民币的基本信息和操作 * * @author soyoungboy * @version 1.0 * ...

  9. js字符串转换成数字与数字转换成字符串的实现方法

    转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...

  10. java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断

    题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...

随机推荐

  1. 2021年蓝桥杯python组真题-直线(细节+分析+代码)

    题目 : 代码: #直线 M=[[x,y] for x in range(20) for y in range(21)] #创建二维列表:代表xy坐标系 d=set() #创建集合属性的容器:因为集合 ...

  2. Centos 安装 python3.x 为默认

    CentOS 7 中默认安装了 Python,但是版本是2.x的,由于2020年python2.x将停止更新,因此需要将版本升级至3.x.但由于python2.x是系统集成的,很多命令都是要基于pyt ...

  3. Xcode编译流程

      Xcode的构建过程本质上是执行一系列构建任务.如:代码检测,编译代码,链接目标文件,拷贝资源(图片, plist, nib)文件,代码签名等.大部分任务是执行命令行工具,如(clang编译. l ...

  4. 解密Elasticsearch:深入探究这款搜索和分析引擎

    作者:京东保险 管顺利 开篇 最近使用Elasticsearch实现画像系统,实现的dmp的数据中台能力.同时调研了竞品的架构选型.以及重温了redis原理等.特此做一次es的总结和回顾.网上没看到有 ...

  5. 18年CCCC赛后总结

    C4赛后总结: 我正式入坑以来,大约5个月,这也是我第一次出去参与这样正式的比赛,其实比赛结果并不尽人意,但有很多还是需要记录下来的,通过这次比赛的确获得了很多的比赛经验: 一赛前: 其实赛前的状态, ...

  6. 2021-02-01:Redis 集群会有写操作丢失吗?

    福哥答案2021-02-01: 以下情况可能导致写操作丢失:1.过期 key 被清理.2.最大内存不足,导致 Redis 自动清理部分 key 以节省空间.3.主库故障后自动重启,从库自动同步.4.单 ...

  7. 2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。返回最大的异或结果。

    2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大.返回最大的异或结果. 福大大 答案2021-05-14: 前缀树.一个数,用二进制表示,0走左边分支,1走右边分支.准备 ...

  8. 2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回。已知二叉树中没有重复值。

    2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回.已知二叉树中没有重复值. 福大大 答案2021-08-01: 先序遍 ...

  9. 2021-09-01:三数之和。给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    2021-09-01:三数之和.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. ...

  10. rust 中 str 与 String; &str &String

    String String 类型的数据和基本类型不同,基本类型的长度是固定的,所以可以在栈上分配,而String类型是变长的,所以需要在堆上分配,所以String 类型实际上是一个指向堆的指针.他的结 ...