Pour une chose que vous devez utiliser les Character
méthodes pour ce faire plutôt qu'une solution de Home Grown, à savoir Character.isDigit()
pour vérifier la validité et Character.digit()
pour obtenir une valeur:
char c = ...
if (Character.isDigit(c)) {
// it's a digit
}
int value = Character.digit(c, 10);
Pourquoi vous obtenez cet avertissement est expliqué par 5.6.2 Binary Numeric Promotion de la Java Language Specification:
Lorsqu'un opérateur applique binaire promotion numérique à une paire de opérandes, dont chacun doit dénoter une valeur d'un type numérique, les règles suivantes appliquent, dans l'ordre, en utilisant l'élargissement conversion (§5.1.2) pour convertir opérandes nécessaire:
- Si l'un des opérandes est de type
double
, l'autre est converti en double
.
- Sinon, si l'un des opérandes est de type
float
, l'autre est converti en float
.
- Sinon, si l'un des opérandes est de type
long
, l'autre est converti en long
.
- Sinon, les deux opérandes sont convertis en type
int
.
Alors ce qui se passe est que lorsque vous faites la soustraction des deux arguments sont promus à int
s. Le résultat est un int
. Lorsque vous essayez et attribuez que int
à char
il y a une perte de précision possible (32 bits signé à 16 bits non signé).
Une technique de validation alternative est simplement d'utiliser une expression régulière:
if (s.matches("\\d\\d-\\d\\d")) {
// it's ##-##
}
ou, si vous devez saisir les groupes:
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
}
Votre soustraction, même lorsqu'elle est lancée correctement, réduira les valeurs char 0, 1, 2 ... 9 à binaire 0, 1, 2 ... 9. Toute valeur inférieure à '0' deviendra réellement négative, mais char est une valeur non signée. Ce que vous essayez de faire n'est pas valide et n'a pas de sens. Utilisez ce que suggère Cletus. Voyez ma réponse si vous voulez vraiment faire cela. –