2016-04-02 10 views
0

Geçerli giriş ($ 0.05, $ 0.10, $ 0.20, $ 0.50, $ 1.00, $ 2.00, $ 5.00, $ 10.00, $ 20.00, $ 50.00, $ 100.00) alan kod yazmaya çalışıyorum ve herhangi bir geri kalan çıktı veriyor ile çıkış kodu benzer: ". Geçersiz değer tekrar deneyin" Şu anda maalesefSadece geçerli girişleri kabul etmek ve çıktı almak

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

, ben '3' gibi bir tamsayı girin, bunun bazen "boş bir dize" verir ve bazen çıkışı ama yine İşte benim kod ilgili bölümü var

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

yani paidTotal parçası olarak tamsayı değerini alır. Herhangi bir yardım büyük takdir edilecektir! Belirli girişler için Dolar işareti dahil olmadığı için

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

cevap

0

bazen "Boş String" görüyoruz nedenidir. Yani String noDollar = moneyEntered.substring(1); tek ve tek karakteri atlar ve boş dizginiz olur. "Geçersiz değer. Tekrar deneyin." Dolar işareti dahil edildiğinde doğru olarak gerçekleşir, ancak para değeri ArrayList'da değildir. Eğer validMoneymoneyEntered içerdiğini doğrulamak önce

Ayrıca paidTotal için moneyAsDouble ekliyoruz. Yani giriş geçerli olsun ya da olmasın, double değeri paidTotal'a eklenecektir. Ayrıca, while döngüsünde moneyAsDouble'u tekrar paidTotal'a eklersiniz.

Burada düzeltilebilecek birden çok sorun olduğunu düşünüyorum. Kod adım adım ilerleyin ve ne yaptığını görün. Siparişinizin nerede başarısız olduğunu göreceksiniz.

+0

Geri bildiriminiz için teşekkürler! Eğer 'double paidTotal = 0' bırakıp 'moneyAsDouble' değerini eklemezsem, o zaman "$ 0.00" verdiniz. Eğer benim döngülerimin yapısı hakkında biraz bilgi verebilirseniz, bu harika olurdu. – sa4an

0

Girdileri sayı olarak ele almanızı öneririm. Bu durumda doğrulamaları ve genel olarak giriş işlemlerini basitleştirirsiniz.

Empty String şey değerlerini yazarken bazen için Dolar işareti içermemesi nedeniyle gösteren ve .substring(1) bir alt dize senin durumunda 1 yılında, Belirtilen dizindeki karakterin ile başlayıp bir dize döndürür çünkü, o bir ve sadece bir karakteri atlar. Ayrıca, dikkat etmeniz gereken diğer bazı detaylar da var ... Kodunuza biraz değişiklik yaptım, umarım yardımcı olur :)

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

Kodumu değiştirdiğim şekilde değiştirdim, ancak '$ 5.00' gibi geçerli bir girdi girdiğimde "java.lang.IllegalArgumentException: Verilen Nesneyi bir Sayı olarak biçimlendiremiyorum". Herhangi bir fikir? Yardımın için çok teşekkürler! – sa4an

+0

Sadece $ 'işareti olmadan tutarları girmeniz yeterlidir –