zbparse/flask_app/general/format_amout.py

88 lines
3.0 KiB
Python
Raw Permalink Normal View History

2024-10-27 12:08:54 +08:00
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万元",
"费用为1000元",
"预计支出为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}'")