"""Unitati de masa, normalizare si conversii. Etichetele de produs finit sunt exprimate de obicei in grame, iar cantarul poate raporta kilograme. Toate cantaririle sunt convertite in unitatea retetei inainte de a fi salvate. """ from __future__ import annotations from typing import Optional # Unitati acceptate, in ordinea afisata in interfata. UNITS: tuple[str, ...] = ("g", "kg", "mg", "t", "lb", "oz") GRAMS_PER: dict[str, float] = { "g": 1.0, "kg": 1000.0, "mg": 0.001, "t": 1_000_000.0, "lb": 453.59237, "oz": 28.349523125, } ALIASES: dict[str, str] = { "gr": "g", "gram": "g", "grame": "g", "grams": "g", "kg": "kg", "kgs": "kg", "kilogram": "kg", "kilograme": "kg", "mg": "mg", "miligram": "mg", "miligrame": "mg", "t": "t", "tona": "t", "ton": "t", "to": "t", "lb": "lb", "lbs": "lb", "pound": "lb", "oz": "oz", "ounce": "oz", } def normalize_unit(value: object, default: str = "g") -> str: text = str(value or "").strip().lower() if not text: return default return ALIASES.get(text, text if text in GRAMS_PER else default) def convert(value: float, from_unit: str, to_unit: str) -> Optional[float]: """Converteste intre unitati de masa; None daca una nu este unitate de masa.""" source = GRAMS_PER.get(from_unit) target = GRAMS_PER.get(to_unit) if source is None or target is None: return None return value * source / target def format_weight(value: object, decimals: int = 3) -> str: """Formatare pentru etichete: fara zerouri finale inutile.""" try: number = float(value) # type: ignore[arg-type] except (TypeError, ValueError): return str(value) text = f"{number:.{int(decimals)}f}" if "." in text: text = text.rstrip("0").rstrip(".") return text or "0"