import re
ch_num ='零一二三四五六七八九'
units =' 十百千'defnum2Chinese1(num_str):"轉(zhuǎn)換9999以內(nèi)的數(shù)字到大寫"
result =[ch_num[int(i)]+unit for i,
unit inzip(reversed(num_str), units)]
result ="".join(reversed(result))
result = re.sub("(?:零[十百千])+","零", result)
result = re.sub("零+","零", result)
result = result.rstrip()if result !="零":
result = result.rstrip("零")return result
然后生成測試用例并測試:
import random
import itertools
num_t ="123456789"
cases =[]for length inrange(1,5):
nums = random.sample(num_t, length)
cases.append("".join(nums))for n inrange(1, length+1):# n個(gè)0for poss in itertools.combinations(range(length), n):
num = nums.copy()for pos in poss:
num[length-pos-1]="0"
num ="".join(num)
cases.append(num)for i in cases:print(i, num2Chinese1(str(i)))
import math
import re
ch_num ='零一二三四五六七八九'
units =' 十百千'defnum2Chinese1(num_str):"轉(zhuǎn)換9999以內(nèi)的數(shù)字到大寫"
result =[ch_num[int(i)]+unit for i,
unit inzip(reversed(num_str), units)]
result ="".join(reversed(result))
result = re.sub("(?:零[十百千])+","零", result)
result = re.sub("零+","零", result)
result = result.rstrip()if result !="零":
result = result.rstrip("零")return result
defnum2Chinese2(num_str):iflen(num_str)<=4:
result = num2Chinese1(num_str[-4:])else:
result = num2Chinese1(num_str[:-4])+"萬"+ num2Chinese1(num_str[-4:])return result.replace("零萬","零")defnum2Chinese3(num_str):
num_str = num_str.lstrip("0")ifnot num_str:return"零"iflen(num_str)<=4:return num2Chinese1(num_str)
e_num = math.ceil(len(num_str)/8)
result =[num2Chinese2(num_str[-8:])]for e_i inrange(1, e_num):
result.append(num2Chinese2(num_str[-8-e_i*8:-e_i*8])+"億"*e_i+" ")
result ="".join(reversed(result))
result = re.sub(" (?:零+億+ )+"," 零", result)
result = re.sub("零(億+)",r"\1", result)
result = re.sub("零+","零", result)return result.strip("零")defnum2Chinese(num_str):
num_str = num_str.replace(" ","").rstrip(".")ifnot re.fullmatch("\d+(?:\.\d+)?", num_str):raise Exception("不是一個(gè)數(shù)字字符串")if num_str.find(".")!=-1:
num_str1, num_str2 = num_str.split(".",1)return num2Chinese3(num_str1)+" 點(diǎn) "+"".join(ch_num[int(c)]for c in num_str2.rstrip("0"))return num2Chinese3(num_str)
下面我們生成千萬億級別的各種具備代表性的測試數(shù)據(jù)進(jìn)行測試:
nums_t = random.choices("123456789", k=16)
num ="".join(nums_t)print(num, num2Chinese(num))for zero_len inrange(4,15,3):for s_pos inrange(17-zero_len):
nums = nums_t.copy()
nums[s_pos:s_pos+zero_len]="0"*zero_len
num ="".join(nums)print(num, num2Chinese3(num))
for i inrange(0,720368547758,900025):
a =str(i)
ch_num_str = num2Chinese(a)
b = Chinese2Num(ch_num_str)if a != b:print(a, ch_num_str, b)breakelse:print("未發(fā)現(xiàn)轉(zhuǎn)換錯(cuò)誤!")