1

在我的代码中,我尝试获取浏览器版本来收取良好的 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"
4

5 回答 5

3

这是设计使然。

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

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

于 2013-08-30T15:27:11.620 回答
2

您不能假设版本字符串将是整数,甚至是十进制。浏览器可以完美地报告7.0b其版本。int、或float中的任何一个都不能代表这一点。decimalSystem.Version

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

于 2013-08-30T15:34:56.917 回答
2

我完全同意安德烈的回答;这就是你应该采取的方法。

但是,我认为重要的是要注意有一种方法可以解析int字符串中的值,例如"23.0":可以使用此重载int.TryParse()来完成,它允许您将NumberStyles标志作为参数传递。

具体来说,执行此代码后:

int v;

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

v将保持该值23并将wasParsedOKtrue.

于 2013-08-30T15:33:15.867 回答
1

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

decimal v = 0;
string version = "23.0";

Decimal.TryParse(version, out v);
于 2013-08-30T15:24:45.367 回答
1

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

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

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

于 2015-07-30T00:28:04.943 回答