2013-06-04 4 views
0

J'ai un scanner qui lit un code alphanumérique à 7 caractères (entré par l'utilisateur). la variable String est appelée "code".Comparaison de nombres entiers de chaînes Problème

Le dernier caractère du code (7ème caractère, 6ème index) DOIT ÊTRE NUMÉRIQUE, tandis que le reste peut être numérique ou alphabétique. Donc, je cherchais à faire un catch, ce qui empêcherait le reste de la méthode de s'exécuter si le dernier caractère du code était autre qu'un nombre (de 0 à 9).

Cependant, mon code ne fonctionne pas comme prévu, vu que même si mon code se termine par un entier compris entre 0 et 9, l'instruction if sera satisfaite et l'option "dernier caractère du code non-numérique".

exemple de code: 45m4av7

CharacterAtEnd imprime comme le caractère de chaîne 7, comme il se doit mais mon programme me dit encore mon code se termine non numérique Je suis conscient que mes valeurs numériques sont chaîne.. caractères, mais il ne devrait pas importer, devrait-il? aussi je ne peux apparemment pas comparer les valeurs entières réelles avec un "|", qui est principalement pourquoi im utilisant Strin g.valueOf, et en prenant les caractères de chaîne de 0-9.

String characterAtEnd = String.valueOf(code.charAt(code.length()-1)); 
System.out.println(characterAtEnd); 

if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9))){ 
    System.out.println("INVALID CRC CODE: last character in code in non-numerical."); 
    System.exit(0); 

Je ne peux pas pour la vie de moi, de savoir pourquoi mon programme me dit mon code (qui a un 7 à la fin) se termine non numérique. Il devrait ignorer l'instruction if et continuer. droite?

+0

essayez d'utiliser regex. [Lien] (http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/) – SaintLike

+0

Veuillez marquer votre question avec le langage de programmation. – Barmar

+0

http://stackoverflow.com/questions/1223052/how-do-i-find-out-if-first-character-of-a-string-is-a-numéro –

Répondre

0

La méthode Stringcontains fonctionnera ici:

String digits = ""; 
digits.contains(characterAtEnd); // true if ends with digit, false otherwise 

String.valueOf(0|1|2|3|4|5|6|7|8|9) est en fait "15", ce qui bien sûr ne peut jamais être égal au dernier caractère. Cela devrait avoir un sens, car 0|1|2|3|4|5|6|7|8|9 évalue à 15 en utilisant des mathématiques entières, qui est ensuite converti en une chaîne.

Sinon, essayez ceci:

String code = "45m4av7"; 
char characterAtEnd = code.charAt(code.length() - 1); 
System.out.println(characterAtEnd); 

if(characterAtEnd < '0' || characterAtEnd > '9'){ 
    System.out.println("INVALID CRC CODE: last character in code in non-numerical."); 
    System.exit(0); 
} 
+0

est-il possible de dire "ou" dans une if-instruction utilisant des entiers? comme si (quelquechose.équal (1 ou 2 ou 3 ou 4 ou 5)) { alors faites ceci; } Merci beaucoup pour votre aide! – SmashAdams

+1

La langue '||' est réservée pour faire des combinaisons logiques de booléens. Donc vous devriez aller 'characterAtEnd.equals (" 0 ") || characterAtEnd.equals ("1") || ... ' –

+0

C'est pourquoi je pars pour l'approche logistique. Je crée l'ensemble de tous les caractères de fin acceptés, et vérifie si le dernier caractère est dans l'ensemble acceptable, et retourne faux si c'est autre chose. Il a l'or-logique, sans utiliser explicitement ou. –

0

Vous faites des opérations au niveau du bit ici: if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9)))

Vérifiez la différence entre | et ||

Ce morceau de code doit accomplir votre tâche à l'aide régulière expressions:

String code = "45m4av7"; 

if (!code.matches("^.+?\\d$")){ 
    System.out.println("INVALID CRC CODE"); 
} 

En outre, pour référence, cette méthode est quelque fois utile dans des situations similaires:

/* returns true if someString actually ends with the specified suffix */ 
someString.endsWith(suffix); 

Comme .endswith(suffix) ne prend pas des expressions régulières, si vous vouliez passer par toutes les valeurs possibles de l'alphabet inférieur de cas, vous auriez besoin de faire quelque chose comme ceci:

/* ASCII approach */ 
String s = "hello"; 
boolean endsInLetter = false; 
for (int i = 97; i <= 122; i++) { 
    if (s.endsWith(String.valueOf(Character.toChars(i)))) { 
     endsInLetter = true; 
    } 
} 
System.out.println(endsInLetter); 

/* String approach */ 
String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
boolean endsInLetter2 = false; 
for (int i = 0; i < alphabet.length(); i++) { 
    if (s.endsWith(String.valueOf(alphabet.charAt(i)))) { 
     endsInLetter2 = true; 
    } 
} 
System.out.println(endsInLetter2); 

Notez que ni des approches mentionnées ci-dessus sont une bonne idée - ils sont maladroits et plutôt inefficaces.

Allant au large de l'approche ASCII, vous pouvez même faire quelque chose comme ceci:

référence ASCII: http://www.asciitable.com/

int i = (int)code.charAt(code.length() - 1); 

/* Corresponding ASCII values to digits */ 
if(i <= 57 && i >= 48){ 
    System.out.println("Last char is a digit!"); 
} 

Si vous voulez un one-liner, bâton à des expressions régulières, par exemple:

System.out.println((!code.matches("^.+?\\d$")? "Invalid CRC Code" : "Valid CRC Code")); 

J'espère que cela aide!

+0

Salut! Merci pour votre réponse. J'ai essayé d'utiliser la méthode .endsWith que vous avez mentionnée, et cela semble avoir bien fonctionné. Ma seule préoccupation est qu'il semble que je devrais recopier la ligne de code 26 fois pour chaque lettre de l'alphabet. Alors que je voudrais vraiment pouvoir dire "si le code se termine par a ou b ou c ou d ... etc alors imprime" code invalide "Donc, je pourrais avoir tout bien dans une déclaration if. Est-ce possible? aussi, je me demandais si pour la méthode .matches, si elle regarde ce que les éléments dans les parenthèses sont individuellement, ou dans son ensemble? – SmashAdams

+0

malheureusement endswith (suffixe) ne prend pas d'expressions régulières (à ma connaissance), et si vous vouliez vérifier chaque lettre de l'alphabet, vous pourriez utiliser une boucle (bien que ce soit un peu maladroit.) En ce qui concerne la méthode .matches, elle regarde le dernier élément pour s'assurer qu'il s'agit d'une décimale. J'ai modifié mon affichage pour vous aider =) Bonne chance! –

Questions connexes