2008-09-29 2 views
34

CSharp에서 float을 구문 분석하는 가장 좋은 방법은 무엇입니까? TryParse에 대해 알고 있습니다. 특히 점, 쉼표 등이 궁금합니다.플로트를 파싱하는 가장 좋은 방법은 무엇입니까?

내 웹 사이트에 문제가 있습니다. 내 dev에 서버에서 ','십진수, '.' 분리기 용. 그러나 찌르다 서버에서, 그것은 다른 방법 라운드입니다. 이것을 가장 잘 캡처하려면 어떻게해야합니까?

+1

누구나하고있는 것처럼 보입니다. 개인적으로 <3 자 이상의 검색 용어를 사용하지 마십시오. 모든 검색어가> 3 자 이상이어야하는 시대를 지나서 저와 붙어있는 것으로 생각하십시오. 또한 # 기호는 내 거미가 울창하게 만든다. –

답변

23

입력의 출처에 따라 다릅니다.

사용자가 입력 한 내용 인 경우 사용자/페이지가 (Thread.CurrentThread.CurrentUICulture) 인 CultureInfo를 사용해야합니다.

HttpRequest.UserLanguages 속성을보고 사용자 문화권을 얻고 표시 할 수 있습니다. (100 % 정확하지는 않지만 가장 좋은 첫 번째 추측을 찾았습니다.) 해당 정보를 사용하여 페이지의 시작 부분에 Thread.CurrentThread.CurrentUICulture을 설정할 수 있습니다.

입력 내용이 내부 소스에서 오는 경우 InvariantCulture을 사용하여 문자열을 구문 분석 할 수 있습니다.

입력이 제어 된 소스에서 오는 경우 Parse 메서드를 사용하는 것이 다소 쉽습니다. 즉, 문자열의 유효성을 이미 확인했습니다. 구문 분석은 실패 할 경우 (느린) 예외를 throw합니다.

입력이 제어되지 않는 경우 (사용자 또는 다른 인터넷 소스에서) TryParse이 나에게 잘 어울립니다.

3

Try/Parse로 구문 분석 할 때 중립 문화 (또는 아는 사람)를 사용하십시오.

5

내부 용으로 지속 값 (숫자, 날짜, 시간 등)을 원할 경우. 매번 & 구문 분석 값을 형성하기 위해 "InvariantCulture"를 사용하십시오. "InvariantCulture는"모든 컴퓨터에 동일 등 사용자의 문화/언어 /와 모든 OS ...에

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo); 
float numFloat = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat); 
string strNow = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo); 
DateTime now = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow); 
+0

사실이지만이 질문과 관련이 없습니다. –

1

패스 CultureInfo 또는 같은 플로트를 구문 분석하려는 문화를 대표하는 NumberFormatInfo; 이것은 소수 자릿수, 그룹 구분 기호 등에 사용되는 문자를 제어합니다.

예를 들어 '. 특성은 CultureInfo.InvariantCulture에서 전달할 수있는 십진 표시기로 처리되었습니다 (이 것은 일반적으로 환경의 문화와 관계없이 모든 것이 동일하게되기를 원하는 서버 응용 프로그램에서 매우 유용합니다).

41

나는 leppie의 답변에 동의합니다. 코드의 관점에서 그것을 넣어 :

string s = "123,456.789"; 
float f = float.Parse(s, CultureInfo.InvariantCulture); 
5

당신은 항상 사용할 수있는 문화를 포함 Parse의 과부하를 사용할 수 있을까? 예를 들어

: 당신은 모든 데이터를 제어 할 수있는 경우

Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting 

, 당신은 당신의 모든 코드에 "CultureInfo.InvariantCulture"를 사용합니다.

0

float.Parse를 피하기 위해 tryParse를 사용하는 것이 좋습니다. 대신 TryParse를 사용하는 것이 훨씬 좋지만 동일한 작업을 수행합니다. 이것은 double, DateTime 등에도 적용됩니다.

(일부 유형은 또한 더 나은 수행하는 TryParseExact를 제공합니다!)

+1

TryParse는 모든 데이터가 유효하더라도 실제로 더 빠르게 작동합니까? 나는 그들이 "성공"케이스에서 동일한 성능을 가지길 기대하지만, 예외를 던지는 비용 때문에 TryParse가 Parse보다 빠르다는 것이 빠르다. –

+0

그리고 TryParse가 false를 반환하면 다시 예외를 throw 할 것입니까? 이 경우 float.Parse가 TryParse보다 효율적입니다! – Sklivvz

+0

구문 분석하는 문자열이 대부분 유효한 float이면 tryparse가 빠릅니다. 아마도 다른 문자열을 많이 가지고 있다면 parse가 더 나은 선택이지만 문자열 표현으로 유효한 float (99 %의 경우)이 많은 문자열 (수십만 개)을 많이 사용할 때는 tryparse를 사용하십시오. –

0

소스는 웹 사이트에서 입력합니다. 나는 그것이 유효하다는 것에 의지 할 수 없다. 그래서 전에 언급 한 TryParse를 사용했습니다. 하지만 어떻게 currentCulture 줄 수 알아낼 수 없습니다.

또한,이 날은 현재 실행중인 서버의 문화를 줄 것이다, 그러나 월드 와이드 웹 이후 당신이 웹 사용자를 알 수 없기 때문에, 사용자는

-1

... 어디서든 할 수있다 문화, 당신은 추측을 할 수 있습니다. TryParse는 분리 자 및를 사용하는 문화권과 함께 사용됩니다. 10 진수의 경우 AND TryParse는 사용하는 문화권을 사용합니다. 분리 기호 및 10 진수. 둘 다 성공하지만 다른 대답을 내면 사용자에게 의도 한 것을 묻습니다. 그렇지 않으면 두 개의 동일한 결과 또는 하나의 사용 가능한 결과 또는 사용 가능한 결과가 없으므로 정상적으로 진행할 수 있습니다.

+0

허용되는 대답을 표시하려면 적어도 이유를 설명하십시오. 그것을 아래로 표시 ... –

+0

이 답변은 수락되기 전에 기록되었습니다. 실제로 다른 사람이 HttpRequest.UserLanguages ​​속성을 살펴 보라고 제안했기 때문에 이것이 받아 들여진 것을 보니 약간 놀랐습니다. 나는 나의 대답이 두 번째 장소에 있어야한다고 생각한다. –

+0

아, 이제 접수 된 후 두 번째로 표시되었습니다. 나는 그 제안에 동의한다. 누구든지 동의 한 후에 그것을 표시 한 사람은 적어도 이유를 설명해야한다. –

0

당신은 간단한 문 서버의 현재 Cuklture을 알 수 있습니다 : 이드 CurrentUICulture 속성 만 ResourceMeanager 폼 multilanguages ​​응용 프로그램에서 UICulture가 사용된다

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture; 

하는 것으로. 숫자 서식을 지정하려면 CurrentCulture를 고려해야합니다.

이게 도움이되기를 바랍니다.

관련 문제