更新
我发现了问题,异常来自同一表格上的第二个字段,确实应该提示它(因为它是空的)......我正在看一个错误我以为来自试图解析一个字符串,实际上它是试图解析另一个字符串...抱歉浪费你的时间。
原始问题
我完全被这个问题吓到了。我基本上正在运行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
中)。
答案 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)
事实证明这不是问题。问题是异常来自同一个表单上的第二个字段,它确实应该提示它(因为它是空的)...我正在查看一个错误,我认为它来自于尝试解析一个字符串,实际上它是试图解析另一个字符串......
抱歉浪费你的时间。