Как я могу проверить, является ли строка строкой, а не целым числом в Java?

1

Я ввожу список в JTextArea, и когда я нажимаю кнопку, он запускает метод ниже. Мне нужно проверить, является ли str[i+1], str[i+2] String а не int.

public void readData(JTextArea input) {
    String[] str = input.getText().split("\n");
    for(int i =1; i< str.length; i= i+3) {
        try {
            Integer.parseInt(str[i]);
            simulator.add(new Process(Integer.parseInt(str[i]), str[i+1],str[i+2])); 
        } catch(NumberFormatException e) {
            System.out.println("Please enter an integer only " +
                                str[i] + " is not an integer");
        }
    }
}
  • 0
    Это, конечно, строка, так как вы получаете текст из JTextArea.
Теги:
validation
try-catch

5 ответов

3

У вас может быть функция, которая пытается проанализировать строку в Integer или Double и возвращать true, если она преуспела, или вернуть false - исключение было выбрано во время разбора. Парсинг в Double должен быть достаточным, так как все целочисленные значения являются десятичными значениями без.0

public static boolean isNumber(String s) {
    try {  
        Double.parseDouble(s);
        /* Use Integer.parseInt(s) instead, if
           you want to check if the String s
           is an Integer */
    } catch(NumberFormatException e) { // string is not a number
        return false; 
    }
    return true;
}

Тогда вы можете сказать if(!isNumber(str)) чтобы проверить, не является ли String числом.

В качестве альтернативы вы можете сделать isNumber() be isNotNumber(), заменив return false и return true.

Если вы не хотите использовать исключения, другой подход будет следующий. Поскольку мы знаем, что действительное число может содержать только цифры и не более 1 точки для десятичной точки, мы можем перебирать строку и проверять каждый символ:

  • если это не цифра, а не точка, верните false
  • если это точка, но точка уже найдена, верните false
  • в противном случае это действительный номер символа, и мы ничего не делаем

Вот примерная функция:

public static boolean isNumber(String s) {
    int dotCount = 0;
    for(int i = 0; i < s.length(); i++) {
        if(s.charAt(i) != '.' && !Character.isDigit(s.charAt(i))) {
            return false;
        } else if(s.charAt(i) == '.') {
            if(dotCount == 1) {
                return false;
            }
            dotCount = 1;
        }
    }
    return true;
}

EDIT: на основе предложений @MadProgrammer:

Более общий подход, который будет принимать значения, разделенные запятыми, например, 1,35 или любое количество пробелов в числовой строке, например, с помощью 123 456. 333 123 456. 333.

Подход:

Итерируйте по строке и проверьте для каждого символа:

  • если это не цифра, точка, запятая или пробел, верните false
  • если это точка или запятая, но один из них уже найден, верните false
  • в противном случае это действительный номер символа, и мы ничего не делаем

Таким образом, код будет выглядеть примерно так:

public static boolean isNumber(String s) {
    int separatorCount = 0; // count dots and commas
    char currChar;
    s.trim();  // remove trailing and leading whitespace
    for (int i = 0; i < s.length(); i++) {
        currChar = s.charAt(i);
        if (currChar != '.' && currChar != ',' && currChar != ' '
                && !Character.isDigit(currChar)) {
            return false;
        } else if (currChar == '.' || currChar == ',') {
            if (separatorCount == 1) {
                return false;
            }
            separatorCount = 1;
        }
    }
    return true;
}

Другое решение может использовать NumberFormat parse() NumberFormat. Однако этот метод проверяет только начало строки (например, для 12.3.3 он вернет 12.3), поэтому нам нужно вернуть значение false, если возвращаемая строка не равна входной строке, а также, если ParseException.

public static boolean isNumber(String s) {
    try {
        String newVal = NumberFormat.getInstance().parse(s).toString();
        if (!newVal.equals(s)) {
            return false;
        }
    } catch (ParseException e) {
        return false;
    }
    return true;
}

ПРИМЕЧАНИЕ. Все методы должны, вероятно, иметь проверку, if(s == null) { return false; } if(s == null) { return false; } для входной String для предотвращения исключения NullPointerException

  • 0
    Вы можете попробовать использовать NumberFormat вместо использования значения isNumber ... как идея;)
  • 0
    @MadProgrammer Я предполагаю, что это не будет работать для каждого значения. В документах для NumberFormat.getInstance (). Parse () говорится: Parses text from the beginning of the given string to produce a number. The method may not use the entire text of the given string. и если я анализирую 12.3.3 это не вызывает исключения. Это то, что вы имели в виду?
Показать ещё 5 комментариев
2

Вы можете попробовать это простое регулярное выражение, чтобы проверить, соответствует ли строка числу или нет:

String str = "12345";
System.out.println(str.matches("\\d+"));
  • 0
    @ Bohemian спасибо за редактирование
2

Ваши правила разрежены, вы не указываете, если такие вещи , или . считаются частью числа или нет (например, 1, 000.01), также вы не определяете, разрешено ли значение содержать числовые значения или нет, но...

Ты мог...

Попробуйте разобрать каждое значение (или Integer.parseInt их) с помощью Integer.parseInt, если они пройдут, то они не являются значениями String (или text)...

Ты мог...

Проверьте каждый символ в String чтобы увидеть, содержит ли он больше, чем просто цифры, используя что-то вроде Character#isLetter

Ты мог...

Используйте регулярное выражение, чтобы определить, содержит ли значение другой контент, отличный от числа.

0

Это простой тест, который утверждает, что есть хотя бы один нецифровой символ:

if (str.matches(".*[^\\d.].*"))

regex переводится как "где-то на входе есть символ, который не является цифрой или точкой"

0

Regex кажется лучшим вариантом. Здесь регулярное выражение, которое будет анализировать float и целые числа и значения валюты с запятой.

 String numberRex = "^([\\d]*\\.*\\d*|[\\d,]*\\.*\\d*)$";
 "1234,455.43".matches(numberRex); // true

Ещё вопросы

Сообщество Overcoder
Наверх
Меню