我有一个包含以下数据的CSV文件(无标题)
12,2010,76.5
2,2000,45
12,1940,30.2
并且我正在将数据读取到List<List<object>>
中。
要了解每一行,每一列/每一行的内容,我正在使用以下循环
List<List<object>> data = CSVReaderNoHeader.Read("input")
for (var i = 0; i < data.Count; i++)
{
double month = (double)(int)data[i][0];
print($"month:{month} ////END");
double year= (double)(int)data[i][1];
print($"year:{year} ////END");
double temperature= (double)data[i][2];
print($"temperature:{temperature} ////END");
}
是的,我需要创建双打,这就是为什么我要取消装箱和投射(可以使用double.Parse
代替)的原因。
我可以打印月份和年份,但是达到double temperature= (double)data[i][2];
时会引发以下错误
InvalidCastException:指定的转换无效。
我在那一行(print(data[i][2]);
)之前打印了数据[i] [2]中的内容,只是看是否一切井井有条,并得到了预期的 76.5 。然后,也使用
double temperature= (double)(double)data[i][2];
double temperature= (double)(float)data[i][2];
(我认为没有必要添加多余的(双精度)/(浮点数))和
object tempr = data[i][2];
double temperature;
temperature = (double)tempr;
但是问题仍然存在。因此,我继续运行print(data[i][2].GetType());
来查看返回的类型是否可以转换为双精度型。我得到的结果是 System.String 。
知道了这一点,然后我尝试了double.TryParse,double.Parse和Convert.ToDouble方法,但是都没有效果
double.TryParse(data[i][2], out temperature);
参数1:无法从“对象”转换为字符串。
double temperature = double.TryParse(data[i][2]);
参数1:无法从“对象”转换为字符串。
double temperature = System.Convert.ToDouble(data[i][2]);
FormatException:输入字符串的格式不正确。
那我该如何铸造呢?
答案 0 :(得分:4)
由于您的数字使用点作为小数点分隔符,并且系统本地化可以使用其他字符,因此可以使用:
using System.Xml;
double temperature = XmlConvert.ToDouble(data[i][2].ToString());
如果解析错误,它将引发异常。
因此,您可以尝试...捕获以对其进行管理。
也许您需要将System.Xml添加到项目的程序集引用中。
否则,您可以使用@Fabjan解决方案:
if (double.TryParse(data[i][2].ToString(),
System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture,
out var temperature);
IsOk();
else
IsNotOk();