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

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. Linux进程管理(命令)入门

    进程是一个运行中的程序 进程查看 ps 能够查看当前终端下运行的进程 $ ps PID TTY TIME CMD 26305 pts/0 00:00:00 bash 26312 pts/0 00:00 ...

  2. ERROR: libfdk_aac not found和ERROR: libmp3lame &gt;= 3.98.3 not dound

    ERROR: libfdk_aac not found和ERROR: libmp3lame >= 3.98.3 not dound 编译ffmepg时出现这两个错误或者有时候需要x264编码的时 ...

  3. C# 笔迹擦除8边形

    擦除区域与橡皮大小不一致 测试反馈,擦除区域与真实的橡皮大小不一致: 上图中,橡皮显示是圆形的,但擦除效果是一个"8边形"区域. 找了一台8K屏,确实是能复现的: 看到这个诡异的8 ...

  4. C# ConfigureWait

    ConfigureAwait 参数为bool类型.true:尝试将延续任务封送回原始上下文 我们一般使用的是false,用于避免强制在原始上下文或调度程序中进行回调. 原理: 以await DoSom ...

  5. React 富文本编辑 braft-editor

    推荐一种react-富文本编辑器,braft-editor braft-editor的github:https://github.com/margox/braft-editor braft-edito ...

  6. Jmeter小白使用攻略

    <Jmeter小白使用攻略> 一.主界面 二.如何测试一个接口

  7. ☆常用的Sql语句汇总(DDL/DML)

    常用的sql语句汇总 1.获取所有表名.表信息 里面有表注释 数据库种类 sql 备注 mysql -- 获取所有表名.视图名show tables-- 获取 dev_test_data数据库 所有表 ...

  8. #Powerbi 利用视觉对象着色地图,制作数据地图

    日常工作中,有时我们会遇到需要地图来展示我们的数据场景,利用POWERBI,我们可以快速的制作自己的业务地图. Powerbi自带了三大地图,今天我们用到的是形状地图. 步骤讲解: 第一步:下载对应的 ...

  9. 2022-09-02:以下go语言代码输出什么?A:9;B:11;C:编译错误;D:不确定。

    2022-09-02:以下go语言代码输出什么?A:9:B:11:C:编译错误:D:不确定. package main import ( "fmt" ) func main() { ...

  10. 在Centos7上安装PXE装机环境来批量安装操作系统

    步骤 1:安装必要的软件包 首先,需要确保系统已安装 dhcp.tftp-server 和 httpd 等软件包.可以使用以下命令进行安装: yum install -y dhcp tftp-serv ...