python中,str.isnumeric可以判别字符串是否为数字,包括中文字符也可以正常判断,例如:
str.isnumeric('伍拾叁')
str.isnumeric('五十三')
结果都返回True
但对于这些unicode的字符,单个字符可以通过unicodedata.numeric转换为数值,长字符串就不行了。
查阅了各位大神的汉字转数值实现,总觉得不那么符合我的思路,这里我提出一种思路来解决这种问题。
代码如下(注:以下代码仅用于示例,未进行异常判断和出错处理):
# HZToNumber也可以用如下代码实现,以解决大写中文汉字(如壹贰叁)的问题
# import unicodedata
# unicodedata.numeric(hz)
def HZToNumber(hz):
return '零一二三四五六七八九'.find(hz)
splits_ch = ('亿', '万', '千', '百', '十')
splits_val = (100000000, 10000, 1000, 100, 10)
def Word2Number(word, split_idx = 0):
split_ch = self.splits_ch[split_idx]
split_val = self.splits_val[split_idx]
pos = word.find(split_ch)
if pos >= 0:
left = word[:pos]
right = word[pos+1:]
if not left:
left_num = 1
else:
if split_idx < len(self.splits_ch) - 1:
left_num = Word2Number(left, split_idx + 1)
else:
left_num = HZToNumber(left.replace('零', ''))
if not right:
right_num = 0
else:
if split_idx < len(self.splits_ch) - 1:
right_num = Word2Number(right, split_idx + 1)
else:
right_num = HZToNumber(right.replace('零', ''))
val = left_num * split_val + right_num
else:
if split_idx < len(self.splits_ch) - 1:
val = Word2Number(word, split_idx + 1)
else:
val = HZToNumber(word.replace('零', ''))
return val
处理思路:
1、确认文字中是否存在“亿/万/千/百/十”
2、如果存在,将其从该字分成字左边、右边两部分
3、将左边、右边两部分分别以 数量级更低 的“亿/万/千/百/十”以同样方法区分,直到划分到只有个位为止
4、将个位转换为数值,再叠加回来。
举例步骤如下:
一千二百三十亿四千五百六十七万八千零九十一
1: 查找亿: 一千二百三十 四千五百六十七万八千零九十一
2: 查找万: 无,继续查找千 四千五百六十七 八千零九十一
3: 查找千: 一 二百三十 四 五百六十七 八 零九十一
4: 1 二 三十 4 五 六十七 8 零九 一
5 1 2 三 4 5 六 七 8 9 1
6 1 2 3 4 5 6 7 8 9 1
7 1 2 3*10 4 5 6*10+7 8 9*10+1
8 1 2*100+30 4 5*100+67 8*1000+91
9 1*1000+230 4*1000+567 8091
10 1230 4567*10000+8091
11 1230*100000000+45678091
这种处理方式还可以处理213写成”二百十三“,而不是”二百一十三“的内容。
本文介绍了一种处理中文数字转数值的方法,通过查找并处理"亿/万/千/百/十"等数量级字符,将中文数字转换为对应的数值。示例代码展示了这一过程,适用于处理包括"二百十三"等特殊情况。

3529

被折叠的 条评论
为什么被折叠?



