2008-11-20 88 views
11

我正在研究一個工具,我需要將字符串值轉換爲正確的對象類型。例如。將字符串"2008-11-20T16:33:21Z"轉換爲DateTime值。數字值,如"42""42.42"必須分別轉換爲Int32值和Double值。如何確定一個字符串是否是C#中的數字

什麼是檢測字符串是整數還是數字的最好和最有效的方法?要走的路是Int32.TryParse還是Double.TryParse

回答

9

就效率而言,是的,TryParse通常是首選路線。

如果你能知道(例如,通過反射)提前目標類型 - 但不希望有使用大switch塊,你可能有興趣使用TypeConverter - 例如:

 DateTime foo = new DateTime(2008, 11, 20); 
     TypeConverter converter = TypeDescriptor.GetConverter(foo); 
     string s = converter.ConvertToInvariantString(foo); 
     object val = converter.ConvertFromInvariantString(s); 
20

Int.TryParseDouble.TryParse具有實際返回數字的好處。

類似Regex.IsMatch("^\d+$")的缺點是您仍然需要再次解析字符串以獲取值。

+0

另一個額外的好處是,TryParse方法返回一個布爾變量,因此在解析數字時很容易爲您的成功和失敗場景編寫代碼。 – 2008-11-20 15:56:01

2

我會推薦.TryParse()個人。無論如何,這就是我所使用的。那就是如果你的數據會一次又一次地出錯。如果您確定傳入的字符串可以毫無困難地轉換爲整數或雙精度,則.Parse()會更快。

這裏有一個有趣的link來支持這一點。

0

保持轉換器跳過開關塊的想法,您可以使用Duck Typing的概念。基本上,你想把一個字符串轉換爲X,所以你創建一個方法,如果X上有TryParse,就會調用X.TryParse(string,out X x),否則你就不會打擾(或者我猜你可以拋出一個錯誤)。你會如何做到這一點?反思和泛型。

基本上你會有一種方法,將採取一種類型,並使用反射,看看它是否有TryParse。如果你找到了這樣一種方法,那麼你可以調用它並返回任何TryParse設法獲得的方法。這適用於像Decimal或DateTime這樣的任何值類型。

public static class ConvertFromString 
{ 
    public static T? ConvertTo<T>(this String numberToConvert) where T : struct 
    { 
    T? returnValue = null; 

    MethodInfo neededInfo = GetCorrectMethodInfo(typeof(T)); 
    if (neededInfo != null && !numberToConvert.IsNullOrEmpty()) 
    { 
     T output = default(T); 
     object[] paramsArray = new object[2] { numberToConvert, output }; 
     returnValue = new T(); 

     object returnedValue = neededInfo.Invoke(returnValue.Value, paramsArray); 

     if (returnedValue is Boolean && (Boolean)returnedValue) 
     { 
     returnValue = (T)paramsArray[1]; 
     } 
     else 
     { 
     returnValue = null; 
     }  
    } 

    return returnValue; 
    } 
} 

凡GetCorrectMethodInfo會是這個樣子:

private static MethodInfo GetCorrectMethodInfo(Type typeToCheck) 
{ 

    MethodInfo returnValue = someCache.Get(typeToCheck.FullName); 

    if(returnValue == null) 
    { 
    Type[] paramTypes = new Type[2] { typeof(string), typeToCheck.MakeByRefType() }; 
    returnValue = typeToCheck.GetMethod("TryParse", paramTypes); 
    if (returnValue != null) 
    { 
     CurrentCache.Add(typeToCheck.FullName, returnValue); 
    } 
    } 

    return returnValue; 
} 

而且用途是:

decimal? converted = someString.ConvertTo<decimal>(); 

我討厭堵自己,但我有這個充分說明如下:

GetCorrectMethodInfo

Rest of It

相關問題