2010-12-16 3 views
2

코드는 .NET3.5를 대상으로 VS2008에서 컴파일됩니다. 이것은 시스템에서 재현 할 수 없습니다. 어떤 종류의 현지화 설정이 사용 중인지 의심 스럽지만 그것에 대해 많이 알지 못합니다.일부 시스템에서 System.Convert ("0")이 FormatException을 throw하는 이유는 무엇입니까?

다른 모든 유효한 숫자가 제대로 작동하는 것 같습니다. 버그는 (생산 코드를 같은 예외가 발생하지만입니다)이 코드로 설명된다 : 명령 줄에서

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string str = ""; 
      do 
      { 
       str = Console.ReadLine(); 
       Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str)); 
      } 
      while (str != null); 
     } 
    } 
} 

, "0"의 입력은 내가 발견 한 적어도 하나의 시스템에서 응용 프로그램을 충돌합니다. 사용자의 PC에서

스택 추적 :

System.FormatException: Input string was not in a correct format. 
    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) 
    at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Convert.ToDouble(String value) 
+1

무슨 뜻입니까? 어떤 유형의 오류 메시지 나 스택 추적을 얻지 못합니까? –

+1

맹목적으로 콘솔 입력을 이중으로 변환하고 있습니다. 'Double.TryParse()'를 먼저 사용하여 번호를 검증 해 보았습니까? –

+0

크래시는 적절하게 처리되지 않는 예외를 의미합니다. 스택 추적을 얻지 만 사용자의 PC이므로 내 컴퓨터에서 문제를 재현 할 수 없습니다. – pomeroy

답변

5

나는이 질문을 잠시 기억하고있다. Parse() 메서드는 제어판 + 지역 및 언어 애플릿에서 사용자 재정의의 영향을받습니다. IIRC에서는 "음수 기호 기호"설정에 특히 민감합니다. 사용자에게 설정을 수정하도록 요청하십시오.

참조 문 is here.

4

문제가 현재의 문화와 관련되어있는 경우, 고정 문화권을 사용하여 두배로 변환하려고 :

Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture); 
0

그것은 문화의 설정과 관련이있을 수 있습니다. 일부 문화권 설정에서 알 수 있듯이 이중으로 변환하려면 0.0을 입력해야합니다.

0

0을 입력 할 때 충돌이 발생한다고 생각하지 않습니다.

숫자가 아닌 것을 입력해도 물론 충돌이 발생합니다. 즉, 빈 문자열을 입력하면 충돌이 발생합니다 (즉, 단지 Enter 키를 누르십시오). 나는 이것이 당신이 경험하고있는 것이라고 상상한다.

당신의 코드는이로 변경하는 경우 (숫자 만 위해) 일 것이다 :

string str = ""; 
do 
{ 
    str = Console.ReadLine(); 
    if(!string.IsNullOrEmpty(str)) 
     Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str)); 
} 
while (str != ""); 
+0

경이롭게 경악하는 방법. 분명히 나는 ​​당신에 대한 투표에 대한 명성이 없지만 내가 그랬 으면 좋겠다. – pomeroy

+3

나는 그가 겸손하다고 생각하지 않는다. 루틴은 어떤 종류의 유효성 검사도하지 않으며, 던져진 예외를 고려하여 사용자가 실제로 유효한 숫자를 입력했다는 것을 "신뢰해야"한다고 말하는 것입니다. 어떤 의미. 죄송합니다. 그러나 어떤 일이 잘못 될 수있는 경우, 그 일은 피할 수 없습니다. – rsenna

+0

어느 누구도 질문을 읽지 않습니다. 루틴은 프로덕션 환경에서이 오류를 일으키는 코드가 아니며 루틴은 사용자의 PC에서 문제를 격리하는 것으로 나타났습니다. – pomeroy

0

CurrentCulture은 CultureInfo 인스턴스가 비난 아마. 결국 Convert.ToDouble 호출은 단순히 Double.Parse의 결과를 반환합니다. 이것은 문서화 된 것처럼 현재 culture의 NumberFormatInfo를 사용하여 상황을 파악합니다.

+0

그래, 그게 내 생각이야. 불행히도 이것은 대답 자체가 아닙니다. – pomeroy

1

코드 (또는 CultureInfo)가 아니라는 것을 쉽게 증명할 수 있습니다. .NET의 모든 문화권에서 문자열 "0"을 올바르게 이중 변환 할 수 있음을 증명할 수 있습니다.

string inputNumber = "0"; 
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
{ 
    try 
    { 
     double d = Convert.ToDouble(inputNumber, culture); 
    } 
    catch 
    { 
     Console.WriteLine(culture.Name); 
    } 
} 
Console.WriteLine("end"); 
Console.Read(); 

"끝"이외의 내용을 출력합니다.

+0

흥미 롭습니다. 그럼에도 불구하고 충돌은 Convert.ToDouble 메서드에 "0"을 입력하면 발생합니다. 어떤 아이디어? – pomeroy

+2

@pomeroy :'str = Console.ReadLine();'을'str = "0";'으로 변경하고 앱이 여전히 충돌하는지 다시 확인해보십시오. –

+0

확인 됨 :'Convert.ToDouble ("0")'은 FormatException을 발생시킵니다. – pomeroy

관련 문제