Fix normalization

This commit is contained in:
Raphael Michel
2026-04-29 09:57:29 +02:00
parent 476a88d4fd
commit 9d40df9310

View File

@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import copy import copy
from decimal import Decimal
from django.core.files import File from django.core.files import File
from django.db import models from django.db import models
@@ -57,6 +58,21 @@ def flatten_choices(choices):
yield value_or_group, label_or_nested yield value_or_group, label_or_nested
def _normalize_decimal(d: Decimal) -> Decimal:
"""
Strips trailing zeros, e.g.
20.000 → 20
20.010 → 20.01
20.100 → 20.1
But unlike of Decimal.normalize(), 20.000 will not become 2e+1
"""
normalized = d.normalize()
sign, digit, exponent = normalized.as_tuple()
return normalized if exponent <= 0 else normalized.quantize(1)
class NormalizedDecimalField(DecimalField): class NormalizedDecimalField(DecimalField):
""" """
Variant of DecimalField that never outputs the trailing zeros, so we always have normalized decimals internally. Variant of DecimalField that never outputs the trailing zeros, so we always have normalized decimals internally.
@@ -65,5 +81,5 @@ class NormalizedDecimalField(DecimalField):
def from_db_value(self, value, expression, connection): def from_db_value(self, value, expression, connection):
if value is not None: if value is not None:
value = value.normalize() value = _normalize_decimal(value)
return value return value