Повторное приглашение до ввода правильного формата данных

#java #while-loop

#java #цикл while

Вопрос:

Я написал этот код для своего проекта курса Java, который получает номер телефона в 1800 БУКВАХ и выводит номер как 1-800-538-8377. То, с чем я борюсь, заключается в том, что я хочу продолжать запрашивать, пока пользователь не введет номер телефона в правильном формате (1800 БУКВ). Я знаю, что я должен использовать цикл while, но я не знаю, куда его подключить. Также программа не должна запускаться, пока пользователь не введет правильный формат, в противном случае код выдает некоторые исключения. Я думаю, что если я использую цикл while в правильном месте, пользователь не сможет ввести неверный ввод. Я ценю вашу помощь. Вот мой код:

 import java.util.Scanner;

public class PhoneNumberConverter {

    public static boolean isValidPhoneNumber(String phoneNumber) {
        if (phoneNumber.matches("\d{4}\w{7}"))
            return true;
        else if (phoneNumber.matches("\d{1}\d{3}\w{7}"))
            return true;
        else
            return false;
    }
    
    public static int translatePhoneNumber (String phoneNumber, int firstIndex, int lastIndex) {
    
        int chartoNumber = 'A';
        int currentIndex;   
        if (firstIndex == 0) {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                chartoNumber =  phoneNumber.charAt(currentIndex);
                char number = (char) chartoNumber;
                System.out.print(number);
            }   
        } 
        else if (firstIndex == 1) {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                chartoNumber =  phoneNumber.charAt(currentIndex);
                char number = (char) chartoNumber;
                System.out.print(number);
            }   
        } 
        else {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                if (phoneNumber.charAt(currentIndex) == 'A' || phoneNumber.charAt(currentIndex) == 'B' || phoneNumber.charAt(currentIndex) == 'C' )
                    chartoNumber = 2;
                else if (phoneNumber.charAt(currentIndex) == 'D' || phoneNumber.charAt(currentIndex) == 'E' || phoneNumber.charAt(currentIndex) == 'F' )
                    chartoNumber = 3;
                else if (phoneNumber.charAt(currentIndex) == 'G' || phoneNumber.charAt(currentIndex) == 'H' || phoneNumber.charAt(currentIndex) == 'I' )
                    chartoNumber = 4;
                else if (phoneNumber.charAt(currentIndex) == 'J' || phoneNumber.charAt(currentIndex) == 'K' || phoneNumber.charAt(currentIndex) == 'L' )
                    chartoNumber = 5;
                else if (phoneNumber.charAt(currentIndex) == 'M' || phoneNumber.charAt(currentIndex) == 'N' || phoneNumber.charAt(currentIndex) == 'O' )
                    chartoNumber = 6;
                else if (phoneNumber.charAt(currentIndex) == 'P' || phoneNumber.charAt(currentIndex) == 'Q' || phoneNumber.charAt(currentIndex) == 'R' || phoneNumber.charAt(currentIndex) == 'S' )
                    chartoNumber = 7;
                else if (phoneNumber.charAt(currentIndex) == 'T' || phoneNumber.charAt(currentIndex) == 'U' || phoneNumber.charAt(currentIndex) == 'V' )
                    chartoNumber = 8;
                else if (phoneNumber.charAt(currentIndex) == 'W' || phoneNumber.charAt(currentIndex) == 'X' || phoneNumber.charAt(currentIndex) == 'Y' || phoneNumber.charAt(currentIndex) == 'Z' )
                    chartoNumber = 9;
                else
                    chartoNumber =  phoneNumber.charAt(currentIndex);
                
                    System.out.print(chartoNumber);     
                }
        }
        return chartoNumber;    
    }   
    public static void main(String[] args) {
        
        System.out.println("Enter a phone number to convert:");
        Scanner input = new Scanner(System.in);
        String enteredNumber = input.next();
        String phoneNumber = enteredNumber.toUpperCase();
        
        boolean validationResult = isValidPhoneNumber(phoneNumber);
        System.out.println(validationResult);
        input.close();
        
        translatePhoneNumber (phoneNumber, 0, 1);
        System.out.print("-");
        
        translatePhoneNumber (phoneNumber, 1, 4);
        System.out.print("-");
        
        translatePhoneNumber (phoneNumber, 4, 7);
        System.out.print("-");
        
        translatePhoneNumber (phoneNumber, 7, 11);
    }
}
  

Ответ №1:

Вам не обязательно использовать цикл while здесь.

