import re """ 处理全角点号->半角点号 处理逗号分隔的数字: 你的当前代码无法处理包含逗号的数字,例如 "1,000元"。可以在提取数字之前移除逗号。 优先级处理: 当前代码优先匹配“万元”然后是“元”。根据需求,可能需要调整优先级或提取所有匹配。 处理缩写: 如果输入可能使用“万”而不是“万元”,需要添加相应的匹配模式。 处理没有匹配的情况: 当没有匹配到金额时,返回一个默认值或提示信息。 """ import re def format_amount(original_amount): """ 格式化金额字符串 参数: original_amount (str): 输入的文本字符串 返回: str: 格式化后的金额字符串或提示信息 """ # 1. 删除所有空格和逗号 amount_str = re.sub(r'[,,\s]', '', original_amount) amount_str = amount_str.replace('.', '.') # 将全角点号转换为半角点号 # 2. 定义正则表达式模式,优先级依次为“元”、“万”/“万元”、无单位 patterns = [ (r"(\d+\.?\d*)元", 1), # 匹配“元”,乘以1 (r"(\d+\.?\d*)万元?", 10000), # 匹配“万”或“万元”,乘以10,000 (r"(\d+\.?\d*)(?![万|元])", 1) # 匹配没有“万”或“元”的数值,默认乘以1 ] # 3. 遍历模式并尝试匹配 for pattern, multiplier in patterns: match = re.search(pattern, amount_str) if match: try: value = float(match.group(1)) value *= multiplier # 格式化为整数,四舍五入 formatted_amount = "{:.0f}".format(value) return formatted_amount except ValueError: continue # 如果转换失败,尝试下一个模式 # 4. 如果没有匹配到任何模式,返回默认提示信息 return "" if __name__ == "__main__": # 测试用例 input_tests = [ "RMB100.01万元威威", "预算为200.6元", "总金额为3.5万元", "费用为1,000元", "预计支出为50,000元", "项目预算未确定", "金额为-1,500元", "总计为2万元和3,000元", "合计为5万人民币", "资金需求量为0.75万", "支出预计为100元和200元", "11000 万元", "预算为100万元", "费用为100元人民币", "金额:¥300.50元", "支出为30,000元及50万", "费用预计为", "成本为0元", "支出为1.5万", "总金额为100.5元", "RMB1,234.56万元项目", "项目费用为¥7,890元", "预计投资-2.5万元", "支出为万100元", # 非标准格式,应返回默认提示 "伍万元整(50,000.00 元)", "金额为人民币3万5千元", # 包含中文数字组合 "金额10,000 (壹万元)" ] for test in input_tests: formatted = format_amount(test) print(f"输入: '{test}' -> 输出: '{formatted}'")