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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python定时执行指定函数的方法
May 27 Python
Python正则表达式经典入门教程
May 22 Python
Python连接phoenix的方法示例
Sep 29 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
python创建子类的方法分析
Nov 28 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 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
php xfocus防注入资料
2008/04/27 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
php中的动态调用实例分析
2015/01/07 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
php实现每日签到功能
2018/11/29 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
总结一些js自定义的函数
2006/08/05 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
js实现select下拉框选择
2020/01/11 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
Python中的下划线详解
2015/06/24 Python
Python实现Event回调机制的方法
2019/02/13 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
中学生班主任评语
2014/01/30 职场文书
股份合作协议书范本
2014/04/14 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android
Elasticsearch 聚合查询和排序
2022/04/19 Python