.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));
结果: