You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]

代码说明

  1. 双符号场景:通过rfind()获取符号最后出现的位置,以此判断小数分隔符,符合常见货币格式中小数部分仅2位的逻辑
  2. 单符号场景:通过拆分后字符串的长度判断符号类型,避免误判千位分隔符与小数分隔符
  3. 最终转换时自动区分整数与浮点数,匹配目标列表的格式要求

内容的提问来源于stack exchange,提问作者MR Sample

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:43:39