def parseValueCoord(vcstr):
    """
    Parse a value*coord ZMAT string.
    
    E.g., "R", "1.0", "2*A", "-2.3*R", "-A"
    
    All whitespace is removed from string before parsing.
    
    If there is no '*' operator, then the string must be
    a valid float literal or a coordinate label. A coordinate
    label must begin with a letter. A leading '+' or '-' may
    be added before a coordinate label (if there is no '*').
    
    If there is a '*' operator, then the string before it must
    be a valid float literal. The string after it must be a valid
    coordinate label.

    Parameters
    ----------
    vcstr : str
        Value-coordinate string

    Returns
    -------
    v : float
        The literal value or coefficient.
    c : str
        The coordinate label. This is None if there is no coordinate.
    """
    
    vcstr = "".join(vcstr.split()) # We expect no whitespace. Remove if any.
    
    if "*" in vcstr:
        # A two factor value * coordinate string
        vstr, cstr = vcstr.split('*')
        if len(vstr) == 0 or len(cstr) == 0:
            raise ValueError("Malformed value-coordinate string")
        elif not cstr[0].isalpha():
            raise ValueError("Invalid coordinate label")
        else:
            return (float(vstr), cstr)
    else:
        # A bare literal or a bare coordinate, possibly with leading '-' or '+'
        if vcstr[0].isalpha():
            return (1.0, vcstr[0:])
        elif vcstr[0] == '-' and vcstr[1].isalpha():
            return (-1.0, vcstr[1:])
        elif vcstr[0] == '+' and vcstr[1].isalpha():
            return (+1.0, vcstr[1:])
        else:
            return (float(vcstr), None)