【问题标题】:Invalid Cast error while adding items to a List<double>将项目添加到 List<double> 时出现无效的 Cast 错误
【发布时间】:2014-01-16 09:27:32
【问题描述】:

我有一个问题。我正在使用 Visual Studio 在 c# 中编写一个应用程序。在应用程序中,我有包含产品、价格和数量列的数据表。对于每一列,我尝试将数据表中的所有行保存在列表中。例如:

List<string> products = new List<string>();
for (int i = 0; i < dt.Rows.Count; i++)
{
    products.Add(dt.Rows[i]["products"].ToString());               
}

此代码运行良好。问题是当我尝试将列价格中的数据保存到双列表中时。我尝试了很多方法,但没有一个是正确的。我试图做的是。 例如

List<double> prices = new List<double>(); 
for (int i = 0; i < dt.Rows.Count; i++)
{
    prices.Add((double)dt.Rows[i]["price"]);
}

我总是收到错误消息 Specified cast is not valid。我还尝试了double parse,上面写着:input string was not in correct format。 我要做的就是将数据表中的数据存储到双列表中。

【问题讨论】:

  • 调试代码时dt.Rows[i]["price"]的值是多少?
  • 打印出您要转换为双精度的项目,并检查是否没有空值、空字符串、空格或格式错误的数字字符串。
  • 您的数据库中的价格是什么类型?
  • Parse 是个好主意!由于“输入字符串的格式不正确”,您是否检查过输入字符串实际上是什么?也许句号. 和/或逗号, 的使用方式与您的.NET 文化所期望的不同?也许有一些字符,比如$USD 之类的货币指示符,或者其他的。
  • 价格显示为例如 9,8 和逗号。会不会是个问题。应该与点一起出现吗?

标签: c# list for-loop casting double


【解决方案1】:

试试

 using System.Text.RegularExpressions;

然后

 prices.Add(Convert.ToDouble(Regex.Match(dt.Rows[i]["price"].ToString().Trim(), 
                   @"\d+").Value, CultureInfo.InvariantCulture));;

【讨论】:

  • 不起作用。获取错误输入字符串的格式不正确。
  • @user3201743 请显示'dt.Rows[i]["price"]'中有哪些数据
  • 在数据库中,我将价格数据设置为数据类型货币。在从数据库中读取的数据表中,例如 9,8 和 ,.
  • 嗯..我复制了你的代码,但我收到一个错误,错误'object'不包含'Trim'的定义并且没有扩展方法'Trim'接受'object'类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用)
  • 对不起,必须在trim之前加上.ToString(),如答案所示
【解决方案2】:

你必须使用Convert.ToDouble函数:

prices.Add(Convert.ToDouble(dt.Rows[i]["price"]));

如果您仍然收到错误消息,则可能是文化问题。 当您的价格使用小数分隔符 "," 而不是 "." 或者您有一些 thounds 分隔符(例如 "1,523.25")时,您可能还必须将 Culture 定义为 Convert.ToDouble 的第二个参数

【讨论】:

    【解决方案3】:

    试试Trim,前面或后面可能有空格

    prices.Add(Convert.ToDouble(dt.Rows[i]["price"].ToString().Trim(),
              System.Globalization.CultureInfo.InvariantCulture));
    

    使用 linq,您可以按如下方式执行此操作(添加 using System.Linq;

    List<double> doubles = dt.AsEnumerable()
                                .Select(r => r.Field<double>(1)) // assume price column index is 1
                                .ToList();
    

    如果您的价格中有空格、千位分隔符和货币符号等元素,您可以使用Double.Parse Method

    如果您的价格中有逗号,请尝试如下所示

    prices.Add(double.Parse(dt.Rows[i]["price"].ToString(),NumberStyles.AllowThousa‌​nds, CultureInfo.InvariantCulture));
    

    【讨论】:

    • 您真的想用(double)s 语法将字符串s“转换”为double吗?编辑:如果Trim() 实际上在范围内,因为它的返回类型是string,那么转换为double 将是一个编译时错误。但是Trim() 几乎无效,因为编译时类型可能是object(?)。
    • 与 linq 我仍然得到同样的错误。最后一个带有 numberStyles 的似乎很正确,但是当我复制您的代码时出现错误:当前上下文中不存在名称“NumberStyles”,“CultureInfo”
    • @user3201743 使用 System.Globalization 添加;
    • @Rok 给定您对问题的评论(而不是此答案)的信息,您是否要将"9,8"(九个逗号八)解析为98(九十八)?因为如果你允许千位分隔符并使用InvariantCulture,逗号或多或少会被忽略。
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多