2013-12-16 2 views
1

분수를 백분율로 변환하는 응용 프로그램을 빌드하고 있습니다. 나는 분수의 텍스트를 편집하여 새로 고침하고 백분율을 다시 계산하기를 원합니다.이 코드가 ArgumentOutOfRangeException을 일으키는 이유는 무엇입니까?

내가 테스트 할 때 처음에는 오류를 수정하지 않고 잘 작동하지만 오류가있는 부분을 두 번째로 변경하면 오류가 발생합니다. 나는 형 System.ArgumentOutOfRangeException이 처리되지 않은 예외가 mscorlib.dll

나는이 문제를 해결하기 위해 무엇을 할 수에서 발생

이 오류를 얻을?

저는 C#에 상당히 익숙합니다. 가능하다면 모두 바보로 만드십시오.

추가 정보 : 인덱스 및 길이는 문자열 내의 위치를 ​​참조해야합니다 "

여기

내가 지금까지이 작업은 다음과 같습니다. 당신은 내가 그 일을 말할 수 제공된 코드에서

private void fractionNumerator_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (!(char.IsNumber(e.KeyChar) || ((e.KeyChar) == Convert.ToChar(Keys.Back)))) 
     { 
      e.Handled = true; 
     } 
     else 
     { 
      if (!((fractionNumerator.Text == "") && (fractionDenominator.Text == ""))) 
      { 
       if ((e.KeyChar == Convert.ToChar(Keys.Back))) 
       { 
        string numer = (fractionNumerator.Text.Substring(0, (fractionNumerator.Text.Length) - 1)); 
        string denom = (fractionDenominator.Text); 
        outputPercentage.Text = (((((Convert.ToDouble(numer)/Convert.ToDouble(denom)) * 100).ToString()).Substring(0, 6)) + "%"); 
       } 
       else 
       { 
        string numer = ((fractionNumerator.Text) + e.KeyChar.ToString()); 
        string denom = (fractionDenominator.Text); 
        outputPercentage.Text = (((Convert.ToDouble(numer)/Convert.ToDouble(denom)*100).ToString()).Substring(0, 6)); 
       } 
      } 
     } 
    } 

    private void fractionDenominator_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (!(char.IsNumber(e.KeyChar) || ((e.KeyChar) == Convert.ToChar(Keys.Back)))) 
     { 

      e.Handled = true; 
     } 
     else 
     { 
      if (!((fractionNumerator.Text == "") && (fractionDenominator.Text == ""))) 
      { 
       if ((e.KeyChar == Convert.ToChar(Keys.Back))) 
       { 
        string denom = (fractionDenominator.Text.Substring(0, (fractionDenominator.Text.Length) - 1)); 
        string numer = (fractionNumerator.Text); 
        outputPercentage.Text = (((((Convert.ToDouble(numer)/Convert.ToDouble(denom)) * 100).ToString()).Substring(0, 6)) + "%"); 
       } 
       else 
       { 
        string denom = ((fractionDenominator.Text) + e.KeyChar.ToString()); 
        string numer = (fractionNumerator.Text); 
        outputPercentage.Text = (((Convert.ToDouble(numer)/Convert.ToDouble(denom) * 100).ToString()).Substring(0, 6)); 
       } 
      } 
     } 
    } 
+0

어떤 줄에 오류가 있습니까? –

+0

6 문자 미만의 문자열에서 어떻게 든 호출되는'하위 문자열 (0, 6)) '을 추측합니다. –

+1

'Substring' 호출 중 하나입니다. 하위 출력을 사용하여 두 번 출력 형식을 지정하지 않습니다. 형식 지정자를 사용하십시오. http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx –

답변

0

Substring 메서드가이 예외를 throw하므로 유효하지 않은 두 번째 매개 변수 (0보다 작거나 문자열 길이보다 큼)가있을 수 있습니다. 자세한 내용은 msdn을 확인하십시오. http://msdn.microsoft.com/ru-ru/library/aka44szs%28v=vs.110%29.aspx

mike z의 설명에서 언급했듯이 Substring 대신 형식 문자열을 사용하여 출력 형식을 지정해야합니다. 예를 들어 doubleValue.ToString("#.####")은 소수 부분의 4 자리를 반환합니다.

0

숫자를 백분율로 변환하려면 yourDoubleExpr.ToString("P4")을 사용하십시오. 100.0에 의한 곱셈은 자동입니다.

귀하의 문제는 "0.75" 같은 짧은 문자열 (3.0/4.0).ToString() 납, 같은 경우, 당신은 그것과 길이 6.Substring을 취할 수없는 것이 었습니다.

관련 문제