python中文數字轉數值的一種實現

2021-10-04 01:44:12 字數 2600 閱讀 2408

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寫成」二百十三「,而不是」二百一十三「的內容。

數字轉中文數字與中文數字轉數字

利用陣列與map的資料結構進行中文數字與數字之間的互相轉換 public class numberutil private static final char cn num private static final char cn unit private static final string c...

使用python提取中文數字和英文

因為訓練word2vec模型,需要處理資料集發現其中有很多特殊符號,所以使用py thon 3 pyt hon3 進行了資料預處理,去除了預料中的特殊符號,這裡使用unicode加正規表示式來進行相關的匹配。import re string 12345464我不是藥神123456abcdefgabc...

Oracle中文 數字混雜欄位的排序

對oracle中中文 數字混雜形式的字段進行排序的方法 例如 order by nlssort 欄位名,nls sort schinese pinyin m to number translate 欄位名,0123456789 欄位名,0123456789 nlssort 函式 如果資料庫字符集選用...