88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
|
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}'")
|
|||
|
|
|||
|
|
|||
|
|