【问题标题】:C# string to number, TryParse returns true when Parse failsC# 字符串转数字,TryParse 在 Parse 失败时返回 true
【发布时间】:2015-04-25 15:38:01
【问题描述】:

我的数据库 (SQL Server) 中有一个列将平均值存储为 varchar。

值并不总是有效的数字,它可以是:0、12、5.5、.4、4.0、6.、5.21428571428571428571428571428571428571、X、@987654329 @,或者只是空文本。

当用 linq 分配变量时,我想显示:

  • success 如果平均值是有效数字并且 >= 4
  • failed 如果平均值是有效数字并且
  • 如果平均值不是有效数字,则为原始文本

代码:

myresults = myDataContext.myDbFunction()
double note;
from a in myresults
select new MainReportModel()
{
    Id = a.id,
    Lastname = a.nom,
    Firstname = a.prenom,
    Average = a.moyenne,
    Result = double.TryParse(a.moyenne.Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out note) ? (double.Parse(a.moyenne.Trim(), NumberStyles.Number, CultureInfo.InvariantCulture) < 4 ? "failed" : "success") : a.moyenne
}

但是解析失败了。

将double.Parse(a.moyenne.Trim() 替换为任何硬编码值(例如double.Parse("3.3")时,它可以正常工作。

因此,a.moyenne.Trim() 的值之一似乎导致 Parse 失败。

如果 TryParse 返回 true 怎么会失败?

编辑:这是错误信息:

Could not translate expression 'value(MyProjectWeb.Models.MyProjectDataContext).myDbFunction().Select(a => new MainReportModel() {Id = a.id, Lastname = a.nom, Firstname = a.prenom, Average = a.moyenne, Result = IIF(TryParse(a.moyenne.Trim(), Number, Invoke(value(System.Func`1[System.Globalization.CultureInfo])), Invoke(value(System.Func`1[System.Double]))), IIF((Parse(a.moyenne.Trim(), Number, Invoke(value(System.Func`1[System.Globalization.CultureInfo]))) < 4), Invoke(value(System.Func`1[System.String])), "success"), ((a.moyenne) + "</span>"))})' into SQL and could not treat it as a local expression.

【问题讨论】:

  • 您是否尝试过调试并查看值是多少?
  • 我没想到会发生这种情况。你能粘贴引发异常的输入字符串吗?
  • 如何遍历数据并一一尝试,直到遇到导致问题的值?
  • 另外,解析两次,你不能做这样的事情吗? double.TryParse(a.moyenne.Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out note) ? note &lt; 4 ? "fail" : "success" : a.moyenne;
  • @GrawCube 调试不允许我一一看到记录。我已经尝试过使用note 变量,但它始终是0。当我能够重新编译我的代码时,我将使用错误消息更新我的帖子。

标签: c# linq linq-to-sql number-formatting tryparse


【解决方案1】:

你不能在Sql server上执行TryParse,但是如果你没有做进一步的选择条件,那么你可以尝试从Sql中拉取数据,然后在客户端解析。

例如

myresults = myDataContext.myDbFunction()
double note;

var list =(from a in myresults
select new 
{
   a.id,
   a.nom,
   a.prenom,
   a.moyenne,
}).ToList();


var finalResults = (from a in list 

select new MainReportModel()
{
   Id = a.id,
   Lastname = a.nom,
   Firstname = a.prenom,
   Average = a.moyenne,
   Result = double.TryParse(a.moyenne.Trim(), NumberStyles.Number,    CultureInfo.InvariantCulture, out note) ? (double.Parse(a.moyenne.Trim(), NumberStyles.Number, CultureInfo.InvariantCulture) < 4 ? "failed" : "success") : a.moyenne
}

【讨论】:

  • 确实!只需添加ToList() 就可以了:myresults = myDataContext.myDbFunction().ToList()。但是我不确定为什么它使用硬编码值起作用。
  • 如果你有一个硬编码的值,那么它不依赖于你的Sql表,因此在客户端执行,即你的select语句将只是select id, nom, prenom, moyenne from ...
【解决方案2】:

你为什么不在第二个也使用 TryParse?

Result = double.TryParse(a.moyenne.Trim(), NumberStyles. Number, CultureInfo.InvariantCulture, out note) ? (double.TryParse(a.moyenne.Trim(), NumberStyles.Number, CultureInfo.InvariantCulture) < 4 ? "failed" : "success") : a.moyenne

试试看。

【讨论】:

  • double.TryParse 返回一个布尔值,您无法将其与该数字进行比较。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多