Проблемы с проверкой Java для пользовательского ввода - PullRequest
0 голосов
/ 20 октября 2018

Я знаю, что было много вопросов по проверке входных данных для Java, но независимо от того, что я читаю, я просто не могу заставить это работать.Я хотел бы, чтобы пользователь вводил дату рождения как (ММ ДД ГГГГ).Я хотел проверить, что

  1. только введенные пользователем цифры
  2. они сделали правильное количество цифр и
  3. цифры попали в правильный диапазон.

В моей первой попытке у меня были переменные типа int, но я не мог объединить hasNextInt() с длиной и диапазоном цифр.Затем я увидел сообщение, в котором говорится, что нужно использовать строковую переменную, а затем использовать Integer.parseInt().Я думал, что это будет хорошо работать, если я использую (!month.matches("0[1-9]") || !month.matches("1[0-2]"), потому что он, кажется, удовлетворяет все мои пожелания проверки.Я попробовал это в заявлении while, но оно попало в неопределенный цикл.Затем я попытался преобразовать этот код в оператор if ... else и окружить его оператором while(false).Тем не менее, теперь он выдает ошибку вместо того, чтобы перейти к моему утверждению, в котором говорится исправить вашу ошибку.Вот как выглядит мой код на данный момент:

import java.util.Scanner; //use class Scanner for user input

public class BD {
    private static Scanner input = new Scanner(System.in); //Create scanner

    public static void main(String[] args){
        //variables
        String month;
        int birthMonth;
        String day;
        int birthDay;
        String year;
        int birthYear;
        boolean correct = false;

        //prompt for info
        System.out.print("Please enter your date of birth as 2 digit "+
            "month, 2 digit day, & 4 digit year with spaces in-between"+
            " (MM DD YYYY): ");
        month = input.next();
        //System.out.printf("%s%n", month);  //test value is as expected
        day = input.next();
        year = input.next();

        //validate month value
        while (correct = false){
            if(!month.matches("0[1-9]") || !month.matches("1[0-2]")){
                System.out.println("Please enter birth month as "+
                    "a 2 digit number: ");
                month = input.next();
                //System.out.printf("%s%n", month);
            }
            else {
                correct = true;
            }
        }

        //turn strings into integers
        birthMonth = Integer.parseInt(month);
        birthDay = Integer.parseInt(day);
        birthYear = Integer.parseInt(year);

        //check values are correct
        System.out.printf("%d%d%d", birthMonth, birthDay, birthYear);
    }
}

Любая помощь будет принята с благодарностью.Я также хотел бы попытаться выполнить эту проверку без каких-либо блоков try / catch, поскольку они кажутся слишком громоздкими.Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Если вы хотите использовать regex, вы можете попробовать это

    while(!(Pattern.matches("(0)[1-9]{1}|(1)[0-2]",month)))
    {
           System.out.println("Enter again \n");
           month=input.next();
    }

Чтобы этот код работал, вам необходимо включить пакет regex, используя это в начале вашей программы

  import java.util.regex.*;

Наше регулярное выражение состоит из двух частей: " (0) [1-9] {1} ". Сначала необходимо убедиться, что строка содержит "0", а затем любые цифры от 1 до 9.И « {1} » обеспечит, чтобы это произошло только один раз.

Аналогичным образом напишите код для дня и года, если требуется.

0 голосов
/ 20 октября 2018

Использовать DateTimeFormatter примерно так:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");

try {
    LocalDate date = LocalDate.parse(input, formatter);
} catch (DateTimeParseException e) {
    // Thrown if text could not be parsed in the specified format
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...