【问题标题】:Casting keeps on getting errors铸造不断出错
【发布时间】:2020-03-05 10:01:25
【问题描述】:

我有一个包含以下数据的 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]);) 之前打印了 data[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:无法从 'object' 转换为字符串。

double temperature = double.TryParse(data[i][2]);

参数 1:无法从 'object' 转换为字符串。

double temperature = System.Convert.ToDouble(data[i][2]);

FormatException: 输入字符串的格式不正确。

那我要怎么投呢?

【问题讨论】:

  • 我看到“System.String”。
  • 尝试使用 InvariantCulture:double.TryParse(data[i][2], NumberStyles.Any, CultureInfo.InvariantCulture, out temperature);。可能是在您的本地文化中,默认情况下使用 double 的分隔符是 , 而不是 .
  • 有了 InvariantCulture 我也得到了Argument 1: cannot convert from 'object' to string.
  • 如果你这样做:double.TryParse(data[i][2].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out temperature); ?
  • 这行得通@Fabjan,谢谢!

标签: c# casting double


【解决方案1】:

因为您的数字使用点作为小数分隔符并且您的系统本地化可以使用不同的,所以您可以使用它:

using System.Xml;

double temperature = XmlConvert.ToDouble(data[i][2].ToString());

如果解析错误会引发异常。

所以你可以尝试...catch 来管理它。

也许您需要将 System.Xml 添加到项目的程序集引用中。

否则您可以使用@Fabjan 解决方案:

if (double.TryParse(data[i][2].ToString(),
                    System.Globalization.NumberStyles.Any,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out var temperature);
  IsOk();
else
  IsNotOk();

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多