.NET Framework提供了一些內置的方法來將C#字符串轉換為int或者其它數值類型,但是在轉換過程中稍不注意可能就會拋出異常,因此找到一個安全有效的方式很重要。
不安全的方式將數值型字符串轉為int類型
您可以使用幾個內置方法(如下所示)將字符串轉換為int。如果字符串值不是有效整數,則這兩個都會拋出異常。
int.Parse((string) null); // 拋出異常 int.Parse("Hello"); // 拋出異常 int.Parse("1.5"); // 拋出異常 var i = int.Parse("1"); // 正常 var i2 = Convert.ToInt32((string) null); //無異常,返回: 0 Convert.ToInt32("hello"); //拋出異常 Convert.ToInt32("1.5"); //拋出異常 Convert.ToInt32("1"); //正常
除了空字符串方案之外,使用內置方法Convert.ToInt32()和int.Parse()產生相同的結果。Convert.ToInt32()的源代碼中有特殊的邏輯來查找null並在內部調用int.Parse:
public static int ToInt32(string value) { if (value == null) return 0; return int.Parse(value, (IFormatProvider) CultureInfo.CurrentCulture); }
如何在字符串轉換為Int時防止異常的出現?
實際開發中,壞數據、臟數據等是不可避免的。在解析數據和轉換數據類型時,肯定需要去處理一些潛在的異常。在此示例中,將字符串轉為int時可能就會出現異常情況。不過.NET Framework提供了針對這個確切問題而設計的int.TryParse,使用示例如下:
// 定義一個待轉換的字符串 string incomingData = "Hello"; // 定一個輸出結果值 int parsedResult; //嘗試進行轉換 ,返回一個bool類型。true:轉換成功 false:轉換失敗 int.TryParse(incomingData, out parsedResult);
如果TryParse失敗,變量parsedResult將為0,正在解析的數據也可能是0。我們可以利用int.ParseInt的返回結果判斷轉換是否成功:
string incomingData = "Hello"; int parsedResult; if (int.TryParse(incomingData, out parsedResult)) { //do something with the data. }
我們利用這一點封裝一個工具類ParseInteger:
public static class ParseInteger { /// <summary> /// 字符串轉int /// </summary> /// <param name="intStr">要進行轉換的字符串</param> /// <param name="defaultValue">默認值,默認:0</param> /// <returns></returns> public static int ParseInt(string intStr, int defaultValue = 0) { int parseInt; if (int.TryParse(intStr, out parseInt)) return parseInt; return defaultValue; } }
調用示例:
Console.WriteLine(ParseInteger.ParseInt("3.0")); Console.WriteLine(ParseInteger.ParseInt("-1")); Console.WriteLine(ParseInteger.ParseInt("445")); Console.WriteLine(ParseInteger.ParseInt("e3")); Console.WriteLine(ParseInteger.ParseInt(null));
結果: