Как преобразовать тип String в Int?
Нужно, чтобы условие проверяло два числа из массива, и если хотя бы одно из двух чисел будет с плавающей точкой, выбрасывалось исключение.
Но при срабатывании когда isDouble приравнивает число, введенное пользователем, проводит try и сравнивает число, допустим, 5 и 5-ку, преобразованную в тип Double, они приравниваются и исключение всегда выбрасывается.
Подскажите, пожалуйста, как исправить.
if (isDouble(h[0]) || isDouble(h[1])) {
throw new Exception("Вводите только целые числа!");
}
public static boolean isDouble(String s) {
try {
Double.parseDouble(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
Ответы (1 шт):
Не совсем понятно, зачем проверять, что строка содержит число типа double, если в условии требуется проверить, чтобы это число было целым, то есть такая строка по определению не может содержать никакие символы кроме цифр и опционально знака - или +.
Строки, содержащие десятичную точку, уже не являются целыми, даже если их дробная часть нулевая ("5.000") или отсутствует ("3.").
При этом не всякая строка, содержащая только десятичные цифры, может быть преобразована в целое число, которое поместится в диапазон значений типа int: [-231, 231 - 1] или даже long [-263, 263 - 1].
Поэтому в наиболее общем случае следует использовать регулярное выражение, чтобы проверять целые числа произвольной длины (ограниченные максимально допустимой длиной строки)
// целое число (со знаком или без) любой длины
public static boolean isDecimalInteger(String s) {
return s != null && s.matches("[+-]?\\d+"); // \d - десятичные цифры
}
Если же известно, что строка содержит целые числа из ограниченного диапазона типа int, можно воспользоваться обычным методом Integer::parseInt, который обеспечит проверку, что в строке записано 32-битное знаковое целое (в десятичной системе).
// целое знаковое число
public static boolean isSignedInt(String s) {
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException | NullPointerException e) {
return false;
}
}
Такой метод вернёт false для "3000000000".
Также есть возможность "расширить" диапазон на 1 бит, проверяя беззнаковое число при помощи Integer::parseUnsignedInt, тогда в него попадут числа [0, 232 - 1], т.е. "3000000000" считается целым, а "-1" - уже нет.
public static boolean isUnsignedInt(String s) {
try {
Integer.parseUnsignedInt(s);
return true;
} catch (NumberFormatException | NullPointerException e) {
return false;
}
}
Теперь, определив методы для проверки целых чисел, следует переписать условие для выбрасывания исключения в исходном коде, с использованием нужного метода проверки, например:
// ...
if (!isSignedInt(h[0]) || !isSignedInt(h[1])) {
throw new Exception("Вводите только целые числа!");
}