Python使用cn2an实现中文数字与阿拉伯数字的相互转换


Posted in Python onMarch 02, 2021

工作中经常遇到阿拉伯数字转换称为中文数字或者大写金额,在网上搜了下,cn2an口碑较好,遂进行了一番学习。

安装

pip install cn2an

依赖库为setuptools、PyYAML

查看版本

In [1]: import cn2an
In [2]: cn2an.__version__
Out[2]: '0.5.8'

查看模块定义的标识符

In [3]: dir(cn2an)
Out[3]:
['An2Cn',
 'Cn2An',
 'Transform',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '__version__',
 'an2cn',
 'cn2an',
 'transform',
 'utils']

模块结构

cn2an模块结构如下:

an2cn.py
an2cn_test.py
cn2an.py
cn2an_test.py
config.yaml
performance.py
transform.py
transform_test.py
utils.py
__init__.py

查看模块下的__init__.py文件可知,模块主要对外暴露cn2an、an2cn和transform三个方法。

from .cn2an import Cn2An
from .an2cn import An2Cn
from .transform import Transform

__version__ = "0.5.8"

cn2an = Cn2An().cn2an
an2cn = An2Cn().an2cn
transform = Transform().transform

__all__ = [
  "__version__",
  "cn2an",
  "an2cn",
  "transform"
]

使用说明

1. 中文数字转阿拉伯数字

In [4]: help(cn2an.cn2an)
Help on method cn2an in module cn2an.cn2an:

cn2an(inputs: str = None, mode: str = 'strict') -> int method of cn2an.cn2an.Cn2An instance

查看帮助可知:
cn2an方法有两个参数:inputs和mode,inputs类型为字符串,默认值为空值,mode类型为字符串,默认值为strict,查看源码可知,mode仅支持strict, normal, smart等三个值。
返回值为int类型。
最大支持到10**16,即 千万亿,最小支持到 10**-16。

1.1 严格模式(strict)

默认为严格模式,严格模式下只有严格符合数字拼写的才可以进行转化。

In [1]: import cn2an
In [2]: output = cn2an.cn2an("一百二十三")
In [3]: output
Out[3]: 123
In [4]: output = cn2an.cn2an("一二三")
---------------------------------------------------------------------------
ValueError                Traceback (most recent call last)
<ipython-input-4-4c55ae4aa4a9> in <module>
----> 1 output = cn2an.cn2an("一二三")

c:\users\administrator\appdata\local\programs\python\python37\lib\site-packages\cn2an\cn2an.py in cn2an(self, inputs, mode)
   30
   31       # 检查输入数据是否有效
---> 32       sign, integer_data, decimal_data, is_all_num = self.__check_input_data_is_valid(inputs, mode)
   33
   34       # smart 下的特殊情况

c:\users\administrator\appdata\local\programs\python\python37\lib\site-packages\cn2an\cn2an.py in __check_input_data_is_valid(self, check_data, mode)
  155     else:
  156       if mode == "strict":
--> 157         raise ValueError(f"不符合格式的数据:{integer_data}")
  158       elif mode == "normal":
  159         # 纯数模式:一二三

ValueError: 不符合格式的数据:一二三

1.2 正常模式(normal)

在正常模式下,可以对 一二三 进行转化

In [5]: output = cn2an.cn2an("一二三",'normal')
In [6]: output
Out[6]: 123

1.3 灵活模式(smart)

在 灵活模式下,可以对混合拼写的 1百23 进行转换,也可以对口语化数字进行转换

In [7]: output = cn2an.cn2an("1百23", "smart")
In [8]: output
Out[8]: 123
In [9]: output = cn2an.cn2an("一万二", "smart")
In [10]: output
Out[10]: 12000

2. 阿拉伯数字转中文数字

In [1]: import cn2an

In [2]: help(cn2an.an2cn)
Help on method an2cn in module cn2an.an2cn:

an2cn(inputs: Union[str, int, float] = None, mode: str = 'low') -> str method of cn2an.an2cn.An2Cn instance
  阿拉伯数字转中文数字
  :param inputs: 阿拉伯数字
  :param mode: 小写数字,大写数字,人民币大写,直接转化
  :return: 中文数字

查看帮助可知:

an2cn方法有两个参数:inputs和mode,inputs类型可以是字符串、整数或者浮点数,默认值为空值,mode类型为字符串,默认值为low,查看源码可知,mode支持low, up, rmb, direct等四个值。
返回值为str类型。

2.1 小写中文模式(low)

在 low 模式(默认)下,数字转化为小写的中文数字。

In [3]: output = cn2an.an2cn("123")
In [4]: output
Out[4]: '一百二十三'
In [5]: output = cn2an.an2cn("123", "low")
In [6]: output
Out[6]: '一百二十三'

2.2 大写中文模式(up)

在 up 模式下,数字转化为大写的中文数字。

In [7]: output = cn2an.an2cn("123", "up")
In [8]: output
Out[8]: '壹佰贰拾叁'

2.3 人民币模式(rmb)

在 rmb 模式下,数字转化为人民币专用的描述。

In [9]: output = cn2an.an2cn("123", "rmb")
In [10]: output
Out[10]: '壹佰贰拾叁元整'

2.4 直接模式(direct)

在 direct 模式下,阿拉伯数字直接转换为对应的中文小写数字,小数点转换为汉字点。

