import re
ch_num ='零一二三四五六七八九'
units =' 十百千'defnum2Chinese1(num_str):"转换9999以内的数字到大写"
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个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):"转换9999以内的数字到大写"
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("不是一个数字字符串")if num_str.find(".")!=-1:
num_str1, num_str2 = num_str.split(".",1)return num2Chinese3(num_str1)+" 点 "+"".join(ch_num[int(c)]for c in num_str2.rstrip("0"))return num2Chinese3(num_str)
下面我们生成千万亿级别的各种具备代表性的测试数据进行测试:
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("未发现转换错误!")
经过半分钟的时间,已经初步互相验证完成,未发现转换失败的数据。
彩蛋:windows文件名排序
如何快速实现windows文件名的排序效果呢?示例代码:
files = os.listdir()
files.sort(key=lambda s:[(s,int(n))for s, n in re.findall('(\D+)(\d+)',f'a{s}0')])