2016-04-02 5 views
0

Ich versuche Code zu schreiben, der gültige Eingaben akzeptiert ($ 0,05, $ 0,10, $ 0,20, $ 0,50, $ 1,00, $ 2,00, $ 5,00, $ 10,00, $ 20,00, $ 50,00, $ 100,00) und gibt den Rest aus , mit Ausgangscode ähnlich ist: „. ungültiger Wert Versuchen sie es erneut“Nur gültige Eingaben in Java akzeptieren und Rest ausgeben

$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. 

im Moment Leider, wenn I eine ganze Zahl wie ‚3‘ einzugeben, gibt es manchmal „leere Zeichenfolge“ ausgibt, und manchmal nimmt aber immer noch den Wert der ganzen Zahl als Teil paidTotal d.h

$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: 

Hier ist der relevante Abschnitt meines Codes. Jede Hilfe würde sehr geschätzt werden!

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(); 
      } 
     } 
     } 
    } 

Antwort

0

Der Grund, warum Sie manchmal "leere Zeichenfolge" sehen, liegt daran, dass Sie für bestimmte Eingaben das Dollarzeichen nicht einschließen. So überspringt String noDollar = moneyEntered.substring(1); das einzige Zeichen, und dann haben Sie die leere Zeichenfolge. "Ungültiger Wert. Versuchen Sie es erneut." tritt korrekt auf, wenn das Dollarzeichen enthalten ist, aber der Geldwert nicht in der ArrayList ist.

Sie fügen auch moneyAsDouble zu paidTotal hinzu, bevor Sie bestätigen, dass validMoneymoneyEntered enthält. Unabhängig davon, ob die Eingabe gültig war oder nicht, wird der Wert double zu paidTotal hinzugefügt. Innerhalb der while-Schleife fügen Sie moneyAsDouble erneut zu paidTotal hinzu.

Ich denke, dass es hier mehrere Probleme gibt, die behoben werden könnten. Gehen Sie den Code Schritt für Schritt durch und sehen Sie, was er tut. Sie werden sehen, wo Ihre Bestellung fehlschlägt.

+0

Vielen Dank für das Feedback! Wenn ich "double payedTotal = 0" verlasse und nicht "moneyAsDouble" dazu addiere, dann bekomme ich '" Du hast $ 0.00 gegeben "'. Wenn Sie mir eine Anleitung zur Struktur meiner Schleifen geben könnten, wäre das erstaunlich. – sa4an

0

Ich würde vorschlagen, Eingabe als Zahlen zu behandeln. In diesem Fall vereinfachen Sie (sehr) die Validierungen und generell die Eingabehandhabung.

Die Empty String Sache zeigt, weil für Sie manchmal das Dollarzeichen nicht enthalten, wenn Sie die Werte eingeben, und weil .substring(1) gibt eine Zeichenfolge, die eine Teil mit dem Charakter begining am angegebenen Index ist, in Ihrem Fall 1, es überspringt dieses eine und nur ein Zeichen. Darüber hinaus haben Sie einige andere Details, die Sie beachten sollten ... Ich habe einige Refactoring zu Ihrem Code, hoffe, es hilft :)

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(); 
} 
+0

Ich habe meinen Code so geändert, dass er dem entspricht, was Sie angegeben haben, aber wenn ich eine gültige Eingabe wie "$ 5,00" eintrage, bekomme ich "java.lang.IllegalArgumentException: Kann das angegebene Objekt nicht als Zahl formatieren". Irgendwelche Ideen? Vielen Dank für deine Hilfe! – sa4an

+0

Sie müssen nur die Beträge eingeben, ohne das '$' Zeichen –

Verwandte Themen