在web post之后,Int32.ParseInt抛出FormatException

时间:2012-05-02 09:00:37

标签: asp.net-mvc asp.net-mvc-3 text-parsing

更新

我发现了问题,异常来自同一表格上的第二个字段,确实应该提示它(因为它是空的)......我正在看一个错误我以为来自试图解析一个字符串,实际上它是试图解析另一个字符串...抱歉浪费你的时间。

原始问题

我完全被这个问题吓到了。我基本上正在运行int.Parse("32")并且它会抛出FormatException。这是有问题的代码:

private double BindGeo(string value)
{
    Regex r = new Regex(@"\D*(?<deg>\d+)\D*(?<min>\d+)\D*(?<sec>\d+(\.\d*))");
    Regex d = new Regex(@"(?<dir>[NSEW])");
    var numbers = r.Match(value);
    string degStr = numbers.Groups["deg"].ToString();
    string minStr = numbers.Groups["min"].ToString();
    string secStr = numbers.Groups["sec"].ToString();
    Debug.Assert(degStr == "32");
    var deg = int.Parse(degStr);
    var min = int.Parse(minStr);
    var sec = double.Parse(secStr);
    var direction = d.Match(value).Groups["dir"].ToString();
    var result = deg + (min / 60.0) + (sec / 3600.0);
    if (direction == "S" || direction == "W") result = -result;
    return result;
}

我的输入字符串是"32 19 17.25 N"

上面的代码在ASP.NET MVC 3 Web应用程序(以Razor作为其视图引擎)上的.NET 4 Web托管服务(aspspider)上运行。

注意degStr == "32"的声明是有效的!此外,当我采取上述代码并在控制台应用程序中运行它,它工作得很好。我已经在网上搜索了一个答案,没什么......

有什么想法吗?

更新(堆栈跟踪)

[FormatException: Input string was not in a correct format.]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +9586043
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +119
   System.Int32.Parse(String s) +23
   ParkIt.GeoModelBinder.BindGeo(String value) in C:\MyProjects\ParkIt\ParkIt\GeoBinder.cs:42

第42行是var deg = int.Parse(degStr);,请注意该异常位于System.Int32.Parse中(不在System.Double中)。

4 个答案:

答案 0 :(得分:3)

您错误地认为以下行是抛出异常:

int.Parse("32")

此行不太可能抛出异常。

实际上它是以下一行:

var sec = double.Parse(secStr);

在这种情况下secStr = "17.25";

原因是您的托管服务提供商使用的不同文化中.不是小数点分隔符。

您可以在web.config文件中指定文化:

<globalization culture="en-US" uiCulture="en-US" />

如果您不这样做,则使用auto。这意味着可以根据客户端浏览器首选项设置文化(使用Accept-Language HTTP标头随每个请求一起发送)。

另一种可能性是在解析时指定文化:

var sec = double.Parse(secStr, CultureInfo.InvariantCulture);

这样您就可以确定.是不变文化的小数分隔符。

答案 1 :(得分:2)

测试(通过PowerShell):

PS [64] E:\dev #43> '32 19 17.25 N' -match "\D*(?\d+)\D*(?\d+)\D*(?\d+(\.\d*))"
True
PS [64] E:\dev #44> $Matches

Name                           Value
----                           -----
sec                            17.25
deg                            32
min                            19
1                              .25
0                              32 19 17.25

所以正则表达式正在处理获取值的所有三个命名捕获,所有这些都将解析好(即,它不像{+ 1}}匹配像U + 0660:ARABIC-INDIC DIGIT ZERO那样的东西\d无法处理。)

但是 您没有检查正则表达式是否实际匹配。

因此我怀疑传递给函数的Int32.Parse不是您期望的输入。在函数的开头放置一个断点(或记录)并获得value的实际值。

我认为发生的事情是:

  • value不是您认为的那样。
  • 正则表达式无法匹配。
  • 捕获是空的
  • Value正在抛出(刚刚确认:它抛出一个FormatException“输入字符串的格式不正确。”)

Adendum :刚刚注意到你对断言发表评论。

如果事情看似矛盾,请回到基础:至少有一个假设是错误的,例如。在异常的行号中可能有一个off(在转到该行号之前对文件进行编辑:非常容易)。

在这种情况下,使用调试器逐步完成是迄今为止最简单的方法。在每个表达式上检查所有内容

如果您不能使用调试器,那么尝试删除该限制,如果不是IntelliTrace怎么样? Othewrwise使用某种日志记录(如果你的应用程序没有它,请添加它,因为将来你需要它来做这样的事情。)

答案 2 :(得分:1)

尝试从字符串中删除非unicode(如果有的话 - 不可见的)字符:

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty);

修改

也 - 尝试查看其十六进制值以查看它的作用除外:

BitConverter.ToString(buffer);

这将显示十六进制值,以便您验证...

还粘贴其值,以便我们可以看到它。

答案 3 :(得分:0)

事实证明这不是问题。问题是异常来自同一个表单上的第二个字段,它确实应该提示它(因为它是空的)...我正在查看一个错误,我认为它来自于尝试解析一个字符串,实际上它是试图解析另一个字符串......

抱歉浪费你的时间。