【问题标题】:Function Int32.TryParse("23.0") returning false - C# MVC4函数 Int32.TryParse("23.0") 返回 false - C# MVC4
【发布时间】:2013-08-30 15:19:16
【问题描述】:

在我的代码中,我尝试获取浏览器版本以收取良好的 css 文件,但此代码不起作用,我没有看到我的错误...

我只是先尝试​​使用 Convert.ToInt32 但也不起作用...

public ActionResult Index()
        {
            ViewBag.logged = false;
            ViewBag.BrowserName = Request.Browser.Browser.ToString();
            Int32 v = 0;
            string version = Request.Browser.Version;

            if (version != null)
            {
                bool result  = Int32.TryParse(version, out v);
            }
            ViewBag.BrowserVersion = v;
            return View();
        }

在我的调试器中:

version => string : "23.0"
v => int 0
result => false
Request.Browser.Version => string "23.0"

【问题讨论】:

  • 为什么不使用浮点数?
  • 这是设计
  • @Vladimir "23.0" 是一个字符串,但可以正常转换为 int...
  • HttpBrowserCapabilities.MajorVersion 会为您解决问题,如果这就是您所需要的。
  • @fmgp 我不使用浮点数,因为这里:codeproject.com/Articles/1682/…,解释一下返回 int 或 decimal

标签: c# asp.net-mvc c#-4.0 asp.net-mvc-4


【解决方案1】:

这是设计使然。

使用System.Version 解析版本字符串会更好。

您也可以将其解析为浮点数,然后查看是否可以无损转换为 Int32。

【讨论】:

  • 这些解决方案都不适用于所有情况,因为浏览器可以报告包含非数字字符的版本字符串,例如7.0b
【解决方案2】:

我完全同意Andrei's answer;这是你应该采取的方法。

但是,我认为重要的是要注意 有一种方法可以从 "23.0" 等字符串中解析 int 值:它可以使用 this overload of int.TryParse() 来完成,它允许您通过NumberStyles 标记为参数。

具体来说,执行这段代码后:

int v;

var wasParsedOK = Int32.TryParse(
    "23.0",
    NumberStyles.AllowDecimalPoint,
    CultureInfo.InvariantCulture, 
    out v);

v 将保留 23 的值,wasParsedOK 将是 true

【讨论】:

    【解决方案3】:

    您不能假设版本字符串是整数,甚至是十进制。浏览器可以完美地将7.0b 报告为其版本。 intfloatdecimalSystem.Version 都不能代表这一点。

    如果您只关心主要和次要版本号,则可以使用 Browser 对象的 MajorVersionMinorVersion 属性,假设它的类型为 HttpBrowserCapabilities。框架已经帮你解析好了,应该是靠谱的。

    【讨论】:

      【解决方案4】:

      因为 23.0 不是 int,所以给出 false,所以你可以尝试使用小数、双精度或浮点数。

      decimal v = 0;
      string version = "23.0";
      
      Decimal.TryParse(version, out v);
      

      【讨论】:

      • 使用小数是同样的问题,但解析 int 会截断数字,所以我认为 int 不是问题... thx
      【解决方案5】:

      已经快 2 年了,没有人正确回答这个问题。问题很简单,“为什么它返回 false?”

      这个问题已经回答了,只是因为你的字符串不是整数,而是双精度数或小数。按照设计,TryParse 将尝试从您的字符串中获取整数类型的精确匹配,否则它将返回 false,并且您的字符串 ("23.0") 不是精确匹配。

      现在,如果您正在尝试找到将版本字符串转换为数字的解决方案,您可以做的是过滤掉字符串中的非数字,不包括 1 个点 (.),然后将剩下的转换为十进制/双。在此转换之后,您可以尝试将其转换为整数。由于您已经将搅拌转换为双/十进制,因此您不能再使用 TryParse,因为参数需要采用字符串格式。然后,您可以在 Try 块中使用 Convert.ToInt32。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-15
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多