[英]C# parse string “0” to integer
我有一台新的笔记本电脑正在工作,而本周早些时候可用的代码今天无法使用。
以前工作的代码已简化:
while (dr.Read())
{
int i = int.Parse(dr.GetString(1))
}
现在,当数据库值为0时,它将失败。有时,但不能可靠地,它将代替:
while (dr.Read())
{
int i = Convert.ToInt32(dr["FieldName"]))
}
我想念一些愚蠢的东西吗?
奇怪的是,ReSharper还出现了许多奇怪的错误,并带有与上述代码相同的错误消息:“输入字符串的格式不正确。” (在加载项目之前就开始。)
有任何想法吗? 有人有SP问题吗? 买机器时,我确实尝试确保所有SP都是最新的。
编辑:我知道如何使用Try.Parse和错误处理。 此处的代码已简化。 我正在从数据库表中读取测试用例。 该列只有0、1和2个值。 我已经确认了。 我将数据库字段放入字符串变量s中,然后尝试使用int.Parse(s)。 该代码在本周早些时候有效,数据库未更改。 唯一改变的是我的环境。
为了完全简化问题,此行代码引发异常(“输入字符串的格式不正确”):
int.Parse("0");
编辑:感谢大家帮助我解决了这个问题! 解决方案是强制重置我的语言设置。
可能的解释 :
基本上,问题在于HKEY_CURRENT_USER \\ Control Panel \\ International下的sPositiveSign值设置为0,这意味着正号为'0'。 因此,在解析“正号0”时,将其截断,然后将字符串的其余部分(“”)解析为数字,这当然是行不通的。 这也解释了为什么int.Parse(“ 00”)不是问题。 尽管无法通过“控制面板”将正号设置为“ 0”,但是仍然可以通过注册表进行设置,从而导致问题。 不知道帖子中用户的计算机是如何以这种错误的设置结束的...
更好的是,您的计算机上的输出是什么:
Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);
我敢打赌,当我的打印出一个+
号时,您的打印出0
...。
我建议您检查“ Control Panel > Regional and Language Options
设置...如果它们显示正常,请尝试将其更改为不同于您使用的任何语言的其他语言(我假设是英语)。
我认为调用Convert.ToInt32以从数据库中读取值通常不是一个好主意,该值是null,该值不能解析。 您在这里有任何异常处理代码吗?
HTH。
您确定它是“ 0”而不是“ null”吗? 你有什么例外?
编辑:
出于好奇,如果确实是int.Parse(“ 0”)的问题,您可以尝试int.Parse(“ 0”,CultureInfo.InvariantCulture);吗?
否则,发布您的查询。 有参加吗?
编辑:
@Mike的回应让我认为这是极其奇怪的行为,一个简单的Google搜索就产生了以下结果: int.Parse奇怪的行为
空字符串也将导致此问题。
您可以在解析之前检查dbnull,这也是验证解析数据的好方法。
您可以使用默认值和TryParse。
int i = -1;
if(!int.TryParse(dr["MyColumn"] as string, out i))
//Uh Oh!
编辑:
我在@Chris的答案中将其发布为注释,但是如果sql数据类型为int,为什么不直接在DataReater上使用GetInt32方法而不是将其作为字符串检索并手动解析呢?
您应该检查dr [“ FieldName”]!= DBNull.Value,并且如果它通过DBNull测试,则应该使用TryParse。
if ( dr["FieldName"] != DBNull.Value )
{
int val = 0;
if ( int.TryParse( dr["FieldName"], out val ) )
{
i = val;
}
else
{
i = 0; // or some default value
}
}
我已经看到.NET Double类也出现了此问题,它也从字符串“ 0”进行解析。
这是真正令人毛骨悚然的部分:您可以通过使用其他用户帐户运行程序来解决问题,并且有时,如果您在计算机上销毁并重新创建了当前用户帐户,它将可以正常运行。
我还没有找到答案,但是您至少可以这样解决。
这是离开左侧字段的方法,但是请检查您的本地化设置。 将网站移至加拿大服务器时,出现了许多“输入字符串格式不正确”的信息。 问题出在DateTime.Parse方法中,通过将区域性设置为“ en-US”得以解决。
是的,您的情况有所不同-但是,您永远不会知道。
您要检查null吗?
if(!dr.IsNull("FieldName")){
int i = Convert.ToInt32(dr["FieldName"]))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.