【问题标题】:Only accepting valid inputs in Java and outputting remainder仅接受 Java 中的有效输入并输出余数
【发布时间】:2016-07-22 11:07:45
【问题描述】:

我正在尝试编写接受有效输入的代码(0.05 美元、0.10 美元、0.20 美元、0.50 美元、1.00 美元、2.00 美元、5.00 美元、10.00 美元、20.00 美元、50.00 美元、100.00 美元)并输出任何余数,输出代码类似于:

    $38.00 remains to be paid. Insert money: $20.00
    You gave $20.00.
    $18.00 remains to be paid. Insert money: 3
    Invalid value. Try again.
    $18.00 remains to be paid. Insert money: $9
    Invalid value. Try again.
    $18.00 remains to be paid. Insert money: $10.00
    You gave $30.00
    $8.00 remains to be paid. Insert money: $8.00
    Invalid value. Try again.

不幸的是,当我输入像'3'这样的整数时,它有时会输出“空字符串”,有时会输出“无效值。再试一次。”但仍将整数的值作为paidTotal 的一部分,即

    $18.00 remains to be paid. Insert money: $10.00
    You gave $10.00.
    $8.00 remains to be paid. Insert money: 4
    empty String
    $8.00 remains to be paid. Insert money: $2.00
    You gave $10.00.
    $8.00 remains to be paid. Insert money: 9
    empty String
    $8.00 remains to be paid. Insert money: 9
    Invalid value. Try again.
    $8.00 remains to be paid. Insert money: $5.00
    You gave $10.00.
    $8.00 remains to be paid. Insert money: $2.00
    You gave $12.00
    $6.00 remains to be paid. Insert money:

这是我的代码的相关部分。任何帮助将不胜感激!

System.out.print("$" + formatter.format(priceSum) + " remains to be paid. Insert money: ");
String moneyEntered = keyboard.nextLine();
System.out.println("");
String noDollar = moneyEntered.substring(1);
double moneyAsDouble = Double.parseDouble(noDollar);
double paidTotal = 0;
paidTotal += moneyAsDouble;
List validMoney = Arrays.asList("$0.05", "$0.10", "$0.20", "$0.50", "$1.00", "$2.00", "$5.00", "$10.00", "$20.00", "$50.00", "$100.00");

boolean moneyEnteredFound = true;

while(true) {
    if (validMoney.contains(moneyEntered)) {
        while (paidTotal < priceSum) {
            if (validMoney.contains(moneyEntered)) {
                System.out.println("You gave $" + formatter.format(paidTotal));
                System.out.print("$" + formatter.format(priceSum - paidTotal) + " remains to be paid. Enter coin or note: ");
                moneyEntered = keyboard.nextLine();
                noDollar = moneyEntered.substring(1);
                moneyAsDouble = Double.parseDouble(noDollar);
                        paidTotal += moneyAsDouble;
            } else {
                System.out.println("Invalid value. Try again.");
                System.out.print("$" + formatter.format(priceSum - paidTotal) + " remains to be paid. Enter coin or note: ");
                moneyEntered = keyboard.nextLine();
            }
         }
       }
    }

【问题讨论】:

    标签: java arrays if-statement while-loop double


    【解决方案1】:

    我建议将输入视为数字。在这种情况下,您可以(很多)简化验证,并且通常简化输入处理。

    之所以会显示 Empty String 是因为有时您在键入值时不包含美元符号,并且因为 .substring(1) 返回的字符串是以指定索引处的字符开头的子字符串,在您的case 1,它会跳过那个且只有一个字符。此外,您还有一些其他细节需要注意……我对您的代码进行了一些重构,希望对您有所帮助:)

    final Set<Double> VALID_INPUT = new HashSet<>(Arrays.asList(0.05, 0.10, 0.20, 0.50, 1.00,
        2.00, 5.00, 10.00, 20.00, 50.00, 100.00));
    final Scanner scanner = new Scanner(System.in);
    //final double priceSum = 104.89d; // This should be a parameter or an input
    double acc = 0.00d;
    
    System.out.printf("$%.2f remains to be paid. Insert money: $", priceSum);
    
    String input = scanner.nextLine();
    
    while (acc < priceSum) {
      final Double amount = Double.valueOf(input); // TODO: Handle invalid format here
    
      // Uncomment the second one to avoid negative values (if not allowed)
      if (VALID_INPUT.contains(value)/* && (acc + amount < priceSum)*/) {
        acc += value;
        System.out.printf("You gave $%.2f%n", value);
      } else {
        System.out.println("Invalid value. Try again...");
      }
      System.out.printf("$%.2f remains to be paid. Enter coin or note: $", priceSum - acc);
      input = scanner.nextLine();
    }
    

    【讨论】:

    • 我已经修改了我的代码,所以它与你给出的相似,但是当我输入一个有效的输入,比如 '$5.00' 我得到 "java.lang.IllegalArgumentException: Cannot format given Object as a数字”。有任何想法吗?非常感谢您的帮助!
    • 您只需要输入金额,不用$符号
    【解决方案2】:

    您有时会看到“空字符串”的原因是对于某些输入,您不包括美元符号。所以String noDollar = moneyEntered.substring(1); 跳过了唯一一个字符,然后你就有了空字符串。 “无效值。再试一次。”当包含美元符号但货币值不在ArrayList 中时正确发生。

    在验证 validMoney 包含 moneyEntered 之前,您还要将 moneyAsDouble 添加到 paidTotal。因此,无论输入是否有效,double 值都将添加到paidTotal。此外,在 while 循环中,您将 moneyAsDouble 再次添加到 paidTotal

    我认为这里有多个问题可以解决。一步一步地浏览代码,看看它做了什么。您将看到您的订单失败的地方。

    【讨论】:

    • 感谢您的反馈!如果我离开double paidTotal = 0 并且不添加moneyAsDouble,那么我会得到"You gave $0.00"。如果您能就我的循环结构提供一些指导,那就太棒了。
    猜你喜欢
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2021-07-19
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多