Select Number between number

问题描述:

我尝试选择数字之间的情况。每个150000代码Textbox5在点击按钮上进行更改。Select Number between number

Select Case TextBox5.Text 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
End Select 

当我试图900006之间的任意数字到1050006我有 “+预算外” 而不是 “+ 6-” ,并尝试在1050006我有 “ - ”

+0

好的...我发现昏暗的范围作为整数范围= TextBox5.Text – Jamyz

+0

因此,尽管收到2个同样正确的答案,你仍然要投入一个字符串整数? – Mike

+4

打开选项严格 – Plutonix

Dim i as Long 
If Long.TryParse(TextBox5.Text, i) 
    Select Case i 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
    End Select 
Else 
    TextBox6.Text = "Not a Number" 
End If 

修改您要求。

+0

感谢....工作正常! – Jamyz

+2

@Mike也许我应该改口。这不是一个***质量的答案***,你没有解释**或**的细节,为什么OP代码不工作。为了备份你的答案,你应该澄清***为什么***代码不工作,你的不... – Codexer

+0

@Codexer - 我给了他的解决方案,和一个更加优雅的解决方案,恕我直言。如果这是我正在使用的解决方案,那么我的答案应该是被接受为解决方案的答案。这样的行为阻碍了人们回答问题。 – Mike

我与蒂姆Schmelter同意。补充其答案应该使用

Select Case CLng(TextBox5.Text) 

详见https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/functions/type-conversion-functions和,而你在它避免像TextBox5

IDS这很有趣。但在我试图找出它造成什么之前,我为您提供了正确的方法:String不是数字,请设置Option StrictOn并学习使用类型安全代码。不要让编译器猜测你想要达到的目标。

您可以使用Int32.TryParse

Dim number As Int32 
If Not Int32.TryParse(TextBox5.Text, number) Then 
    MessageBox.Show("Please enter a valid integer") 
    Return 
End If 

Select Case number ' now integer is the target type 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
End Select 

这将工作与Option Strict On也编译。

现在为什么你的代码不起作用。如果将最后一个范围更改为Case 900006 To 999999,它将按预期工作。这必须如何比较字符串。即使这个编译(严格关)Case将把范围900006 To 1050006作为字符串,如"900006" To "1050006",所以他们比较字母从左到右的信件,sinvce "9"是“大于”"1"这种情况从来不是真的,这就是为什么你永远不要进入最后的Case,而是进入Case Else

Documentation

在与expressionlist的表达可以是任何数据类型,提供 它们隐式转换为testexpression与的类型和 适当的比较运算符是有效的两种类型是与 一起使用。

随着Option Strict Offexpressionlist(的范围)被转换成是String(因为TextBox5.Text)的testexpression类型。 随着Option Strict On你正确地得到一个编译器错误,因为String不是Integer

选项严格On不允许从“整数”隐式转换为 “串”

+0

很好的答案和解释,案件被视为字符串评估(正如你提到的比较)...我不知道有多少次我真的看到这个咬人... – Codexer

+0

@Codexer :是的,[文档](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement)提到它:_“它们可以隐式转换为testexpression的类型“_因此,您首先指定的是所有情况下的目标类型。使用'Option Strict Off',编译器会尝试转换类型**,所以整数将被转换为字符串,反之亦然**。 –

+0

你是对的,正如前面提到的一如既往;很好的回答! – Codexer