1

これは、摂氏を華氏に変換する私の Windows アプリの 1 つのレイアウトです。問題は、温度を入力しようとすると、ジャンクが表示され(たとえば、「3」と入力すると「3.0000009」に表示される)、スタックオーバーフロー例外が表示されることもあります。出力も正しく表示されません。

cel.text摂氏のテキストボックスです。 fahre.text華氏のテキストボックスです。

namespace PanoramaApp1
{
    public partial class FahretoCel : PhoneApplicationPage
    {
    public FahretoCel()
    {
        InitializeComponent();

    }

    private void fahre_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (fahre.Text != "")
        {
            try
            {
                double F = Convert.ToDouble(fahre.Text);
                cel.Text = "" + ((5.0/9.0) * (F - 32)) ; //this is conversion expression

            }

            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            cel.Text = "";
        }
    }

    private void cel_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (cel.Text != "")
        {
            try
            {
                Double c = Convert.ToDouble(cel.Text);
                fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);

            }
            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            fahre.Text = "";
        }
    }

}
}
4

2 に答える 2

2

何が起こっているのか、Text_Changedイベント ハンドラーがお互いをトリガーしており、お互いのテキストを変更し続けています。

摂氏から華氏に変換すると、無期限に前後に変換されます。

これは、スタック オーバーフロー エラーと入力テキストの変更の両方を説明しています。

私がすることは、ボタンまたはボタンで変換を実行するか、他のイベントハンドラーをオンまたはオフにするブール変数を持つことができます。

このようなものを想像してください

protected bool textChangedEnabled = true;

private void cel_TextChanged(object sender, TextChangedEventArgs e)
{
    if(textChangedEnabled)
    {
        textChangedEnabled = false;
        if (cel.Text != "")
        {
            try
            {
                Double c = Convert.ToDouble(cel.Text);
                fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);

            }
            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            fahre.Text = "";
        }
        textChangedEnabled = true;
    }
}

おそらく、それを達成するためのよりエレガントでスレッドセーフな方法がありますが、それは単純な修正にすぎません。

于 2012-11-14T16:58:39.120 に答える
1

Math.Round を使用して、値を小数点以下の桁数に丸めることができます。ゼロに丸めると、小数部分が削除されます。

変化する

cel.Text = "" + ((5.0/9.0) * (F - 32)) ;

cel.Text = Math.Round( ((5.0/9.0) * (F - 32)), 2).ToString() ;
于 2012-11-14T16:55:54.727 に答える