За одну вещь, которую вы должны использовать Character
методы для этого, а не решение домашнего выращенного, а именно Character.isDigit()
для проверки достоверности и Character.digit()
для получения значения:
char c = ...
if (Character.isDigit(c)) {
// it's a digit
}
int value = Character.digit(c, 10);
Почему вы получаете это предупреждение объясняется 5.6.2 Binary Numeric Promotion от Java Language Specification:
Когда оператор применяет двоичной числовой продвижение к паре операндов, каждый из которых должен обозначать значения числового типа, следующие правил применяются в порядке, используя расширение преобразование (§5.1.2) для преобразования операнды по мере необходимости:
- Если один из операндов имеет тип
double
, другой преобразуется в double
.
- В противном случае, если один из операндов имеет тип
float
, другой преобразовано в float
.
- В противном случае, если один из операндов имеет тип
long
, другой преобразован в long
.
- В противном случае оба операнда преобразуются в тип
int
.
Так что происходит, что когда вы делаете вычитание оба аргумент продвигается к int
с. Результатом является int
. При попытке назначить int
на char
возможна потеря точности (32-разрядная до 16 бит без знака).
Альтернативный метод проверки просто использовать регулярное выражение:
if (s.matches("\\d\\d-\\d\\d")) {
// it's ##-##
}
или, если вам нужно, чтобы захватить группы:
Pattern p = Pattern.compile("(\\d\\d)-(\\d\\d)");
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(m.group(1)); // first group
System.out.println(m.group(1)); // second group
}
Ваше вычитание, даже если оно выполнено правильно, уменьшит значения char 0, 1, 2 ... 9 до двоичных чисел 0, 1, 2 ... 9. Любое значение ниже «0» фактически станет отрицательным, но char будет значением без знака. То, что вы пытаетесь сделать, недействительно и не имеет смысла. Используйте то, что предлагает cletus. См. Мой ответ, если вы действительно хотите это сделать. –