2016-04-02 8 views
0

有効な入力($ 0.05、$ 0.10、$ 0.20、$ 0.50、$ 1.00、$ 2.00、$ 5.00、$ 10.00、$ 20.00、$ 50.00、$ 100.00) 、のような出力コードを:有効な入力をJavaで受け入れ、余りを出力する

$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」のように整数を入力すると、残念ながら現時点では、それは時に「空の文字列」を出力し、時には出力「無効な値を再度実行してください。」支払済合計の一部として整数の値をとります。すなわち、

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

答えて

0

「空文字列」が表示されることがある理由は、特定の入力にはドル記号が含まれていないためです。したがって、String noDollar = moneyEntered.substring(1);は1つの唯一の文字をスキップし、空の文字列があります。 "値が無効です。もう一度お試しください。"ドル記号が含まれていても、金額がArrayListにない場合は正しく表示されます。

またvalidMoneymoneyEnteredが含まれていることを確認する前に、moneyAsDouble~paidTotalを追加しています。したがって、入力が有効かどうかにかかわらず、doubleの値はpaidTotalに追加されます。さらに、whileループ内でmoneyAsDoublepaidTotalに再度追加します。

私はここに複数の問題が修正されていると思います。コードをステップバイステップで実行し、それが何であるかを確認します。あなたの注文が失敗している場所が表示されます。

+0

フィードバックありがとうございました! 'double paidTotal = 0'を残して' moneyAsDouble'を追加しないと、 '$ 0.00 'を返します。あなたが私のループの構造についていくつかの指針を与えることができれば、それはすばらしいことでしょう。 – sa4an

0

入力を数字として扱うことをお勧めします。その場合、検証と一般的な入力処理を簡略化します(多くの場合)。

Empty String事は、時々あなたが値を入力するときは、ドル記号が含まれていない、と.substring(1)はあなたのケース1には、指定されたインデックスの文字で初めサブ文字列を返すので、理由のために表示されますその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(); 
} 
+0

私は自分のコードをあなたが与えたものと似たように変更しましたが、 '$ 5.00'のような有効な入力を入力すると、 "java.lang.IllegalArgumentException:与えられたオブジェクトを数値としてフォーマットできません"というメッセージが表示されます。何か案は?あなたの助けをありがとう! – sa4an

+0

'$'記号なしで金額を入力するだけです –

関連する問題