为什么在比较int和float值时会出现Format Exception?

时间:2017-04-20 15:20:15

标签: c# parsing formatexception

我不知道为什么但是在比较两个值时我得到FormatException。有人能告诉我我做错了什么吗?我已经尝试使两个值都浮动,但同样的例外......

float label1 = float.Parse(label15.Text);
int box1 = int.Parse(textBox23.Text);

if (label1 <= box1)
{
    //Do things"
}

3 个答案:

答案 0 :(得分:2)

FormatException

  

参数格式为时抛出的异常   无效,或者复合格式字符串格式不正确。

错误是因为无论label15 / textBox23的值是多少,它都不是有效数字。

分别使用float.TryParseint.TryParse,因为它们不会抛出异常:

float label1;
if(label15.Text, out label1){
  // do something
}

int box1;
if(textBox23.Text, out box1){
   // do something
}

但是,您仍然需要确保label15 / textBox23是可解析的值,否则控件将不会进入if语句。

答案 1 :(得分:1)

你没有使用适当的异常处理就让自己陷入困境。

    float label1 = float.Parse(label15.Text);  //problem 1
    int box1 = int.Parse(label15.Text);  //problem 2

    if (label1 <= box1)  //problem 3
    {
    //Do things"
    }

问题1和2是您不能确保您的UI为您提供可以解析的值。这将抛出异常。问题3是因为你不知道你的解析是否成功,你不知道你是否可以进行比较。试试TryParse()

    float label1 = 0;

                int box1 = 0;

                if(float.TryParse(label15.Text, out label1)
                    &&  int.TryParse(label15.Text, out box1))
                {
                   if (label1 <= box1)
                   {
                   //Do things"
                   }
                }

TryParse()函数会将现有变量填充为out个参数,但会返回bool。如果解析失败,则返回false,并允许代码继续。通过使这些成功成为if条件,我们完全避免错误。

您也可以始终将代码包装在try-catch block中以确定任何异常的原因并生成输出,但您绝不希望这样做来管理您的逻辑流程。您可以使用它来解决此问题,以及我发布的可能解决方案。

答案 2 :(得分:1)

float.Parse方法可以采用第二个参数。

假设您正在根据您的个人资料寻找德语号码解析。

因此,如果您想解析德语数字格式,请确保该方法知道(因为根据美国标准,“2,5”不是浮点数...甚至没有开头)。

理论上,您的System.Globalization.CultureInfo.CurrentCulture应该已经是您所需要的。如果不是,您可以创建所需的文化:

这应该可以正常工作:

float f = float.Parse("2,5", new System.Globalization.CultureInfo("de-DE"))

请记住,尽管您尽了最大努力,但人们可能仍然只是在文本框中输入垃圾,因此您应该留意TryParse,如其他答案中所述。但即使在那里:注意正确的文化来解析你的数字。