为什么在比较 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"
}
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。但即便如此:注意正确的文化来解析你的数字。
我不知道为什么,但我在比较两个值时得到 FormatException
。有人能告诉我我做错了什么吗?我已经尝试使两个值都浮动,但同样的异常...
float label1 = float.Parse(label15.Text);
int box1 = int.Parse(textBox23.Text);
if (label1 <= box1)
{
//Do things"
}
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。但即便如此:注意正确的文化来解析你的数字。