为什么在比较 int 和 float 值时会出现格式异常?

Why do I get a Format Exception when comparing int and float values?

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

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

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

FormatException

The exception that is thrown when the format of an argument is invalid, or when a composite format string is not well formed.

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

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

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

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

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

您没有使用正确的异常处理就把自己困在了角落里。

    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 参数,但 returns 是 bool。如果解析失败,此 returns 与 false 相同,并允许代码继续。通过使这些成功成为 if 条件,我们完全避免了错误。

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

float.Parse方法可以接受第二个参数。

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

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

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

这应该可以正常工作:

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

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