In [11]: output = cn2an.an2cn("-1.23", "direct")
In [12]: output
Out[12]: '负一点二三'

3. 句子中的数字转换

文档中说明该功能为实验性质,功能尚不稳定。

In [1]: import cn2an

In [2]: help(cn2an.transform)
Help on method transform in module cn2an.transform:

transform(inputs: str, method: str = 'cn2an') -> str method of cn2an.transform.Transform instance

transform方法具有两个参数:inputs和method,inputs的类型为字符串,method的类型为字符串,默认值为cn2an,查看源码可知method支持cn2an和an2cn这两个值。返回值为字符串。

3.1 中文数字转阿拉伯数字

在 cn2an 方法(默认)下,可以将句子中的中文数字转换为阿拉伯数字
查看源码可知默认情况下,中文数字转换阿拉伯数字采用的smart模式。

In [3]: output = cn2an.transform("小王捡了一百块钱")
In [4]: output
Out[4]: '小王捡了100块钱'
In [5]: output = cn2an.transform("整齐的步伐,一二一")
In [6]: output
Out[6]: '整齐的步伐,121'

transform方法会根据正则表达式,检测日期、摄氏度、分数、百分比等特殊情况进行转换。

In [7]: output = cn2an.transform("小王的生日是二零零一年三月四日", "cn2an")
In [8]: output
Out[8]: '小王的生日是2001年3月4日'
In [9]: output = cn2an.transform("抛出去的硬币为正面的概率是二分之一", "cn2an")
In [10]: output
Out[10]: '抛出去的硬币为正面的概率是1/2'
In [11]: output = cn2an.transform("任务已经完成百分之五十", "cn2an")
In [12]: output
Out[12]: '任务已经完成50%'
In [13]: output = cn2an.transform("明天最低温度一度", "cn2an")
In [14]: output
Out[14]: '明天最低温度1度'
In [15]: output = cn2an.transform("明天最低温度一摄氏度", "cn2an")
In [16]: output
Out[16]: '明天最低温度1℃'

3.2 阿拉伯数字转中文数字

在an2cn 方法下,可以将句子中的阿拉伯数字转换为中文数字。
an2cn 模式下,依然会检测日期、摄氏度、分数、百分比等特殊情况进行转换

In [2]: output = cn2an.transform("小王捡了100块钱", "an2cn")
In [3]: output
Out[3]: '小王捡了一百块钱'
In [4]: output = cn2an.transform("金额为12000元 ", "an2cn")
In [5]: output
Out[5]: '金额为一万二千元 '
In [6]: output = cn2an.transform("小王的生日是2001年3月4日", "an2cn")
In [7]: output
Out[7]: '小王的生日是二零零一年三月四日'
In [8]: output = cn2an.transform("抛出去的硬币为正面的概率是1/2", "an2cn")
In [9]: output
Out[9]: '抛出去的硬币为正面的概率是二分之一'
In [10]: output = cn2an.transform("任务完成了50%", "an2cn")
In [11]: output
Out[11]: '任务完成了百分之五十'
In [12]: output = cn2an.transform("今天最低气温1摄氏度", "an2cn")
In [13]: output
Out[13]: '今天最低气温一摄氏度'

3.3 问题(大写数字)

根据源码可知transform方法优先考虑日期、分数、百分比、摄氏度等情况判断,不符合这几种情况的都判断为普通数字,因此,大写数字在transform方法中表现并不好!

In [14]: output = cn2an.transform("金额为壹万贰仟元", "cn2an")
WARN: 不符合格式的数据:万
WARN: 不符合格式的数据:仟
In [15]: output
Out[15]: '金额为壹万贰仟元 '

测试

cn2an提供了web demo进行体验。https://www.dovolopor.com/cn2an

API

cn2an提供了API,支持Java、Javascript、Go、Julia、Python等。
https://github.com/Ailln/cn2an/wiki/API#http-api

到此这篇关于Python使用cn2an实现中文数字与阿拉伯数字的相互转换的文章就介绍到这了,更多相关Python 中文数字与阿拉伯数字转换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python格式化css文件的方法
Mar 10 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
使用python判断你是青少年还是老年人
Nov 29 Python
新手入门Python编程的8个实用建议
Jul 12 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
Python银行系统实战源码
Oct 25 Python
python语言线程标准库threading.local解读总结
Nov 10 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
jupyter notebook指定启动目录的方法
Mar 02 #Python
python实现发送邮件
Mar 02 #Python
matplotlib阶梯图的实现(step())
Mar 02 #Python
Python读写Excel表格的方法
Mar 02 #Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 #Python
python中Pexpect的工作流程实例讲解
Mar 02 #Python
Opencv 图片的OCR识别的实战示例
Mar 02 #Python
You might like
删除无限级目录与文件代码共享
2006/07/12 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
python 批量解压压缩文件的实例代码
2019/06/27 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python 如何查找特定类型文件
2020/08/17 Python
python利用线程实现多任务
2020/09/18 Python
如何利用python读取micaps文件详解
2020/10/18 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
公司庆典活动邀请函
2014/01/09 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
数学教学随笔感言
2014/02/17 职场文书
团代会主持词
2014/04/02 职场文书
保洁员岗位职责
2015/02/04 职场文书
情人节活动总结范文
2015/02/05 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
微信小程序和php的登录实现
2021/04/01 PHP
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL