仅接受Java中的有效输入并输出余数

仅接受Java中的有效输入并输出余数,java,arrays,if-statement,while-loop,double,Java,Arrays,If Statement,While Loop,Double,我试图编写的代码接受有效输入($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 aga

我试图编写的代码接受有效输入($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();
            }
         }
       }
    }
System.out.print(“$”+formatter.format(priceSum)+”仍需支付。插入货币:”;
字符串moneyEntered=keyboard.nextLine();
System.out.println(“”);
字符串noDollar=moneyEntered.substring(1);
double moneyAsDouble=double.parseDouble(noDollar);
双对总=0;
paidTotal+=货币为双倍;
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”);
布尔值moneyEnteredFound=true;
while(true){
如果(有效货币包含(输入的货币)){
而(付款总额<价格总额){
如果(有效货币包含(输入的货币)){
System.out.println(“您给了$”+formatter.format(paidTotal));
System.out.print(“$”+formatter.format(priceSum-paidTotal)+”仍需支付。输入硬币或纸币:“);
moneyEntered=keyboard.nextLine();
noDollar=moneyEntered.substring(1);
moneyAsDouble=Double.parseDouble(noDollar);
paidTotal+=货币为双倍;
}否则{
System.out.println(“无效值。请重试。”);
System.out.print(“$”+formatter.format(priceSum-paidTotal)+”仍需支付。输入硬币或纸币:“);
moneyEntered=keyboard.nextLine();
}
}
}
}

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

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


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

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

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

final Set VALID\u INPUT=新的哈希集(Arrays.asList(0.05,0.10,0.20,0.50,1.00,
2.00, 5.00, 10.00, 20.00, 50.00, 100.00));
最终扫描仪=新扫描仪(System.in);
//最终双倍价格总和=104.89d;//这应该是一个参数或一个输入
双acc=0.00d;
System.out.printf(“$%.2f仍需支付。插入货币:$”,priceSum);
字符串输入=scanner.nextLine();
而(acc<价格总额){
final Double amount=Double.valueOf(input);//TODO:此处处理无效格式
//取消注释第二个以避免负值(如果不允许)
如果(有效输入包含(值)/*&(acc+金额<价格总额)*/){
acc+=数值;
System.out.printf(“您给出了$%.2f%n”,值);
}否则{
System.out.println(“无效值。请重试…”);
}
System.out.printf(“$%.2f仍需支付。输入硬币或纸币:$”,价格总额-acc);
输入=scanner.nextLine();
}

我修改了我的代码,使其与您给出的代码类似,但当我输入诸如“$5.00”之类的有效输入时,会得到“java.lang.IllegalArgumentException:无法将给定对象格式化为数字”。有什么想法吗?非常感谢你的帮助!您只需输入金额,无需
$
符号谢谢您的反馈!如果我离开
双倍支付总额=0
并且不向其中添加
双倍金额
,那么我会得到
“你给了$0.00”
。如果你能给我一些关于循环结构的指导,那将是令人惊奇的。
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();
}