Вы можете создать функцию для получения входных данных, проверки их и возврата, если они действительны. Если это недопустимо, создайте исключение и при обработке исключений снова вызовите функцию.

     public string getInput() {
    try{
        Scanner input = new Scanner(System.in);
        String enteredNumber = input.next();
        if(!isValidPhoneNumber(enteredNumber)
           throw new InputMismatchException("Wrong Format");
        else
           return enteredNumber;
    } catch (InputMismatchException ex){
       return getInput();
    }
}
  

Затем вызовите GetInput там, где String enteredNumber = input.next(); был ваш оригинал

итак

 String enteredNumber = getInput()
  

Если пользователь вводит неверный ввод, функция будет вызываться до тех пор, пока не будет предоставлен правильный ввод.

Комментарии:

1. Не могли бы вы уточнить, где в моем коде должна быть вставлена ваша правка? Кажется, я не подключаю его в нужное место.

2. Само определение метода будет отправлено туда, куда вы хотите. Поместите это в конец вашего кода, если хотите. Вызов метода заменит строку, в которой вы назначили введенный номер равным вводимому пользователем. В ВАШЕМ коде у вас есть строка строкиnumber = input.next() . Замените это строкой, введенной Number = GetInput();

Ответ №2:

 import java.util.Scanner;

public class PhoneNumberConverter {

    public static boolean isValidPhoneNumber(String phoneNumber) {
        if (phoneNumber.matches("\d{4}\w{7}"))
            return true;
        else if (phoneNumber.matches("\d{1}\d{3}\w{7}"))
            return true;
        else
            return false;
    }

    public static int translatePhoneNumber (String phoneNumber, int firstIndex, int lastIndex) {

        int chartoNumber = 'A';
        int currentIndex;
        if (firstIndex == 0) {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                chartoNumber =  phoneNumber.charAt(currentIndex);
                char number = (char) chartoNumber;
                System.out.print(number);
            }
        }
        else if (firstIndex == 1) {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                chartoNumber =  phoneNumber.charAt(currentIndex);
                char number = (char) chartoNumber;
                System.out.print(number);
            }
        }
        else {
            for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex  ) {
                if (phoneNumber.charAt(currentIndex) == 'A' || phoneNumber.charAt(currentIndex) == 'B' || phoneNumber.charAt(currentIndex) == 'C' )
                    chartoNumber = 2;
                else if (phoneNumber.charAt(currentIndex) == 'D' || phoneNumber.charAt(currentIndex) == 'E' || phoneNumber.charAt(currentIndex) == 'F' )
                    chartoNumber = 3;
                else if (phoneNumber.charAt(currentIndex) == 'G' || phoneNumber.charAt(currentIndex) == 'H' || phoneNumber.charAt(currentIndex) == 'I' )
                    chartoNumber = 4;
                else if (phoneNumber.charAt(currentIndex) == 'J' || phoneNumber.charAt(currentIndex) == 'K' || phoneNumber.charAt(currentIndex) == 'L' )
                    chartoNumber = 5;
                else if (phoneNumber.charAt(currentIndex) == 'M' || phoneNumber.charAt(currentIndex) == 'N' || phoneNumber.charAt(currentIndex) == 'O' )
                    chartoNumber = 6;
                else if (phoneNumber.charAt(currentIndex) == 'P' || phoneNumber.charAt(currentIndex) == 'Q' || phoneNumber.charAt(currentIndex) == 'R' || phoneNumber.charAt(currentIndex) == 'S' )
                    chartoNumber = 7;
                else if (phoneNumber.charAt(currentIndex) == 'T' || phoneNumber.charAt(currentIndex) == 'U' || phoneNumber.charAt(currentIndex) == 'V' )
                    chartoNumber = 8;
                else if (phoneNumber.charAt(currentIndex) == 'W' || phoneNumber.charAt(currentIndex) == 'X' || phoneNumber.charAt(currentIndex) == 'Y' || phoneNumber.charAt(currentIndex) == 'Z' )
                    chartoNumber = 9;
                else
                    chartoNumber =  phoneNumber.charAt(currentIndex);

                System.out.print(chartoNumber);
            }
        }
        return chartoNumber;
    }
    public static void main(String[] args) {
        boolean validationResult=false;
        do {
            try{
                System.out.println("Enter a phone number to convert:");
                Scanner input = new Scanner(System.in);
                String enteredNumber = input.next();
                String phoneNumber = enteredNumber.toUpperCase();

                validationResult = isValidPhoneNumber(phoneNumber);
                if(validationResult==false){
                    System.out.println("Entered phone number is incorrect.");
                }
                System.out.println(validationResult);
                input.close();

                translatePhoneNumber(phoneNumber, 0, 1);
                System.out.print("-");

                translatePhoneNumber(phoneNumber, 1, 4);
                System.out.print("-");

                translatePhoneNumber(phoneNumber, 4, 7);
                System.out.print("-");

                translatePhoneNumber(phoneNumber, 7, 11);
                System.out.println();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }while(validationResult==false);
    }
}
  

Комментарии:

1. Я использовал цикл do-while, который является циклом управления выходом. Мы должны запустить код хотя бы один раз, в этом случае цикл do-while предпочтительнее. Надеюсь, это помогло 🙂

2. Код по-прежнему не запрашивает повторно, если пользователь вводит неправильный формат.

3. Надеюсь, это поможет сейчас.