2009-06-18 2 views
10

내 응용 프로그램에 정보를 입력하는 데 사용하는 텍스트 파일이 있습니다. 일부 값은 float이고 때로는 null 인 경우도 있습니다. 예외를 얻는다.float.Parse()가 원하는 방식으로 작동하지 않습니다.

 var s = "0.0"; 
     var f = float.Parse(s); 

위의 코드는 2 행의 "입력 문자열이 올바른 형식이 아닙니다"에서 예외를 throw합니다.

저는 솔루션이 IFormatProvider를 매개 변수로 포함하는 float.Parse의 고급 오버로드라고 생각하지만 아직 그것에 대해 아무것도 모릅니다.

"0.0"을 어떻게 파싱합니까?

+0

나는 코드를 시도하고 값을 잘 파싱 할 수있다. –

+3

이 코드는 문화권에 따라 다릅니다 (즉, 로캘에 따라 다름). 그래서 우리 중 일부는이 행동을 보지 않을 것입니다. – inazaruk

답변

22

도트 기호 "."입니다. 구분 기호로 사용되지 않습니다 (문화 설정에 따라 다름). 따라서 도트를 올바르게 파싱하려면 다음과 같이 작성해야합니다.

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
+0

늦은 응답 (현재 귀하의 답변을 수락 했음)에 대해 매우 유감 스럽지만 바빴습니다. 답변을 주셔서 감사합니다. 필요한 조치를 취했습니다. 정말 감사드립니다. –

+2

CultureInfo.InvariantCulture가 좋습니다. (아래 참조) –

2

방금 ​​시도했지만 예외가 전혀 발생하지 않았습니다.

숫자 형식이 소수점이 아닌 십진수 쉼표를 사용합니까? 당신은 시도 :

var s = "0,0"; 
var f = float.Parse(s); 

난 그냥 예외가 기대 쉼표로 시도했습니다이 물었다하지만하지 않았다 가졌어요. 그래서 이것은 대답이 아닐 수도 있습니다.

+0

올바른 로케일 (예 : 영어)을 사용하여 예외를 생성 할 수 있습니다. – Akku

+0

@Akku - 정확한 테스트를 기억하지 못합니다 (2 년 반 전에이 답변을 게시했습니다). 그러나 로케일과 이것이 숫자 분석에 어떻게 영향을 미치는지 알고 있습니다. 나는 그의 * 로케일이 소수점이 아닌 십진법의 쉼표로 예상되는 것으로 설정되었다고 사용자에게 제안했다. – ChrisF

+0

이 [새 질문] (http://stackoverflow.com/questions/8883801/double-tryparse-ignores-numberformatinfo-numbergroupsizes) 예외가 아닌 결과가 왜 나옵니까? – ChrisF

2

또는 단순히 입력 텍스트가 null이 아니거나 비어 있는지 확인할 수 있습니다.

또한 일부 국가에서는 "." (도트)는 ","(쉼표)

+0

사실, 그것의 점은 작동하지 않습니다. 나는 그것을 쉼표로 변경했을 때 효과가있었습니다. 전체 파일을 변경해야 할 수도 있습니다. –

+1

아니요, 그렇지 않습니다. 사용자 정의 구분 기호로 인식되도록 도트를 설정할 수 있습니다. – inazaruk

+0

재미 있지만, 어떻게? –

6

먼저 null 또는 빈 문자열을 확인할 수 있습니다.

Parse의 오버로드 중 하나 (또는 ​​심지어 TryParse)를 사용하여보다 구체적인 제어를 제공 할 수도 있습니다.

예. 비 사용자 표시 데이터 소수 분리 변형을 방지하기 위해 invarient 배양을 이용하여 확인 (예 A2A 통신에서) 내게

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

다음 방법 :

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

역방향 케이스 (작동 모든 coutries) :

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
관련 문제