C#将字符串“0”解析为整数

时间:2009-03-27 19:35:20

标签: c#

我有一台新的笔记本电脑在工作,本周早些时候工作的代码今天不起作用。

以前工作的代码是简化的:

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");
编辑:感谢大家帮我解决这个问题!解决方案是强制重置我的语言设置。

8 个答案:

答案 0 :(得分:21)

可能的explanation

  

基本上,问题是   sPositiveSign值下   HKEY_CURRENT_USER \控制   Panel \ International设置为0,   这意味着正号为'0'。   因此,在解析“正号”时   0“正在切断然后其余部分   字符串(“”)被解析为a   数字,当然不起作用。   这也解释了为什么int.Parse(“00”)   不是问题。虽然你做不到   将正号设置为“0”   控制面板,它仍然是可能的   通过注册表来做,导致   问题。不知道电脑怎么样   帖子中的用户最终得到了   这个错误的设置......

更好的是,你机器上的输出是什么:

Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);

当我打印出0标志时,我愿意打赌你打印+ ...

我建议检查您的Control Panel > Regional and Language Options设置......如果它们显得正常,请尝试将其更改为其他内容而不是使用您正在使用的任何语言(我假设为英语)。

答案 1 :(得分:3)

我认为调用Convert.ToInt32来读取数据库中的值通常不是一个好主意,该值为null,该值无法解析。你在这里有任何异常处理代码。

  1. 确保该值不为空。
  2. 在调用Int32.Parse之前检查值是否可以解析。考虑Int32.TryParse。
  3. 考虑使用类似int的可空类型?在这种情况下。
  4. HTH。

答案 2 :(得分:2)

你确定它是“0”而不是“空”吗?您有什么例外?

编辑:

出于好奇,如果它真的出现在int.Parse(“0”)上,你可以尝试int.Parse(“0”,CultureInfo.InvariantCulture);?

否则,发布您的查询。任何加入?

答案 3 :(得分:2)

编辑:
@ Mike的回复让我觉得这是非常奇怪的行为,一个简单的谷歌搜索产生了这个结果:int.Parse weird behavior

空字符串也会导致此问题。

您可以在解析之前检查dbnull,也可以验证已解析的数据。

您可以使用默认值和TryParse ..

int i = -1;
if(!int.TryParse(dr["MyColumn"] as string, out i))
   //Uh Oh!

编辑:
我在@Chris的回答中将其作为注释发布,但是如果sql数据类型是int,那么为什么不在DataReater上使用GetInt32方法而不是将其作为字符串检索并手动解析出来?

答案 4 :(得分:1)

你应该检查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
    }
}

答案 5 :(得分:1)

我已经看到这个问题出现在.NET Double类中,也从字符串“0”解析。

这是一个非常古怪的部分:您可以通过使用不同的用户帐户来运行该程序,有时如果您在计算机上销毁并重新创建当前用户帐户,它运行良好。

我还没有追踪到这一点,但至少你可能会以这种方式过去。

答案 6 :(得分:1)

这是离开左侧的字段,但请检查您的本地化设置。当我将网站移动到加拿大服务器时,我有一些“输入字符串格式不正确”。问题出在DateTime.Parse方法中,并通过将文化设置为“en-US”来修复。

是的,你的情况有所不同 - 但是,嘿,你永远不会知道。

答案 7 :(得分:0)

你正在检查空吗?

if(!dr.IsNull("FieldName")){
   int i = Convert.ToInt32(dr["FieldName"]))
}