2013-09-30 6 views
-1

1.0 상황 변환 - 내 웹 응용 프로그램에서 스레드 문화 '가 말이지'로 설정하고있다 (스페인어)Double.TryParse 0.1

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("es"); 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("es"); 

문자열 값은 "0.1"다음 식에 대한 ,

입니다
var value = "0.1" 
provider = CultureInfo.CreateSpecificCulture("en-US") 
double.TryParse(value.ToString(), NumberStyles.Any, provider, out number) 

숫자는 1.0을 반환합니다. 그래서 나는 그것이 문화 정보를 실에서 골라 내고 있다고 생각하게 만듭니다. 내가 제공하는 것이 아닙니다.

다음 단위 테스트가 (예상대로) 통과합니다.

var numberInEnUS = "0.1"; 
var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
culture = new CultureInfo("en-US", false); 
Thread.CurrentThread.CurrentCulture = spanishCulture; 
Thread.CurrentThread.CurrentUICulture = spanishCulture; 
double number; 
double.TryParse(numberInEnUs, NumberStyles.Any, culture, out number); 
Assert.AreEqual(0.1, number); 

그래서 질문은 왜 내 응용 프로그램에서 double.TryParse가 실패합니까? 이론적으로 스페인어의 경우 0.1입니다 (스페인어의 경우 구분 기호는 소수점 '.'). 그러나 1000.0은 10000으로 변환되지 않습니다. 따라서 0.1 만 실패합니다. 모든 설명을 높이 평가합니다!

+1

나를 위해 잘 작동 –

+1

특정 문화권을'double.TryParse()'에 전달하는 한 스레드 문화권은 관련이 없어야합니다. 나는 당신이 공급자 변수를 설정 한 코드를 포함하지 않았다는 것을 알아 차렸다; 당신이 보낸다고 생각하는 공급자를 100 % 확신하고 있습니까? 그건 그렇고, "CultureInfo.InvariantCulture"를 "en-US"보다 사용하는 것이 더 나을 것입니다. –

+1

Wat는 'provider'를 가리 킵니까? 그게 가장 중요한 부분이고 그것은 없어졌습니다. –

답변

0

나는 결국 무엇이 잘못되었는지를 확인할 수있었습니다. 이 문제는 TryParse() 함수가 아니라 ToString() 함수를 사용하여 발생했습니다.

값은 실제로 위에서 언급 한 것처럼 문자열이 아닌 Double 유형입니다. (내 잘못, 나는 그것이 적절하지 않다고 생각했다.) 나는 실제로 value.ToString()을하고있었습니다. 여기서 스레드 문화권을 사용하고 값을 변경합니다. 값이 0.1 인 경우 value.ToString()은 값을 "0,1"로 변경합니다. 스레드 문화에 따라 소수 자릿수가 자동으로 변경됩니다. 그러면 TryParse가 en-US 문화권을 사용하고 "0,1"을 1로 변환합니다.

수정하려면 대신 Convert.ToString을 사용하고 culture 정보를 전달합니다.

결국 바보 같은 실수였습니다.

LessonLearnt - 세계화 된 응용 프로그램에서 ToString()을 사용할 때주의하십시오!

1

"0.1"은 스페인어로 표시됩니다. 실제로하지, 그것은 numberInEnglish 또는 다른

var numberInSpanish = "0.1";//this is number in english culture 

뭔가 그것은 스페인어에 대한

var numberInSpanish = "0,1";//<--Note 0,1 

NumberDecimalSeparator,입니다해야합니다. 구문 분석 0,1 예상되는 결과를 얻을 수 있습니다. 여기

var numberInSpanish = "0,1"; 
var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
var culture = new CultureInfo("en-US", false); 
Thread.CurrentThread.CurrentCulture = spanishCulture; 
Thread.CurrentThread.CurrentUICulture = spanishCulture; 
double number; 
double.TryParse(numberInSpanish, NumberStyles.Any, spanishCulture, out number); 

number 제대로 "0.1"

0

귀하의 문제는 소수의 혼합하고 천 단위 구분, 즉에 구문 분석 : '.'

- 분석 할 때 "ES"배양 천 세퍼레이터, 는 무시한다 (예 1.000,0 == 1000,0)

','- 'ES'배양 소수점 deparator은 정수 및 분수 부분을 분리

당신은 쉽게 자신을 설득 할 수

var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
    Char dS = spanishCulture.NumberFormat.NumberDecimalSeparator; // <- ',' 
    Char tS = spanishCulture.NumberFormat.NumberGroupSeparator; // <- '.' 

따라서, 귀하의 경우 문자열 "0.1"부터 이중 1.0으로 변환됩니다 '.' 은 (는) 천개의 분리 기호로 구분되므로 무시됩니다. 당신은 하나를 수행 할 수

  1. 사용을 고정 문화권을 대신 한 "ES"의 :

    double.TryParse (numberInNeutral, NumberStyles.Any, CultureInfo.InvariantCulture, 밖으로 번호);

  2. 또는 사용 실제 스페인어 숫자 표현 :

    var에 numberInSpanish = "0"을;

    이중.TryParse (numberInSpanish, NumberStyles.Any, culture, out number);

+0

InvariantCulture로 시도했지만 여전히 값은 1.0입니다. 항상 스레드 문화를 선택하는 것 같습니다. – Zuber