""" Helpers pour parser des prix avec separateurs de milliers. """ from __future__ import annotations import re from typing import Optional def parse_price_text(text: str) -> Optional[float]: """ Parse un texte de prix en float. Gere les separateurs espace, point, virgule et espaces insécables. """ if not text: return None text = re.sub(r"(\d)\s*€\s*(\d)", r"\1,\2", text) cleaned = text.replace("\u00a0", " ").replace("\u202f", " ").replace("\u2009", " ") cleaned = "".join(ch for ch in cleaned if ch.isdigit() or ch in ".,") if not cleaned: return None if "," in cleaned and "." in cleaned: if cleaned.rfind(",") > cleaned.rfind("."): cleaned = cleaned.replace(".", "") cleaned = cleaned.replace(",", ".") else: cleaned = cleaned.replace(",", "") elif "," in cleaned: parts = cleaned.split(",") if len(parts) > 1: decimal = parts[-1] integer = "".join(parts[:-1]) cleaned = f"{integer}.{decimal}" if decimal else integer elif "." in cleaned: parts = cleaned.split(".") if len(parts) > 1: decimal = parts[-1] integer = "".join(parts[:-1]) cleaned = f"{integer}.{decimal}" if decimal else integer try: return float(cleaned) except ValueError: return None