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 出现了 ...
随机推荐
- Go语言基础: goroutine和通道
并发编程表现为程序由若干个自主的活动单元组成. goroutine 在Go语言里,每一个并发执行的活动称为goroutine.当一个程序启动时,只有一个goroutine来调用main函数,称之为主g ...
- 16-js兼容性处理
const { resolve } = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); modul ...
- Django框架简单搭建增删改查页面 Django请求生命周期流程图
目录 Django框架简单搭建增删改查页面 一.前期的配置文件以及连接MySQL的基本准备 二.在数据库中准备好数据 三.将MySQL的数据展示到页面(简单认识HTML模板语法 for循环) 在Dja ...
- Eclipse中添加Shell脚本(如start.sh)
Eclipse中添加Shell脚本(如start.sh) 使用eclipse时,我们有时候会在自己的工程文件下添加一些脚本(比如将Qt代码在eclipse中运行生成moc文件时,或者要拷贝 ...
- 深度学习04-(Tensorflow简介、图与会话、张量基本操作、Tensorboard可视化、综合案例:线性回归)
深度学习04-Tensorflow 深度学习04-(Tensorflow) Tensorflow概述 Tensorflow简介 什么是Tensorflow Tensorflow的特点 Tensorfl ...
- 「微服务」这10道Consul面试题值得一看
前言 Consul 是一种非常强大的分布式服务发现和配置管理工具,它可以帮助开发人员和运维人员更好地管理和维护分布式系统. 但是,使用 Consul 也需要投入一定的人力和物力,需要根据实际情况进行选 ...
- java中各引用类型的生存时间
引用类型由上往下一次减弱: 强引用:Object obj=new Object(),无论什么情况下,只要强引用关系还存在,就不会回收被引用的对象. 软引用:像系统中缓存这些,在系统即将报内存溢出异常时 ...
- 2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ““。 如果有不
2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 . 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 "&q ...
- distinct()去重
distinct()去重 Student.objects.all().distinct()
- 【数据库】时区及JDBC的时区设置
JDBC连接时有个TimeZone配置,这玩意到底有用吗?我是使用Postgresql和Mysql两个数据库验证的.结果如下: 数据库 部署方式 版本 JDBC连接TimeZone参数 JDBC连接s ...