web-dev-qa-db-ja.com

タイプ 'System.FormatException'の未処理の例外がmscorlib.dllで発生しました

計算ボタンを押すたびに、次のメッセージが表示されます。mscorlib.dllでタイプ「System.FormatException」の未処理の例外が発生しました。追加情報:入力文字列が正しい形式ではありませんでした。

賃金入力が$ 9.75を下回ると、メッセージを表示することになっています。

次に、次のコード行を強調表示します。

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

これが計算ボタンの方法です(私は複数のエラーを犯したと確信しています):

 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;

    }
7
Syntax_Error

数値を整数に変換しています。したがって、(たとえば)9.5と入力すると、整数ではないため失敗します。

ほぼ確実にdecimal.TryParseを使用する必要があります。戻り値は、解析が成功したかどうかを示します。

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
3
Jon Skeet

Convert.ToInt32を使用したため、変換できないものを入力すると、そのエラーが発生します整数。試してください:

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

または、さらに良いことに、 decimal.TryParse の使用に切り替えます。これにより、例外処理なしで不適切な入力を簡単に処理できるようになります。

1
Reed Copsey