我正在研究一個工具,我需要將字符串值轉換爲正確的對象類型。例如。將字符串"2008-11-20T16:33:21Z"
轉換爲DateTime
值。數字值,如"42"
和"42.42"
必須分別轉換爲Int32
值和Double
值。如何確定一個字符串是否是C#中的數字
什麼是檢測字符串是整數還是數字的最好和最有效的方法?要走的路是Int32.TryParse
還是Double.TryParse
?
我正在研究一個工具,我需要將字符串值轉換爲正確的對象類型。例如。將字符串"2008-11-20T16:33:21Z"
轉換爲DateTime
值。數字值,如"42"
和"42.42"
必須分別轉換爲Int32
值和Double
值。如何確定一個字符串是否是C#中的數字
什麼是檢測字符串是整數還是數字的最好和最有效的方法?要走的路是Int32.TryParse
還是Double.TryParse
?
就效率而言,是的,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);
Int.TryParse
和Double.TryParse
具有實際返回數字的好處。
類似Regex.IsMatch("^\d+$")
的缺點是您仍然需要再次解析字符串以獲取值。
我會推薦.TryParse()個人。無論如何,這就是我所使用的。那就是如果你的數據會一次又一次地出錯。如果您確定傳入的字符串可以毫無困難地轉換爲整數或雙精度,則.Parse()會更快。
這裏有一個有趣的link來支持這一點。
保持轉換器跳過開關塊的想法,您可以使用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>();
我討厭堵自己,但我有這個充分說明如下:
另一個額外的好處是,TryParse方法返回一個布爾變量,因此在解析數字時很容易爲您的成功和失敗場景編寫代碼。 – 2008-11-20 15:56:01