2014-06-23 97 views
4

如何解析1,2Single.Parse?問的原因是因爲,當我使用CultureInfo.InvariantCulture時,我沒有得到1.2,而是我想要的,而是12.如何使InvariantCulture將逗號識別爲小數點分隔符?

不應該「不變的文化」忽略文化嗎?

Consider the following example

using System; 
using System.Globalization; 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine(Single.Parse("1,2", CultureInfo.InvariantCulture)); 
     Console.WriteLine(Single.Parse("1.2", CultureInfo.InvariantCulture)); 
     float value; 
     Console.WriteLine(Single.TryParse("1,2", NumberStyles.Float, CultureInfo.InvariantCulture, out value)); 
     Console.WriteLine(Single.TryParse("1,2", out value)); 
     Console.WriteLine(value); 
    } 
} 

的這個輸出將是

1.2


但我期待:

1.2
1.2


1.2

BasedonmyInvariantCulturereading我應該得到這個結果,但我不是。

+1

'變種單= float.Parse( 「1,2」,CultureInfo.GetCultureInfo( 「TR-TR」));' –

+0

嗯,我會在加入:'VAR單= float.Parse(「1 ,2「,CultureInfo。GetCultureInfo(「nl-NL」));'基本上,'InvariantCulture'使用'.'作爲小數分隔符。 'Single.Parse'不會忽略它,但''''不是'InvariantCulture'中的小數點分隔符。 – hvd

+2

@Default它使用固定的文化,恰巧使用','作爲小數點分隔符。任何使用'''的文化都可以。重要的是* *用戶*的文化*不被使用。 – hvd

回答

10

CultureInfo.InvariantCulture使用.作爲小數點分隔符,而,作爲千位分隔符。這是獨立於任何用戶設置的,並且與您獲得的字符串無關,因此名稱爲「InvariantCulture」。具體細節列在NumberFormatInfo.InvariantInfo MSDN頁面上。

要使用,作爲小數點分隔符,請勿使用CultureInfo.InvariantCulture。相反,使用確實使用,作爲小數點分隔符的文化。有很多可以滿足你的需求。

或者,根據CultureInfo.InvariantCulture創建自定義文化。你可以調用它的Clone方法來創建一個你可以修改屬性的副本。

+0

確保'InvariantCulture'使用'.'作爲小數分隔符?我(相當)確定千位分隔符不會被使用,所以'string.Replace'將是「安全的」(正如你在評論中提到的那樣)。在克隆的CultureInfo中替換千位分隔符在解析時似乎沒有任何區別。 – Default

+1

@Default是的,我鏈接到的'NumberFormatInfo.InvariantInfo'頁面提到這些值不會改變,並提到示例程序輸出「NumberDecimalSeparator。」。結合這兩者,你可以相當肯定它不會面臨變化。 – hvd

3

您鏈接的文章之一說:「不變文化與英語內部相關聯」。所以'InvariantCulture'並不意味着「試圖匹配任何文化」。這意味着:忽略本地系統文化設置,並將此數字視爲特定標準格式(基本上:英文文化標準)。 所以,如果你要處理不同的格式,在這裏你的選擇是:

  1. 嘗試解析數不specyfing文化(將使用本地OS文化信息),然後嘗試用InvariantCulture的,那麼也許嘗試你期待一些後備文化要格式化的數字。
  2. 用'。'替換','。並使用Invariant文化解析數字字符串。您可能需要確保數字字符串不包含小數點組分隔符(如1,000.00)。
相關問題