2012-11-14 3 views
1

이것은 섭씨를 화씨로 변환하는 내 Windows 앱의 레이아웃입니다. 문제는 온도를 입력하려고하면 (예를 들어, '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 = ""; 
     } 
    } 

} 
} 

답변

1

당신은 진수 후 장소의 원하는 숫자로 값을 반올림 Math.Round를 사용할 수 있습니다. 최대 0을 반올림하면 분수 부분이 제거됩니다.

변경

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

무슨 일이 일어나고 무엇

cel.Text = Math.Round(((5.0/9.0) * (F - 32)), 2).ToString() ; 
+0

+0 OP의 문제가 아닌 것 같습니다. –

+0

'스택 오버플로 예외를 표시하고 있습니까?'라는 질문은 어떨까요? – Zbigniew

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

같은 것을 상상하지만 그냥 간단하게 수정합니다.

+0

@des 방금 내 대답을 편집했습니다. 이벤트 처리기가 서로를 트리거하게하고, '3.0000009'는 그 사이의 반올림 오류의 결과입니다. –

+0

네, 이제 알겠습니다. 모든 문제를 설명합니다. – Zbigniew

+0

많이 고마워 ... 나는 그것을 시험해 볼 것이다. – user1824343

관련 문제