Python中完善format_number函数:支持K/M格式字符串转整数
改进后的format_number函数实现
你的需求核心是先区分纯数字字符串和带单位(K/M)的字符串,再分别处理。原函数思路没问题,但存在大小写兼容、逻辑严谨性的小问题,下面是优化后的代码:
import re def format_number(number): """ 格式化数字字符串:处理逗号分隔、K/M单位转换、移除小数点,最终返回整数 :param number: 输入的数字字符串,支持格式如"30K"、"2M"、"1,234"、"3.5K" :return: 转换后的整数 """ # 预处理:去掉逗号,统一转小写(兼容大写K/M输入) processed = number.replace(",", "").lower() # 匹配带K/M单位的字符串 unit_match = re.match(r'^(\d+\.?\d*)(k|m)$', processed) if unit_match: num_part, unit = unit_match.groups() # 移除小数点,把数字转成纯数字串(比如"3.5"转为"35") num_str = num_part.replace(".", "") # 根据单位补对应数量的零 if unit == 'k': num_str += '00' if '.' in num_part else '000' elif unit == 'm': num_str += '00000' if '.' in num_part else '000000' return int(num_str) else: # 纯数字场景:直接移除小数点后转整数 pure_num = processed.replace(".", "") return int(pure_num)
关键优化点
- 大小写兼容:统一转小写,不管输入是"30K"还是"30k"都能正常处理
- 严谨的单位匹配:用正则从字符串开头匹配,只处理结尾带K/M的情况,避免误替换字符串中间的字符
- 清晰分支逻辑:先判断是否带单位再分别处理,比原函数的顺序替换更易读、易维护
- 鲁棒性提升:明确区分带小数点和不带小数点的单位转换逻辑,避免出错
测试示例
print(format_number("30K")) # 输出30000 print(format_number("2M")) # 输出2000000 print(format_number("1,234")) # 输出1234 print(format_number("3.5K")) # 输出3500 print(format_number("500")) # 输出500 print(format_number("1.2M")) # 输出1200000
原函数的小问题说明
原函数的正则r"(k)$"仅匹配小写k,无法处理大写K;全局替换逻辑可能会误处理字符串中间的k/m字符(虽然你的场景大概率不会出现,但严谨性不足),用re.match从开头匹配可以规避这个问题。
内容的提问来源于stack exchange,提问作者Robz
相关产品推荐
相关产品推荐

