2013-09-30 89 views
-1

情況 - 在我的web應用程序的線程培養已被設置爲「ES」(西班牙語)Double.TryParse轉換0.1-1.0

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) 

number returns 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是1(西班牙語的分隔符是小數點'。')。但是,數字1000.0不會轉換爲10000.因此,它似乎只失敗了0.1 任何解釋都非常感謝!

+1

適合我工作 –

+1

只要你將特定的文化傳遞給'double.TryParse()',線程的文化應該是無關緊要的。我注意到你沒有在設置提供者變量的地方包含代碼;你是否100%確定你正在發送你認爲你正在發送的提供商?順便說一下,最好使用'CultureInfo.InvariantCulture'而不是「en-US」,儘管它不會影響你的情況。 –

+1

Wat是'提供者'指向?這是最關鍵的部分,它不見了。 –

回答

0

我終於找到了錯誤。這個問題不是TryParse()函數,而是ToString()函數。

該值實際上是一個Double類型,而不是像上面提到的那樣的一個字符串。 (我的不好,我認爲這不相關)。我實際上在做一個value.ToString()。這是它使用線程文化並更改值的地方。 因此,如果值爲0.1,則value.ToString()將其更改爲「0,1」。它會根據線程文化自動更改小數點。然後,TryParse使用en-US文化並將「0,1」轉換爲1.

要修復它,請改用Convert.ToString並傳入文化信息。

最後,這只是一個愚蠢的錯誤。

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,1」;

    double。TryParse(numberInSpanish,NumberStyles.Any,culture,out number);

+0

我使用InvariantCulture嘗試過,但值仍然是1.0。它似乎總是選擇線程文化。 – Zuber

相關問題