2

基本的に、resulta + resultb + resultc + 前に定義した propertyPrice を合計して合計を取得し、合計をテキスト ボックスに表示する必要があります。Resulta/b/c は、propertyPrice * 定数に基づいて計算されます。プロパティの価格はユーザーによって入力されます。

try-catch を使用せずに実行したところ、フォーマット例外が発生していました。

int propertyPrice;

if (Int32.TryParse(propertyPriceTextBox.Text, out propertyPrice))
{
    stateSalesTaxTextBox.Text = (stateSalesTax * propertyPrice).ToString("c");

    if (residentialRadioButton.Checked == true)
        comissionTextBox.Text = (residentialCom * propertyPrice).ToString("c");

    if (commercialRadioButton.Checked == true)
        comissionTextBox.Text = (commercialCom * propertyPrice).ToString("c");

    if (hillsRadioButton.Checked == true)
        countySalesTaxTextBox.Text = (hilssTax * propertyPrice).ToString("c");

    if (pascoRadioButton.Checked == true)
        countySalesTaxTextBox.Text = (pascoTax * propertyPrice).ToString("c");

    if (polkRadioButton.Checked == true)
        countySalesTaxTextBox.Text = (polkTax * propertyPrice).ToString("c");

    decimal resulta;
    decimal resultb;
    decimal resultc;

    try
    {
        resulta = decimal.Parse(countySalesTaxTextBox.Text);
        resultb = decimal.Parse(stateSalesTaxTextBox.Text);
        resultc = decimal.Parse(comissionTextBox.Text);
    }
    catch (FormatException)
    {


    }

    decimal totalPrice = (resulta + resultb + resultc + propertyPrice);
    totalPriceTextBox.Text = totalPrice.ToString("c");  
}
4

5 に答える 5

3

いくつかの問題があります。

まず、FormatException数値以外の値をdecimal.Parse()メソッドに渡しているために発生しています。入力内容を確認する必要があります。

次に、あなたの例では、例外を効果的に飲み込んでいます。それがスローされ、catch クロックがそれをキャッチしますが、ブロック内で何もしないので、コードは catch ブロックを離れて続行します。このためtotalPrice、例外のために計算されなかった変数のデフォルト値を使用して計算されます。

他の人が示唆しているようにdecimal.TryParse()、例外をスローしないため、はるかに優れたオプションです。Parse()ただし、またはTryParse()メソッドの呼び出しの 1 つが失敗したときに何をしたいかを決定する必要があります。結果がゼロであると仮定しますか、それとも計算を中止しますか?

于 2012-10-06T00:28:56.640 に答える
3

使用しdecimal.TryParseます。これにより、文字列が有効かどうかを確認できます。

decimal resulta;
decimal resultb;
decimal resultc;

if (!decimal.TryParse(countySalesTaxTextBox.Text, out resulta))
{
    //take appropriate action here
}
if (!decimal.TryParse(stateSalesTaxTextBox.Text, out resultb))
{
    //take appropriate action here
}
if (!decimal.TryParse(comissionTextBox.Text, out resultc))
{
    //take appropriate action here
}

この機会に、変数名を変更するようアドバイスしたいと思います。

  • resultaする必要がありますcountySalesTaxRate
  • resultbする必要がありますstateSalesTaxRate
  • resultcする必要がありますcommissionRate
于 2012-10-06T00:22:33.083 に答える
3
decimal resulta = 0;
decimal resultb = 0;
decimal resultc = 0;

decimal.TryParse(countySalesTaxTextBox.Text, out resulta);
decimal.TryParse(stateSalesTaxTextBox.Text, out resultb);
decimal.TryParse(comissionTextBox.Text, out resultc);

値を解析できない場合、値は 0 のままです。TryParse は、解析に成功すると true を返します。そうでない場合にメッセージを表示したい場合は、TryParse == false

于 2012-10-06T00:23:38.933 に答える
3

で文化の問題にぶつかる前に、追加情報をいくつか。と 、

このように Decimal.TryParse オーバーロードを使用します

Decimal.TryParse(countySalesTaxTextBox.Text, NumberStyles.Any, new CultureInfo("en-US"), out resulta);
于 2012-10-06T00:25:58.840 に答える
0

試す:

if (!decimal.TryParse(countySalesTaxTextBox.Text, out resulta)) { /*Resolve issue*/ }
if (!decimal.TryParse(stateSalesTaxTextBox.Text, out resultb)) { /*Resolve issue*/ }
if (!decimal.TryParse(comissionTextBox.Text, out resultc)) { /*Resolve issue*/ }

変数名とデフォルト値を再確認してください。

于 2012-10-06T00:19:53.763 に答える