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 图片验证码代码
Dec 07 Python
python元组操作实例解析
Sep 23 Python
python3简单实现微信爬虫
Apr 09 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
在Django中创建第一个静态视图
Jul 15 Python
Python开发的HTTP库requests详解
Aug 29 Python
Python实现感知机(PLA)算法
Dec 20 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php常用ODBC函数集(详细)
2013/06/24 PHP
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
Python 字符串定义
2009/09/25 Python
python日志记录模块实例及改进
2017/02/12 Python
python导入坐标点的具体操作
2019/05/10 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
幼儿园长自我鉴定
2013/10/17 职场文书
门卫人员岗位职责
2013/12/24 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
一年级评语大全
2014/04/23 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript