docs: public static boolean isNumeric(String string)
    {
      if(string == null || string.isEmpty()) return false;
  
      State state = State.SIGN;
      for(int i = 0; i < string.length(); ++i) {
        char c = string.charAt(i);
  
        switch(state) {
        case SIGN:
          if(c == '-' || c == '+') {
            state = State.INTEGER;
            break;
          }
          if(c == DECIMAL_SEPARATOR) {
            state = State.FRACTIONAL;
            break;
          }
          if(Character.isDigit(c)) {
            state = State.INTEGER;
            break;
          }
          return false;
  
        case INTEGER:
          if(Character.isDigit(c)) {
            break;
          }
          if(c == GROUPING_SEPARATOR) {
            break;
          }
          if(c == DECIMAL_SEPARATOR) {
            state = State.FRACTIONAL;
            break;
          }
          if(c == 'e' || c == 'E') {
            state = State.EXPONENT_SIGN;
            break;
          }
          if(isNumericSuffix(c)) {
            state = State.END;
            break;
          }
          return false;
  
        case FRACTIONAL:
          if(c == 'e' || c == 'E') {
            state = State.EXPONENT_SIGN;
            break;
          }
          if(isNumericSuffix(c)) {
            state = State.END;
            break;
          }
          if(Character.isDigit(c)) {
            break;
          }
          return false;
  
        case EXPONENT_SIGN:
          if(c == '-' || c == '+') {
            state = State.EXPONENT;
            break;
          }
          if(Character.isDigit(c)) {
            break;
          }
          return false;
  
        case EXPONENT:
          if(isNumericSuffix(c)) {
            state = State.END;
            break;
          }
          if(Character.isDigit(c)) {
            break;
          }
          return false;
  
        case END:
          return false;
  
        default:
          throw new IllegalStateException();
        }
  
      }
      return true;
    }