2013-10-14 31 views
7

Za każdym razem, gdy kliknę przycisk obliczania, pojawia się następujący komunikat: Wystąpił nieobsługiwany wyjątek typu "System.FormatException" w pliku mscorlib.dll Dodatkowe informacje : Ciąg wejściowy nie był w poprawnym formacie.Wystąpił nieobsługiwany wyjątek typu "System.FormatException" w pliku mscorlib.dll

Mam wyświetlać komunikat, gdy wkład wynagrodzenia jest poniżej 9,75 USD.

Następnie podkreśla ten wiersz kodu:

if (Convert.ToInt32(RateTextBox.Text) < 9.75m) 

Oto metoda Oblicz Przycisk (jestem pewien, że zrobiłem więcej niż jeden błąd):

private void CalcButton_Click(object sender, EventArgs e) 
    { // The “Calculate” button calculates gross pay, taxes, and net pay and then  displays name, department, gross pay, taxes, and net pay using currency format for various amounts in the rich text box 
     // Gross pay= (hours * rate) 
     // Taxes= (25% of gross pay) 
     // Net pay (gross pay ?taxes) 



     //calculate   


     Gross_pay = Convert.ToInt32(HoursTextBox.Text) * decimal.Parse(RateTextBox.Text); 
     Taxes = TAX * Gross_pay; 
     Net_Pay = Gross_pay - Taxes; 

     annual_salary = Net_Pay; 



     //display 
     DisplayOutPut.Text = ""; 
     DisplayOutPut.Text += NameTextBox.Text + "\n"; 
     DisplayOutPut.Text += "Hours:" + HoursTextBox.Text + "\n"; 
     DisplayOutPut.Text += "Rate:" + RateTextBox.Text + "\n"; 
     DisplayOutPut.Text += "Gross Pay:" + Gross_pay.ToString("C") + "\n"; // Hours*Rate 
     DisplayOutPut.Text += "Taxes:" + Taxes.ToString("C") + "\n"; 
     DisplayOutPut.Text += "Net Pay:" + Net_Pay.ToString("C"); 

     //handling the invalid inputs 
     if (NameTextBox.Text == "") 
     { MessageBox.Show("Name is missing.", "Error"); } 

     if (Convert.ToInt32(HoursTextBox.Text) >= 70) 
     { MessageBox.Show("Please Enter a Valid hour.", "Invalid data type."); } 

     if (RateTextBox.Text == "" && (RateTextBox.Text == ",")) 
     { MessageBox.Show("Please Enter a valid amount.", "Invalid data type ($)"); } 

     if (Convert.ToInt32(HoursTextBox.Text) >= 70) 
     { MessageBox.Show("You have exceeded the maximum hours per week."); } 

     else if (Convert.ToInt32(HoursTextBox.Text) < 10) 
     { MessageBox.Show("You cannot input less than 10 hours."); } 

     if (Convert.ToInt32(RateTextBox.Text) < 9.75m) 
     { MessageBox.Show("Please enter the minimum wage."); } 


     //overtime pay 
     if (Convert.ToInt32(HoursTextBox.Text) >= 41) 
     { 
      Gross_pay = Convert.ToInt32(HoursTextBox.Text) * decimal.Parse(RateTextBox.Text) * 1.5m; 
      DisplayOutPut.Text += "Gross Pay:" + Gross_pay.ToString("C") + "\n"; 
     } 

     //Medical/Dental and 401k deductions...as well as tax collected. 
     if (MedicalDentalDeductions.Checked) 
     { 
      Gross_pay = Convert.ToInt32(HoursTextBox.Text) * decimal.Parse(RateTextBox.Text) - 50.00m; 
     } 

    if(FourOneKDeduction.Checked) 
    { 
     Gross_pay = Convert.ToInt32(HoursTextBox.Text) * decimal.Parse(RateTextBox.Text) - 0.05m * 100; 


    } 


    if ((MedicalDentalDeductions.Checked) && (FourOneKDeduction.Checked)) 
    { Taxes = TAX * Gross_pay; } 
     DisplayOutPut.Text= "Medical/Dental deduction:" + Taxes +"401k deduction:"+ Taxes; 

    } 

Odpowiedz

3

Jesteś konwersja liczby na integer. Więc jeśli wprowadziłeś (powiedzmy) 9.5, które by się nie powiodło, ponieważ nie jest to liczba całkowita.

Powinieneś prawie na pewno używać numeru decimal.TryParse, zwracając uwagę, że zwracana wartość powie, czy parsowanie się powiodło, czy nie.

decimal userRate; 
if (!decimal.TryParse(RateTextBox.Text, out userRate)) 
{ 
    // Indicate to the user that the input is invalid, and return from 
    // the method 
} 
// Now use userRate 
1

Dostaniesz ten błąd jeśli wpiszesz coś, co nie jest zamienny do liczby całkowitej, ponieważ użyłeś Convert.ToInt32. Spróbuj:

if (Convert.ToDecimal(RateTextBox.Text) < 9.75m) 

Albo, jeszcze lepiej, przełączyć się na używanie decimal.TryParse, która pozwoli Ci z łatwością obsługiwać niewłaściwego obchodzenia wejście bez wyjątku.

Powiązane problemy