Как проверить строку, введенную пользователем?(Джава) - PullRequest
1 голос
/ 24 февраля 2012

Я редактировал этот вопрос, но в нижней части программы я пытался закодировать оператор switch для проверки некоторого кода. Я пытаюсь попросить пользователя ввести Y / N, чтобы продолжить. Если они введут Y, программа должна перезапуститься. Если они введут N, программа должна завершиться. Если они введут Z, они должны получить сообщение об ошибке и получить запрос снова, продолжая y / n? Прямо сейчас, если я набрал случайное письмо, меня отправили обратно в раздел ввода данных, и я не уверен, почему.

Также я заметил, что мои расчеты выключены. Я предполагаю, что это как-то связано с тем, что я не использую класс bigdecimal. В настоящее время, если я набрал 5.6 для процента, это автоматически предполагает, что это 560%

Я новичок в Java и, к сожалению, борюсь. Кто-то был достаточно любезен, чтобы помочь мне прошлой ночью, без явного предоставления мне ответов, которые я оценил, потому что это заставило меня разбираться с вещами самостоятельно

Любая помощь определенно ценится, так как мне тяжело с этим классом.

import java.util.Scanner;
import java.text.NumberFormat;

public class LoanCalculator
{
    public static double getDoubleWithinRange(Scanner sc, String prompt, double min, double max) //validate double
    {
        double d = 0;
        boolean isValid = false;
        while(isValid == false)
        {
            System.out.println(prompt); //print prompt for double
            if (sc.hasNextDouble())
            {
                d = sc.nextDouble();

                if (d <= min) //if input <= minimum double
                {
                    System.out.println("Error! Number must be greater than " + min);
                    System.out.println();//print error grater than min double
                }
                else if (d >= max) // if input >= maximum double value 
                {
                    System.out.println("Error number must be less than " + max);
                    System.out.println();//print error less than max double value
                }
                else
                    isValid = true; //else double is valid
            }
            else
            {
                System.out.println("Error! Invalid decimal value.");
                System.out.println();
                sc.nextLine();
            }
        }

        return d; //return double
    }
    //validate integer
    public static int getIntWithinRange(Scanner sc, String prompt, int min, int max)
    {
        int i = 0;
        boolean isValid = false;
        while(isValid == false)
        {
            System.out.println(prompt); //print prompt for integer
            if (sc.hasNextInt())
            {
                i = sc.nextInt();

                if (i <= min) //if input <= minimum integer
                {
                    System.out.println("Error! Number must be greater than " + min);
                    System.out.println();//print error grater than min integer
                }
                else if (i >= max) // if input >= maximum integer value
                {
                    System.out.println("Error number must be less than " + max);
                    System.out.println();//print error less than max integer value
                }
                else
                    isValid = true; //else integer is valid
            }
            else
            {
                System.out.println("Error! Invalid integer value.");
                System.out.println();
                sc.nextLine();
            }
        }

        return i; //return integer
    }

