Я ввожу список в 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");
}
}
}
У вас может быть функция, которая пытается проанализировать строку в 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 точки для десятичной точки, мы можем перебирать строку и проверять каждый символ:
Вот примерная функция:
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
.
Подход:
Итерируйте по строке и проверьте для каждого символа:
Таким образом, код будет выглядеть примерно так:
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
NumberFormat
вместо использования значения isNumber
... как идея;)
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
это не вызывает исключения. Это то, что вы имели в виду?
Вы можете попробовать это простое регулярное выражение, чтобы проверить, соответствует ли строка числу или нет:
String str = "12345";
System.out.println(str.matches("\\d+"));
Ваши правила разрежены, вы не указываете, если такие вещи ,
или .
считаются частью числа или нет (например, 1, 000.01
), также вы не определяете, разрешено ли значение содержать числовые значения или нет, но...
Попробуйте разобрать каждое значение (или Integer.parseInt
их) с помощью Integer.parseInt
, если они пройдут, то они не являются значениями String
(или text)...
Проверьте каждый символ в String
чтобы увидеть, содержит ли он больше, чем просто цифры, используя что-то вроде Character#isLetter
Используйте регулярное выражение, чтобы определить, содержит ли значение другой контент, отличный от числа.
Это простой тест, который утверждает, что есть хотя бы один нецифровой символ:
if (str.matches(".*[^\\d.].*"))
regex переводится как "где-то на входе есть символ, который не является цифрой или точкой"
Regex кажется лучшим вариантом. Здесь регулярное выражение, которое будет анализировать float и целые числа и значения валюты с запятой.
String numberRex = "^([\\d]*\\.*\\d*|[\\d,]*\\.*\\d*)$";
"1234,455.43".matches(numberRex); // true