【问题标题】:Why am I getting a format exception in this C# code?为什么在此 C# 代码中出现格式异常?
【发布时间】:2014-07-15 07:18:09
【问题描述】:

我正在开发一个 Windows 窗体应用程序。我正在解析一个 XML 文件并进行一些查询。例如,在这种情况下,我试图找到体重在 55 到 100 之间的所有用户。出于某种原因,当我运行此代码时,我得到一个未处理的格式异常。为什么我收到格式异常。我已经指出了发生异常的断点。我认为问题是语法错误。 感谢您的帮助。

private bool UserWeighsBetween55and100(IEnumerable<XElement> paramsList) {
    bool result = false;
    foreach (XElement parameter in paramsList) {
        if (parameter.Attribute("name").Value == "Weight") {
  --->HERE     if ((Int32.Parse(parameter.Attribute("value").Value) > 55) &&
                   (Int32.Parse(parameter.Attribute("value").Value) < 100)){
                        return true;
                   }
               }
        }
        return result;
    }

【问题讨论】:

  • parameter.Attribute("value").Value 的确切类型是什么,它的价值是什么?你的CurrentCulture 是什么?
  • 为字符串,例如“110”
  • 如果问题是语法问题,那么程序将无法编译
  • Int32.Parse MSDN => FormatException: s 格式不正确。
  • @Ralphyabro 使用foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures)),没有任何文化抛出Int32.TryParse("110", culture) 异常

标签: c# xml winforms parsing exception-handling


【解决方案1】:

一次转换您的值,而不是两次转换相同的值。

尝试这样做。

int iValue = 0;
if (Int.TryParse(parameter.Attribute("value").Value, out iValue)) //If the value converted
{
    if (iValue > 55 && iValue < 100)
    {
        return true;
    }

}
else //Failed to convert value into int datatype
{
    //Code here if conversion faild
}

如果parameter.Attribute("value").Value 包含非数字值,则它不会转换为int 数据类型。

【讨论】:

  • 这不是重点。如果Int.Parse 抛出异常,Int.TryParse 也会在相同情况下返回false
  • 如果值没有被转换,至少你可以处理错误。正如我已经提到的,如果该值包含非数字值,那么它将失败。如何在 else 条件下处理该值。
【解决方案2】:

不要使用“Parse”方法,而是使用 tryParse。

在你的情况下,它看起来像:

foreach (XElement parameter in paramsList) {
    if (parameter.Attribute("name").Value == "Weight") {
    int value;
    if(!Int32.TryParse(parameter.Attribute("value").Value, out value)){
         //Not a number, handle this case
    }
    if ((value > 55) &&  (value < 100)){
        return true;
    }
    return result;
}

【讨论】:

  • 无论Int32.TryParse 返回true 还是false,您的第二个if 语句都有效。
  • 这就是为什么如果 TryParse 失败、继续、异常或他可能想做的任何事情,你应该处理这种情况。
【解决方案3】:

我将回答我的问题,因为我发现了我的错误,我希望它可以帮助每个阅读这篇文章的人。

使用Int32.Parse() 的问题在于,我在解析XML 文件时,没有注意double 类型的值。 此代码的修复如下:

private bool UserWeighsBetween55and100(IEnumerable<XElement> paramsList) {
        bool result = false;
        foreach (XElement parameter in paramsList) {
            if (parameter.Attribute("name").Value == "Weight") {
                if ((parameter.Attribute("value").Value)!=null) {
                    if ((Convert.ToDouble(parameter.Attribute("value").Value) > 55) && (Convert.ToDouble(parameter.Attribute("value").Value) < 100)) {
                    return true;
                    }
                }
            }
        }
        return result;
    }

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多