web-dev-qa-db-fra.com

Validation des entrées à l'aide de Java.util.Scanner

Je prends l'entrée d'utilisateur de System.in en utilisant un Java.util.Scanner. Je dois valider les entrées pour des choses comme:

  • Ce doit être un nombre non négatif
  • Ce doit être une lettre alphabétique
  • ... etc

Quelle est la meilleure façon de faire cela?

38
bhavna raghuvanshi

Voici une façon minimaliste de le faire.

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
3
Dylan Sharhon

Pour vérifier les chaînes de caractères des lettres, vous pouvez utiliser des expressions régulières, par exemple:

someString.matches("[A-F]");

Pour vérifier les nombres et arrêter le blocage du programme, j'ai une classe assez simple que vous pouvez trouver ci-dessous, dans laquelle vous pouvez définir la plage de valeurs que vous souhaitez . Ici

    public int readInt(String Prompt, int min, int max)
    {
    Scanner scan = new Scanner(System.in);

    int number = 0;

    //Run once and loop until the input is within the specified range.
    do 
    {
        //Print users message.
        System.out.printf("\n%s > ", Prompt);

        //Prevent string input crashing the program.
        while (!scan.hasNextInt()) 
        {
            System.out.printf("Input doesn't match specifications. Try again.");
            System.out.printf("\n%s > ", Prompt);
            scan.next(); 
        }

        //Set the number.
        number = scan.nextInt();

        //If the number is outside range print an error message.
        if (number < min || number > max)
            System.out.printf("Input doesn't match specifications. Try again.");

    } while (number < min || number > max);

    return number;
}
3
Duane

Une idée:

try {
    int i = Integer.parseInt(myString);
    if (i < 0) {
        // Error, negative input
    }
} catch (NumberFormatException e) {
    // Error, not a number.
}

Il existe également, dans commons-lang library la classe CharUtils qui fournit les méthodes isAsciiNumeric() pour vérifier qu'un caractère est un nombre, et isAsciiAlpha() pour vérifier que le caractère est une lettre ...

1
Romain Linsolas

ce que j’ai essayé, c’est que j’ai d’abord pris l’entrée entière et vérifié que sa valeur soit négative ou non, si elle est négative, prenez à nouveau la

Scanner s=new Scanner(System.in);

    int a=s.nextInt();
    while(a<0)
    {
    System.out.println("please provide non negative integer input ");
    a=s.nextInt();
    }
    System.out.println("the non negative integer input is "+a);

Ici, vous devez commencer par saisir le caractère et vérifier si l’utilisateur a donné ou non un caractère, sinon, saisir à nouveau le caractère. 

    char ch = s.findInLine(".").charAt(0);
    while(!Charcter.isLetter(ch))
    {
    System.out.println("please provide a character input ");
    ch=s.findInLine(".").charAt(0);
    }
    System.out.println("the character  input is "+ch);
0

Si vous analysez des données de chaîne depuis la console ou similaire, le meilleur moyen consiste à utiliser des expressions régulières. En savoir plus sur cela ici: http://Java.Sun.com/developer/technicalArticles/releases/1.4regex/

Sinon, pour analyser un int d'une chaîne, essayez Integer.parseInt (string) . Si la chaîne n'est pas un nombre, vous obtiendrez une exception. Sinon, vous pouvez ensuite vérifier votre valeur pour vous assurer qu'elle n'est pas négative.

String input;
int number;
try
{
    number = Integer.parseInt(input);
    if(number > 0)
    {
        System.out.println("You positive number is " + number);
    }
} catch (NumberFormatException ex)
{
     System.out.println("That is not a positive number!");
}

Pour obtenir une chaîne de caractères uniquement, il serait probablement préférable de boucler chaque caractère en vérifiant les chiffres, en utilisant par exemple Character.isLetter (char) .

String input
for(int i = 0; i<input.length(); i++)
{
   if(!Character.isLetter(input.charAt(i)))
   {
      System.out.println("This string does not contain only letters!");
      break;
   }
}

Bonne chance!

0
mahju