2011-03-19 1 views
8

문자열에 부동 번호가 있습니다. 하나의 문제가 있습니다. 번호는 "."을 (를) 사용합니다. 소수점으로 ","아닙니다.문자열을 부동화하여 C#

이 코드가 작동하지 않습니다 :

MyNumber = float.Parse("123.5"); 

은 내가 구문 분석하기 전에 대체 기능을 "수리"이 문자열을 문자열을 사용할 수 있다는 것을 알고.

MyNumber = float.Parse("123.5".Replace('.',','); 

하지만 다른 방법이 있습니까?

답변

6

다르게 논하기보다는 스티브의 질문에 덧붙여서 중요한 것은 입니다. 소수 구분 기호는 .입니다.

소스가 컴퓨터에서 읽을 수있는 형식으로되어있어 소수점 구분 기호가 문서 사양의 일부로 지정되어있는 경우 Steven이 CultureInfo.InvariantCulture을 사용하는 것과 똑같은 방식으로 이동합니다.

특정 로켈의 사람 입력 인 경우 해당 로케일에 맞는 CultureInfo으로 해당 로케일을 일치 시키려고합니다. 그렇지 않으면 소프트웨어가 다른 로케일과 함께 사용되는 경우 정반대의 문제가 발생합니다. 일반적으로 스레드의 CurrentCulture을이 형식 (형식의 경우 CurrentCulture, 언어의 경우 CurrentUICulture)과 일치하도록 설정하려고합니다. 이 작업을 수행했다면 양식을 float.Parse(string)이 사용하므로 전혀 문화를 전달할 필요가 없습니다. 그러나 float.Parse(string, CurrentCulture)을 사용하여 이것이 자신이하는 일임을 명시하고 싶을 수도 있습니다. 이런 식으로 특정 적이 지 않을 때 불평하는 소프트웨어 분석을하십시오).

마침표와 쉼표를 모두 받아 들여야하는 경우가 있습니다. 소수점 구분 기호로 마침표를 사용하는 문화권이 많기 때문에 쉼표를 천 단위 구분 기호로 사용하고 궁극적으로 모호하지 않은 구문 분석을 보장 할 수 없기 때문입니다. 그러나 수천의 문제가 당신에게 영향을 미치지 않는다고 가정하면 문제의 코드는 접근법입니다. 반대의 경우 (쉼표로 마침표를 바꾸기)를 수행 한 다음 불변하는 문화권으로 파싱하는 것이 좋습니다. 더 많은 문화 변화로 인한 추가 합병증.

20

문자열 바꾸기를 사용하면 매우 약해 버그가 생길 수 있습니다. 대신 IFormatProvider을 지정하십시오. 예를 들어 :

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture); 

또는 당신은 Parse의 또 다른 오버로드를 사용하여 NumberFormatInfo를 지정할 수 있습니다.

+2

왜'NL-NL'가 아닌'CultureInfo.InvariantCulture'을 culturespecific하지 않으려면? –

+2

@Jonas :'nl-NL'은 그 예일뿐입니다. 질문을 자세히 읽은 후에, OP의'CultureInfo.CurrentCulture'는 소수점 구분 기호로','를가집니다. 네덜란드 문화 (nl)는 실제로 소수점 구분 기호로','를 사용하므로 * 작동하지 않습니다 *. 그래서 트릭은 'en-US'와 불변의 문화처럼 소수 구분 기호로'.'를 사용하는 문화를 실제로 설정하는 것입니다. 이걸 가져 주셔서 감사합니다. – Steven

1

현재 실행중인 스레드 문화의 현재 culture에 따라 다릅니다.

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

당신이 엄격하게 다음

float.Parse("123.5", CultureInfo.InvariantCulture);