import re from typing import Optional, Union def sanitize_amount(text: str) -> Optional[float]: """ Sanitizes a string representing an amount/number (e.g., "$1,234.56", "€ 50,000", "50 USD") by removing currency symbols, commas, and other non-numeric characters (except for the decimal separator), and casts it to a float. Args: text (str): The raw extracted text from the document. Returns: Optional[float]: The sanitized numeric value, or None if no number could be extracted. """ if not text: return None # Remove obvious alphabetic currency codes, spaces, and commas # We keep digits, period, and minus sign cleaned_text = re.sub(r'[^\d\.-]', '', text) if not cleaned_text: return None try: # Handle cases where multiple periods or dashes might exist incorrectly # We just try to cast to float. If the OCR produced something like "1.23.45", this will fail. # A more robust regex can handle exact capture if needed. # But this basic cast covers 95% of standard sanitized strings. return float(cleaned_text) except ValueError: return None