中文数字的正则表达式与书写规则

时间:2021-05-11 06:53:52
在我的工作中遇到这样一种问题,需要从一大段文本中找到中文数字并转换为阿拉伯数字,有时又要做相反的工作。如果中文数字和阿拉伯数字有一样的书写规则,那么一切不成问题,然而事实不是这样。
一到九很好确定,但在大于十的数呢?大于二十的数呢?甚至是大于一百的数呢?
因为工作中仅需要处理一到九十九的数,于是为这一系列数字写了一个有缺陷的正则表达式。过程如下:
1、首先还是要统一数字的书写规则。我所面对的文本有点操蛋,23有的写为“二十三”,有的写为“二三”,11一般写为“十一”,但又有的时候写为“一十一”。好了,先统一规则,比如23只能写为“二十三”,11只能写为“十一”。于是不得不对“二三”、“一十一”这种数字做一个正则表达式,将那些操蛋的家伙打掉。于是一到九十九的数字剩下以下四种格式:一至九,十几,几十几,几十及十。
2、后面的事情就好办了。我写为:/([二三四五六七八九]?十)?[一二三四五六七八九]?/然后再将搜索到的字符串按相应的四种规则转换为阿拉伯数字形式。
但这个正则表达式有缺陷,他可以匹配空字符,但在这并不影响我的工作,所以没有对他进行优化。那么进一步呢?在会计方面,大写中文数字或许比较规则,但日常行文中,大于一百的数字书写相当杂乱,如我看到过的“二零八十”=“二千八十”=“二千零八十”。
符合会计中大写中文数字书写规则的规范是怎样的?正则表达式如何写呢?或许有一天我会用到,你也会用到(百度上没搜到)。

7 个解决方案

#1


正则并非万能,有规律就有正则。
不单单是中文数字,英文数字用正则也难搞。

#2


会计的大写数字规则标准是必须统一的.“二零八十”=“二千八十”这些都不行,只有“二千零八十”这样才可以。
如果他们不标准,责任在他们,让他们自己先去改好.

#3


为什么会计学上就要求必须标准? 
你想想,“二零八十”如果在二和零中间加个"万"成啥了? 二万零八十.
“二千八十”在八前面加个五,成"二千五八十",因为“二零八十”如果允许说得通,那"五八十"自然也就通.
哪行有哪行的规矩,怎么可能让他们乱来.

#4


引用 2 楼 theforever 的回复:
会计的大写数字规则标准是必须统一的.“二零八十”=“二千八十”这些都不行,只有“二千零八十”这样才可以。
如果他们不标准,责任在他们,让他们自己先去改好.


有理,对应规则要明确。

#5


后来我也看了下会计的书写规则,如果按照会计的规则书写数字,那个正则表式应该是写的出来。不过可能要根据实际使用的情况确定数字的范围,然后选择想应的正则表达式,因为如果数字太大,相应的正则表达式就相当长。
不过一般在会计领域之外,中文数字多半是用作序号,那么一到九十九就基本够用了。
发贴的初衷是想大家讨论下,看看能不能写出一个通用的正则表达式。

#6


正则之道在于,针对一个特定的文本,写一个效率和准确性都达到最佳的正则。

针对所有形式的中文数字,甚至包括方言,写一个通用正则行不行呢?理论上没问题,但应用于规范中文数字的文本,就显得太太臃肿了。

正则应用的是特定文本,并不需要放之四海而皆准。

#7


1·阿拉伯数字中间有"0"时,中文大写要写"零"字,如¥1409.50,应写成人民币陆壹仟肆佰零玖元伍角。 
2·阿拉伯数字中间连续有几个"0"时,中文大写金额中间可以只写一个"零"字,如¥6007.14,应写成人民币陆仟零柒元壹角肆分。 
3·阿拉伯金额数字万位和元位是"0",或者数字中间连续有几个"0",万位、元位也是"0",但千位、角位不是"0"时,中文大写金额中可以只写一个零字,也可以不写"零"字。如¥1680.32,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分,又如¥107000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。 
4·阿拉伯金额数字角位是"0",而分位不是"0"时,中文大写金额"元"后面应写"零"字。如¥16409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾伍元零肆分。

