一、背景
在从Excel中获取内容时,经常遇到数字类型的数据,当我们想要将这些数字格式的数据转放到实体类中时,如果不考虑判断直接使用xxx.Parse()
或者Convert.Toxxx()
当遇到某些数据格式不正确的时候会报数据格式异常的错误提醒。为了让程序更好的运行,有更高的容错性,需要对数据先有个判断。
二、使用的方法
在网上寻找相关解决方法时,有些人喜欢使用正则表达式来处理。不过对于单纯的数字而言,表达式还是比较简单好使的,但是涉及到小数点的时候,需要分情况来进行编写程序判断。对于喜欢简化的人来说这还是比较痛苦的。
幸好,我还找到了一个更加简便的方法,几乎可以用一句话来解决这个问题,这就是decimal.TryParse()
,通过这个方法可以判断所传入的内容是否可以转为数值格式。代码如下所示:
decimal dec = 0;//定义一个数值
if(decimal.TryParse(string, out dec))
{
//转化成功后可以直接使用dec的内容了
}
有了这个方法一下子帮我解决了许多问题,我不必为了一个数值的错误而在Excel中反复查找错误的原因,但是在实际使用Excel时还会遇到一个叫科学计数法的内容。明明在Excel中是一个数值,但是当从Excel中读取出来是就成了类似11E-03格式的数值,这个通过上述的方法简单判断就又不行了,他会默认这是一个普通的带字母的字符串,无法转为数值。这时,我们还需要对此类科学计数法进行格式判断,通常遇到这类情况第一反应还是使用正则表达式,但是我们还是可以使用上述的方法(不过需要更改一下)来简单的实现此类效果。代码如下:
// 如果不是普通的数值而是以科学计数法存在的判断能否转成数值类型
NumberStyles style = NumberStyles.Float | NumberStyles.Integer;
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-GB");
if (decimal.TryParse(key.FindByName(item.Name), style, culture, out dec))
{
//转化成功后可以直接使用dec的内容了
}
在官网上这个方法比我现在使用的还要强大,如果感兴趣的可以参考官网上的介绍:Decimal.TryParse 方法 ;其中对于NumberStyles还是好理解的,就是对应的数据格式,但是对于后面的CultureInfo乍一看不是好理解的,理解之后就明白这是对相应的数据的一种格式分析,这里我提供官方提供的详细介绍,看完之后收获还是挺大的:IFormatProvider 接口