    public static void main(String[] args)
    {
        System.out.println("Welcome to the loan calculator"); //welcome user to loan calculator
        Scanner sc = new Scanner(System.in); // create new scanner
        String choice = "y"; //start choice loop
        while (choice.equalsIgnoreCase("y"))
        {
            System.out.println();
            System.out.println("DATA ENTRY");
            double loanAmount = getDoubleWithinRange(sc, "Enter loan amount: ", 0.0, 1000000.0); //get user input for loanAmount
            //get user input for interestRate
            double interestRate = getDoubleWithinRange(sc, "Enter yearly interest rate: ", 0, 20);
            //get user input for years
            int years = getIntWithinRange(sc, "Enter number of years: ", 0, 100);
            int months = years * 12; // calculate years to months
            //calculate monthly payment
            double monthlyPayment = loanAmount * interestRate/ (1 - 1 / Math.pow(1 + interestRate, months));
            //import currency instance
            NumberFormat currency = NumberFormat.getCurrencyInstance();
            // import percent instance
            NumberFormat percent = NumberFormat.getPercentInstance();
            percent.setMinimumFractionDigits(1); //set fraction digits for percent
            System.out.println("RESULST"); //print results
            //print loanAmount
            System.out.println("Loan Amount: " + currency.format(loanAmount));
            //print interestRate
            System.out.println("Yearly interest rate: " + percent.format(interestRate));
            System.out.println("Number of years: " + years); //print years
            //print monthlyPayment
            System.out.println("Monthly payment: " + currency.format(monthlyPayment));

            boolean quit = false;
            do {
                System.out.println();
                System.out.println("Continue? (y/n): "); //prompt user to continue
                String userinput1 = sc.next();

                char choice1 = userinput1.toLowerCase().charAt(0); 
                switch (choice1) {
                    case 'y':
                        break;
                    case 'n':
                        // case n, do something here
                        quit = true;
                        break;
                    case ' ':
                        System.out.println("Error! This entry is required. Try again.");
                        break;
                    default:
                        System.out.println("Error! Entry must be 'y or 'n''");
                        break;
                }
            } while (!quit);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Используйте switch вот так:

boolean quit = false;
do{ // change your while by this

    // your own stuff here


    // then after all your program stuff
    boolean choiceIsOK = false;
    do{
    String userinput = sc.next();
    char choice = userinput.toLowerCase().charAt(0);
    switch(choice){
    case 'y':
        // case y, do nothing, you could even remove that case.
        choiceIsOK = true;
        break;
    case 'n':
        // case n, do something here
        choiceIsOK = false;
        quit = true;
        break;
    default:
        // error or warning
        System.out.println("Type Y or N to respectively continue or quit");
        break;
    }
    }while(!choiceIsOK);
}while (!quit);

В вашем коде это будет выглядеть так:

public static void main(String[] args)
{
System.out.println("Welcome to the loan calculator"); //welcome user to loan calculator
Scanner sc = new Scanner(System.in); // create new scanner
//String choice = "y"; //start choice loop [no need for that line anymore]
boolean quit = false; 
do{
        System.out.println();
        System.out.println("DATA ENTRY");
        double loanAmount = getDoubleWithinRange(sc, "Enter loan amount: ", 
                0.0, 1000000.0); //get user input for loanAmount
        //get user input for interestRate
        double interestRate = getDoubleWithinRange(sc, 
                "Enter yearly interest rate: ", 0, 20); 
        //get user input for years
        int years = getIntWithinRange(sc, "Enter number of years: ", 0, 100); 
        int months = years * 12; // calculate years to months
        //calculate monthly payment
        double monthlyPayment = loanAmount * interestRate/
                (1 - 1/Math.pow(1 + interestRate, months)); 
        //import currency instance
        NumberFormat currency = NumberFormat.getCurrencyInstance(); 
        // import percent instance
        NumberFormat percent = NumberFormat.getPercentInstance(); 
        percent.setMinimumFractionDigits(1); //set fraction digits for percent 
        System.out.println("RESULST"); //print results 
        //print loanAmount
        System.out.println("Loan Amount: " + currency.format(loanAmount)); 
        //print interestRate
        System.out.println("Yearly interest rate: " + percent.format(interestRate)); 
        System.out.println("Number of years: " + years); //print years
         //print monthlyPayment
        System.out.println("Monthly payment: " + currency.format(monthlyPayment)); 


        // then after all your program stuff
        boolean choiceIsOK = false;
            do{

                System.out.println();
                System.out.println("Continue? (y/n): "); //prompt user to continue 
                String userinput1 = sc.next();
                    char choice1 = userinput1.toLowerCase().charAt(0);
                    switch(choice1){
                    case 'y':
                        // case y, do nothing, you could even remove that case.
                        choiceIsOK = true;
                        break;
                    case 'n':
                        // case n, do something here
                        choiceIsOK = true; // I fixed this
                        quit = true;
                        break;
                    default:
                        // error or warning
                        System.out.println("Type Y or N to respectively continue or quit");
                        break;
                    }
                }while(!choiceIsOK);

    }while(!quit);

    }           
}
1 голос
/ 24 февраля 2012

Вы должны использовать условные выражения, они имеют форму

if(someBooleanCondition){
  doSomething();
}
else{
  doSomethingElse();
}

В вашем случае вы бы использовали функцию String.equals() в качестве логического условия.НЕ == так как это может дать странные результаты со строками.Таким образом, вы должны делать что-то вроде этого.

String userInput = sc.next().toLowerCase();
if(userInput.equals("y")){
 //Its yes, do something here
}
else if(userInput.equals("n")){
 //It's no, do something else
}
else{
  //Handle an invalid entry here
}

Способ иметь этот цикл, чтобы он неоднократно проверял вход:

while(true)
String userInput = sc.next().toLowerCase();
if(userInput.equals("y")){
 //Its yes, do something here
break;
}
else if(userInput.equals("n")){
 //It's no, do something else
 break;
}
else{
  //Handle an invalid entry here
}

Это заставит пользователя продолжать вводитьдо тех пор, пока они не введут Y или N, если вы хотите, чтобы они могли вводить символ новой строки для выхода, или вы можете добавить это в свой цикл.

1 голос
/ 24 февраля 2012

Используйте if оператор,

choice =sc.next().toLowerCase();
if(choice.equals("y"))
 {
  //
 }
else
if(choice.equals("n"))
 {
  //
 }
else
{
 //invalid input
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...