在DataTable.Select()中将字符串值与double进行比较

时间:2015-12-07 10:30:40

标签: c# sql datatable ado.net

我的数据表工资列是string列,用户以字符串格式提供输入值,例如userInput="1000"。但是存储在薪水栏中的数据如下图所示。如何将用户输入与存储在数据表中的数据进行比较?

enter image description here

我目前的代码是

DataRows[] rows = dt.Select("Salary='"+userInput+"'");

2 个答案:

答案 0 :(得分:3)

我会使用Linq-To-DataTable:

decimal value;
if(decimal.TryParse(userInput, out value))
{
   var filteredRows = from row in dt.AsEnumerable()
                      where row.Field<decimal>("Salary") == value
                      select row;
   // if you want an array:
   DataRow[] rows = filteredRows.ToArray();
}

如果您坚持使用DataTable.Select,则必须删除撇号:

DataRow[] rows = table.Select("Salary=" + userInput);

但是这假设输入值使用的是英文格式(所以f.e.不使用逗号等不同的小数分隔符,甚至会导致SyntaxErrorException)。

如果列的类型实际为string,则需要将其解析为double或decimal:

var filteredRows = from row in dt.AsEnumerable()
                   where decimal.Parse(row.Field<string>("Salary")) == value
                   select row;

但是在这个cae中你应该更好地修复错误的数据类型。

答案 1 :(得分:0)

为避免格式化问题,您应该更好地比较数值。 DataTable选择过滤器支持Convert功能:

var dt = new DataTable();
dt.Columns.Add("Salary", typeof(string));

// test values
dt.Rows.Add("0.10000");
dt.Rows.Add(".1");
dt.Rows.Add("-.1");
dt.Rows.Add("1.1");

decimal salary;
string userInput = "0.10";
if (decimal.TryParse(userInput, out salary))
{           
    DataRow[] matchedRows = dt.Select("Convert(Salary, 'System.Decimal') = " + salary.ToString());
    foreach(var r in matchedRows)
        Console.WriteLine(r["Salary"]);
}

输出是:

.1
0.10000