C# 如何安全的将数字型字符串转为数字?int.TryParse!

时间:2021-02-22 17:58:15
.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));

结果:

C# 如何安全的将数字型字符串转为数字?int.TryParse!