```python
def parse_amount(text: str) -> int:
    """Turns a decimal amount string into integer cents."""
    if not isinstance(text, str):
        raise ValueError("Input must be a string")
    parts = text.split('.')
    if len(parts) > 2:
        raise ValueError("Too many dots in input")
    integer_part = parts[0].lstrip('0')
    fraction_part = parts[-1].zfill(2)[:2]
    if not integer_part and not fraction_part:
        raise ValueError("Empty input")
    return int(integer_part) * 100 + int(fraction_part)


def format_amount(cents: int) -> str:
    """Renders non-negative integer cents back into a dotted form."""
    if not isinstance(cents, int):
        raise ValueError("Input must be an integer")
    if cents < 0:
        raise ValueError("Negative input")
    integer_part = str(cents // 100)
    fraction_part = f"{cents % 100:02d}"
    return f"{integer_part}.{fraction_part}"


def allocate_cents(total_cents: int, weights: list) -> list:
    """Splits total_cents across a list of integer weights proportionally."""
    if not isinstance(weights, list):
        raise ValueError("Weights must be a list")
    if not weights:
        raise ValueError("Empty weight list")
    if any(not isinstance(w, int) or w < 0 for w in weights):
        raise ValueError("Invalid weight")
    if sum(weights) == 0:
        raise ValueError("Weights sum to zero")
    if not isinstance(total_cents, int) or total_cents < 0:
        raise ValueError("Total cents must be a non-negative integer")

    total_parts = sum(weights)
    parts = [total_cents * w // total_parts for w in weights]
    remainder = total_cents - sum(parts)

    # Distribute the remainder
    for i in range(remainder):
        parts[i] += 1

    return parts
```