以上是会计方面的书写规则,去除关于角和分的描述,就是整数的中文书写规则:
1·阿拉伯数字中间有"0"时,中文大写要写"零"字,如1409,应写成一千四百零九。 
2·阿拉伯数字中间连续有几个"0"时,中文大写数字中间只写一个"零"字,如6007,应写成六千零七。 
其实也就两条关于0规则。

一般中文数字用作序号的话,1-10,0000也就够了。
参考一到九十九的正则表达式和上述两条规则,中文数字规则又当如何定? 1-10,0000的正则表达式怎么写?

#1


正则并非万能,有规律就有正则。
不单单是中文数字,英文数字用正则也难搞。

#2


会计的大写数字规则标准是必须统一的.“二零八十”=“二千八十”这些都不行,只有“二千零八十”这样才可以。
如果他们不标准,责任在他们,让他们自己先去改好.

#3


为什么会计学上就要求必须标准? 
你想想,“二零八十”如果在二和零中间加个"万"成啥了? 二万零八十.
“二千八十”在八前面加个五,成"二千五八十",因为“二零八十”如果允许说得通,那"五八十"自然也就通.
哪行有哪行的规矩,怎么可能让他们乱来.

#4


引用 2 楼 theforever 的回复:
会计的大写数字规则标准是必须统一的.“二零八十”=“二千八十”这些都不行,只有“二千零八十”这样才可以。
如果他们不标准,责任在他们,让他们自己先去改好.


有理,对应规则要明确。

#5


后来我也看了下会计的书写规则,如果按照会计的规则书写数字,那个正则表式应该是写的出来。不过可能要根据实际使用的情况确定数字的范围,然后选择想应的正则表达式,因为如果数字太大,相应的正则表达式就相当长。
不过一般在会计领域之外,中文数字多半是用作序号,那么一到九十九就基本够用了。
发贴的初衷是想大家讨论下,看看能不能写出一个通用的正则表达式。

#6


正则之道在于,针对一个特定的文本,写一个效率和准确性都达到最佳的正则。

针对所有形式的中文数字,甚至包括方言,写一个通用正则行不行呢?理论上没问题,但应用于规范中文数字的文本,就显得太太臃肿了。

正则应用的是特定文本,并不需要放之四海而皆准。

#7


1·阿拉伯数字中间有"0"时,中文大写要写"零"字,如¥1409.50,应写成人民币陆壹仟肆佰零玖元伍角。 
2·阿拉伯数字中间连续有几个"0"时,中文大写金额中间可以只写一个"零"字,如¥6007.14,应写成人民币陆仟零柒元壹角肆分。 
3·阿拉伯金额数字万位和元位是"0",或者数字中间连续有几个"0",万位、元位也是"0",但千位、角位不是"0"时,中文大写金额中可以只写一个零字,也可以不写"零"字。如¥1680.32,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分,又如¥107000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。 
4·阿拉伯金额数字角位是"0",而分位不是"0"时,中文大写金额"元"后面应写"零"字。如¥16409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾伍元零肆分。

以上是会计方面的书写规则,去除关于角和分的描述,就是整数的中文书写规则:
1·阿拉伯数字中间有"0"时,中文大写要写"零"字,如1409,应写成一千四百零九。 
2·阿拉伯数字中间连续有几个"0"时,中文大写数字中间只写一个"零"字,如6007,应写成六千零七。 
其实也就两条关于0规则。

一般中文数字用作序号的话,1-10,0000也就够了。
参考一到九十九的正则表达式和上述两条规则,中文数字规则又当如何定? 1-10,0000的正则表达式怎么写?