```python
def parse_amount(text: str) -> int:
    """Converts a decimal amount string to integer cents."""
    if not isinstance(text, str):
        raise ValueError("Input must be a string.")

    parts = text.split('.')
    
    # Validate the format of the input
    if len(parts) != 2 or len(parts[1]) != 2 or not parts[0].isdigit() or not parts[1].isdigit():
        raise ValueError("Invalid amount format. Must be 'digits.digits' with exactly two fraction digits.")

    integer_part = int(parts[0])
    fractional_part = int(parts[1])

    if integer_part < 0:
        raise ValueError("Integer part cannot be negative.")
    
    return integer_part * 100 + fractional_part

def format_amount(cents: int) -> str:
    """Converts non-negative integer cents back to a dotted amount string."""
    if not isinstance(cents, int) or cents < 0:
        raise ValueError("Input must be a non-negative integer.")

    integer_part = cents // 100
    fractional_part = cents % 100

    return f"{integer_part}.{fractional_part:02d}"


def allocate_cents(total_cents: int, weights: list) -> list:
    """Splits total_cents across a list of integer weights proportionally."""
    if not isinstance(total_cents, int) or total_cents < 0:
        raise ValueError("Total cents must be a non-negative integer.")
    
    if len(weights) == 0:
        raise ValueError("Weight list cannot be empty.")

    for weight in weights:
        if not isinstance(weight, int) or weight < 0:
            raise ValueError("Each weight must be a non-negative integer.")

    total_weight = sum(weights)
    if total_weight == 0:
        raise ValueError("Weights cannot sum to zero.")
    
    # Calculate the base share size
    base_share = total_cents // total_weight
    
    # Allocate shares proportionally and calculate remainders
    shares = [base_share] * len(weights)
    remainder = total_cents % total_weight

    # Distribute remainders to the shares with the largest remainders first
    for i in range(remainder):
        max_index = weights.index(max(weights))
        shares[max_index] += 1
        weights[max_index] -= 1

    return shares
```