public Data parse(byte[] bytes)
    {
        String s = getString(bytes);
        
        char sign;
        
        if (getSignPosition() == LEADING) {
            sign = s.charAt(0);
        } else if (getSignPosition() == TRAILING) {
            sign = s.charAt(s.length() - 1);
            s = sign + s.substring(0, s.length() - 1);
        } else {
            throw new RuntimeException(BUG_TEXT);
        }
        
        if (sign != '+' && sign != '-') throw new IllegalArgumentException(getName() + " is sign separate "
            + (getSignPosition() == LEADING ? "leading" : "trailing") + " but no sign was found on value " + s);
        
        if (sign == '+') s = s.substring(1);

        BigInteger big = new BigInteger(s);
        Data data = create();
        
        if (data instanceof DecimalData) {
            DecimalData dData = (DecimalData) data;
            
            dData.setValue(new BigDecimal(big, decimalPlaces()));
            
            return data;
        } else {
            IntegerData iData = (IntegerData) data;
            
            iData.setValue(big);
            
            return data;
        }
    }