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

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. Lexicographic Order

    Lexicographic Order (https://codeforces.com/group/L9GOcnr1dm/contest/422381/problem/L) 比较简单的一道题目,主要理 ...

  2. 【vue3-element-admin】ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范

    前言 本文介绍 vue3-element-admin 如何通过ESLint 检测 JS/TS 代码.Prettier 格式化代码.Stylelint 检测 CSS/SCSS 代码和配置 EditorC ...

  3. BAT 基础语法

    命令 //功能 echo //标准输出命令 在CMD窗口中 显示echo 后的内容 @ //关闭当前行的 回显    回显:源代码在 CMD 窗口中再次显示 pasue     // 暂停程序 的执行 ...

  4. 宝塔ftp无法连接的解决方案

    宝塔面板现在使用率非常的高.今天把自己的踩坑处理方法记录一下. 在配置号宝塔面板ftp后,使用vscode的sftp插件,发现一直链接不上.一度以为自己配置文件,配置的参数有问题.各种度娘后,花了好长 ...

  5. 深入理解python虚拟机:程序执行的载体——栈帧

    深入理解python虚拟机:程序执行的载体--栈帧 栈帧(Stack Frame)是 Python 虚拟机中程序执行的载体之一,也是 Python 中的一种执行上下文.每当 Python 执行一个函数 ...

  6. json解析异常显示{“$ref“:“$[0]“}

    在编写测试代码实现一个组织架构树的功能时,部门的parent部门没有显示,出现了json解析异常错误[{"r e f " : " ref":"ref& ...

  7. Spring注解@Conditional相关用法

    1.@Conditional注解 @Conditional 是Spring4新提供的注解. 它的作用是按照一定的条件进行判断,满足条件给容器注册bean,否则不注入. 可以作用在方法上,也可以作用在类 ...

  8. C++ Primer 5th 阅读笔记:变量和基本类型

    一些语言的公共特性 内建类型,如整型,字符型等: 变量,为值绑定的一个名字: 表达式和语句,操作值. 分支和循环,允许我们条件执行和重复执行: 函数,定义抽象计算单元. 扩展语言的方式 自定义类型: ...

  9. ChatGPT 打字机效果原理

    一.背景 在初次使用 ChatGPT 时,我就被打字机的视觉效果吸引.总是感觉似曾相识,因为经常在一些科幻电影中看到,高级文明回传的信息在通讯设备的屏幕上以打字机效果逐步出现,在紧张的氛围下,输出人类 ...

  10. Rust如何引入源码作为依赖

    问题描述 通常我们在rust项目中引入第三方依赖包时,会直接指定包的版本,这种方式指定后,Cargo在编译时会从crates.io这个源中下载这些依赖包. [package] name = " ...