Python实现无需locale的混乱货币字符串转float方法求助
混乱货币字符串转换解决方案
问题描述
原始格式混乱的货币字符串列表:
x = ["111,222","111.222","111,222.11","111.222,11","111111","111.22"]
需要转换为目标数字列表(禁止使用locale模块):
x = [111222,111222,111222.11,111222.11,111111,111.22]
此前尝试正则、自定义转换代码、Decimal模块均未达成预期,现提供可行方案。
解决方案
核心逻辑
根据字符串中符号的出现情况和位置,区分千位分隔符与小数分隔符:
- 同时包含
,和.时,最后出现的符号是小数分隔符,另一个作为千位分隔符直接移除 - 仅包含一种符号时,符号后为2位则是小数分隔符(逗号需替换为点),符号后为3位则是千位分隔符直接移除
实现代码
def convert_currency(s): # 处理同时包含逗号和点的情况 if ',' in s and '.' in s: comma_pos = s.rfind(',') dot_pos = s.rfind('.') if comma_pos > dot_pos: # 逗号是小数分隔符,移除点并替换逗号为点 s = s.replace('.', '').replace(',', '.') else: # 点是小数分隔符,仅移除逗号 s = s.replace(',', '') else: # 仅包含逗号的情况 if ',' in s: parts = s.split(',') if len(parts[1]) == 2: s = s.replace(',', '.') else: s = s.replace(',', '') # 仅包含点的情况 elif '.' in s: parts = s.split('.') if len(parts[1]) != 2: s = s.replace('.', '') # 转换为数字,整数转int否则保留float num = float(s) return int(num) if num.is_integer() else num # 测试转换 original_list = ["111,222","111.222","111,222.11","111.222,11","111111","111.22"] target_list = [convert_currency(item) for item in original_list] print(target_list) # 输出: [111222, 111222, 111222.11, 111222.11, 111111, 111.22]
代码说明
- 双符号场景:通过
rfind()获取符号最后出现的位置,以此判断小数分隔符,符合常见货币格式中小数部分仅2位的逻辑 - 单符号场景:通过拆分后字符串的长度判断符号类型,避免误判千位分隔符与小数分隔符
- 最终转换时自动区分整数与浮点数,匹配目标列表的格式要求
内容的提问来源于stack exchange,提问作者MR Sample
相关产品推荐
相关产品推荐

