2011-12-01 2 views
0

FormatException이 표시되고 이유를 알 수 없습니다. 코드의유효한 이중 입력에서 FormatException을 수신하는 이유는 무엇입니까?

System.FormatException was unhandled by user code 
    Message=Input string was not in a correct format. 
    Source=mscorlib 
    StackTrace: 
     at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) 
     at System.Convert.ToDouble(String value) 

라인 (디버그 창에서)

DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"]); 

값 :

parameters["DELTA_BUY"] "0.0016" string 

UPD 하나 개의 실행 경로에서 잘 작동하지만 (왔을 때 다른 실행 패스에 실패 WCF에서). 이중으로 재현 가능하며 현과 잘 조화됩니다. 아마도 포맷/국유화 문제일까요?

+3

지역 설정은 어떻습니까? –

+0

@RubensFarias 네, 아마도 그 정도입니다. 하나의 실행 경로에서 잘 작동한다는 것은 흥미 롭습니다. 다른 실행 경로에서 실패합니다 (설명 업데이트). 지역 설정을 확인/조정할 위치를 모르겠습니다. – javapowered

+0

두 경로 모두에서 도전적으로 동일한 문자열입니까? – DaveShaw

답변

3

컴퓨터가 아마도 "0.0016"이 유효한 번호가 아닌 Culture로 설정되어 있습니까? 아마 당신이 국가 별 설정 문제, 관련 인해 스레드 언어 또는 뭔가 실행중인

DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], System.Globalization.CultureInfo.InvariantCulture); 
+0

이 방법입니다. .. – javapowered

+0

흠 ... 호기심에서, 문화는 당신의 기계가 무엇입니까? 영국 문화는 이것을 정확하게 읽고 대륙 유럽 문화권은 그것을 16으로 읽습니다. (던지지 않음) ... – Josh

+0

시스템에이 두 가지 언어가 설치되어 있기 때문에 아마 영어 또는 러시아 문화라고 생각합니다. – javapowered

0

문자열 자체에 큰 따옴표가 포함되어 있습니까? 파서는 따옴표가 포함 된 문자열을 변환 할 수 없습니다. 그 이외에, 그 값을 포함하는 문자열이 en-US 문화 또는 불변의 문화에서 이중으로 구문 분석되지 않는 이유는 없습니다.

다른 문화권에서는 소수점이 숫자에서 "제로 파워"장소를 표시하는 데 사용되지 않을 수 있습니다. 예를 들어 프랑스 (fr-FR)는 일반적으로 쉼표를 사용하고 천 단위 구분 기호는 공백입니다. 이런 종류의 차이가있는 문화권에서는이 문자열을 구문 분석하는 것이 실패합니다.

//this will definitely work, as the en-US culture would definitely be able 
//to parse this number string. 
DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], new CultureInfo("en-US")); 
//this SHOULD work, and is generally more proper than forcing use of the US 
//culture's formatter in a program otherwise designed to work in, say, Italy. 
DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], CultureInfo.InvariantCulture); 

고정 문화권 분수에 소수점을 사용하는 일반 영어 문화 (설명 : 당신은 당신이 사용하는 숫자 형식을 처리 할 알고, 변환을 수행 할 때 특정 문화를 지정하여이를 방지 할 수 있습니다 숫자의 전체 부분과 소수 부분을 구분하기 위해 소수점을 사용하지 않을 수있는 특정 문화권을 시스템이 무시하도록 강제해야합니다.

+0

아니요. 문자열 자체에 큰 따옴표가 포함되어 있지 않습니다. 디버깅 창이 표시되는 것 같습니다. – javapowered

1

을 시도 . 십진 분리 기호로 항상 .과 함께 데이터를 수신하는 경우 다음을 사용할 수 있습니다.

Convert.ToDouble("0.0016", new NumberFormatInfo{ NumberDecimalSeparator = "."}); 
관련 문제