Python去除字符串数字逗号并保留小数点适配Django DecimalField
处理带千分位/小数逗号的字符串转Django DecimalField格式
核心逻辑
要区分千分位逗号和小数点逗号,关键看最后一个逗号的位置及后续数字长度:
- 若字符串最后一个逗号后跟着1或2位数字,该逗号即为小数点分隔符
- 其余所有逗号均为千分位分隔符,直接移除即可
实现代码
编写工具函数完成转换,同时处理异常情况:
from decimal import Decimal, InvalidOperation from django.core.exceptions import ValidationError def parse_number_string(num_str): cleaned = num_str.strip() if not cleaned: raise ValidationError("空数字字符串无效") # 定位所有逗号的位置 comma_indices = [i for i, char in enumerate(cleaned) if char == ','] if not comma_indices: # 无逗号的情况,直接转Decimal并保留两位小数 try: return Decimal(cleaned).quantize(Decimal('0.00')) except InvalidOperation: raise ValidationError(f"无效数字格式: {num_str}") # 检查最后一个逗号是否为小数点 last_comma_idx = comma_indices[-1] after_last_comma = cleaned[last_comma_idx+1:] if len(after_last_comma) in (1,2) and after_last_comma.isdigit(): # 替换最后一个逗号为小数点,移除其余千分位逗号 processed = cleaned[:last_comma_idx].replace(',', '') + '.' + after_last_comma else: # 所有逗号都是千分位分隔符,直接移除 processed = cleaned.replace(',', '') # 转换为Decimal并强制保留两位小数 try: return Decimal(processed).quantize(Decimal('0.00')) except InvalidOperation: raise ValidationError(f"无效数字格式: {num_str}")
测试验证
针对示例输入的处理结果:
- 输入
"250,000,50"→ 输出Decimal('250000.50') - 输入
"250,000"→ 输出Decimal('250000.00') - 输入
"1,234,567,89"→ 输出Decimal('1234567.89') - 输入
"987,65"→ 输出Decimal('987.65')
Django中集成使用
可以在模型的clean方法或表单字段的清洗逻辑中调用该函数:
from django.db import models class Transaction(models.Model): amount = models.DecimalField(max_digits=12, decimal_places=2) def clean(self): # 假设前端传入的原始字符串存储在临时变量raw_amount中 raw_amount = self.raw_amount # 根据实际场景调整 self.amount = parse_number_string(raw_amount) super().clean()
内容的提问来源于stack exchange,提问作者Saidamir
相关产品推荐
相关产品推荐

