2010-03-08 25 views
2

我想打一個通用的字符串,數字轉換器,並提供其作爲字符串的擴展,所以我寫了下面的代碼:如何使用Convert.ChangeType將字符串轉換爲具有組分隔符的數字?

public static bool TryParse<T>(this string text, out T result, IFormatProvider formatProvider) where T : struct 
try 
{ 
    result = (T)Convert.ChangeType(text, typeof(T), formatProvider); 
    return true; 
} 
catch(... 

我這樣稱呼它:

int value; 
var ok = "123".TryParse(out value, NumberFormatInfo.CurrentInfo) 

它的工作原理直到我想使用組分隔符: 因爲我住在法國,千位分隔符是空格,小數點分隔符是逗號,字符串「1 234 567,89」應該等於1234567.89(在不變式文化中)。但是,該功能崩潰!

當試圖執行非通用轉換,如double.Parse(...),我可以使用接受NumberStyles參數的重載。我指定NumberStyles.Number,這次它的工作!

所以,問題是:

  • 爲什麼解析不尊重我的NumberFormatInfo(其中我在操作系統中指定的NumberGroupSeparator被明確指定爲空格)
  • 我怎麼可能讓工作具有Convert.ChangeTime的通用版本,因爲它沒有重載,它接受一個NumberStyles參數?

回答

3

嘗試指定明確的文化 「FR-FR」:

CultureInfo c = new CultureInfo("fr-FR"); 
double d = 0; 
if ("1 234 567,89".TryParse<double>(out d, c)) { 
    Console.WriteLine(d); 
} 

編輯:這個例子正常工作:

static class Extension { 
    public static bool TryParse<T>(this string text, out T result, IFormatProvider formatProvider) where T : struct { 
     result = default(T); 
     try { 
      result = (T)Convert.ChangeType(text, typeof(T), formatProvider); 
      return true; 
     } catch { 
      return false; 
     } 
    } 

} 

class Program { 
    static void Main(string[] args) { 
     CultureInfo c = new CultureInfo("fr-FR"); 
     double d = 0; 
     // NumberGroupSeparator in fr-FR culture is space 
     bool res = "123 456,78".TryParse<double>(out d, c); 
     // Set separator as '.' and parse string with dots 
     c.NumberFormat.NumberGroupSeparator = "."; 
     res = "123.456,78".TryParse<double>(out d, c); 
    } 
} 

EST-CE闕CA馬爾凱COMME CA? :)

+0

我嘗試了幾種文化,這是同樣的事情:有效的組分隔符的存在引發FormatException;儘管它適用於其他事情(小數點分隔符,日期和時間分隔符)。對於千位分隔符,您必須指定一個NumberStyles.AllowThousands值。但正如我之前所說,Convert.ChangeType沒有這種參數的重載。 – Loic 2010-03-08 12:37:10

+0

它適用於雙打,但嘗試整數:它會失敗! 以下代碼拋出格式異常: VAR I =(int)的Convert.ChangeType( 「1 234」 的typeof(INT),新的培養物( 「FR-FR」); 下面的代碼工作: 變種d =(double)Convert.ChangeType(「1 234」,typeof(double),new Culture(「fr-FR」); – Loic 2010-03-10 13:27:37

+0

@Loic:你是對的,也許Convert.ChangeType沒有在其實現中指定NumberStyles.AllowThousands 。關於它我們沒有太多可以做的,恐怕你必須自己處理它,而不使用Convert.ChangeType。 – 2010-03-10 14:05:00

相關問題