选择数字之间的大小写
Posted
技术标签:
【中文标题】选择数字之间的大小写【英文标题】:Select Case between number 【发布时间】:2017-05-30 13:45:03 【问题描述】:我尝试选择数字之间的情况。每 150000 个 Textbox5 在单击按钮时更改的代码。
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 之间的任何数字时,我得到的是“+Extra-”而不是“+6-” 并尝试超过 1050006 我有“-”
【问题讨论】:
好的...我发现 Dim range As Integer range = TextBox5.Text 那么,尽管收到了 2 个同样正确的答案,但您仍要将字符串转换为整数? 开启 Option Strict 【参考方案1】:这很有趣。但在我试图找出原因之前,我为您提供了正确的方法:String
不是数字,将Option Strict
设置为On
并学习使用类型安全代码。不要让编译器猜测您要达到的目标。
你可以使用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"
,因此它们从左到右比较字母,因为"9"
比@987654334“更大” @这个条件永远不会成立,这就是为什么你永远不会进入最后一个Case
,而是进入Case Else
。
Documentation:
表达式列表中的表达式可以是任何数据类型,提供 它们可以隐式转换为 testexpression 的类型,并且 适当的比较运算符对它所使用的两种类型都有效 一起使用。
使用Option Strict Off
,expressionlist
(范围)将转换为testexpression
的类型,即String
(因为TextBox5.Text
)。
使用Option Strict On
,您会正确收到编译器错误,因为String
不是Integer
:
Option Strict On 不允许从 'Integer' 到 '字符串'
【讨论】:
很好的答案和解释,案例将评估视为字符串(正如您提到的比较)......我不知道我实际上见过多少次咬人...... @Codexer: 是的,documentation 提到了它:“它们可以隐式转换为 testexpression 的类型” 所以你首先指定的将是所有的目标类型案例。使用Option Strict Off
,编译器会尝试转换类型,因此整数将被转换为字符串,反之亦然。
你是对的,如前所述,一如既往;很好的答案!【参考方案2】:
我同意蒂姆·施梅尔特的观点。补充您应该使用的答案
Select Case CLng(TextBox5.Text)
请参阅https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/functions/type-conversion-functions 了解详细信息,并避免使用 TextBox5 之类的 id
【讨论】:
【参考方案3】:这是另一种方法,如果使用不支持“To”运算符的 ASP Classic,它也可以工作。此代码还显示了在第一个 Select/Case 中使用嵌套 Select/Case 结构:
CardName = Left(CardNumber, 4)
Select Case CardName
Case 1800
GetCardName = "JCB (Japanese Credit Bureau)"
Case 2014
GetCardName = "enRoute"
Case 2131
GetCardName = "JCB (Japanese Credit Bureau)"
Case 2149
GetCardName = "enRoute"
'Case 3000 To 3059:
Case (CardName => 3000 And CardName <= 3059)
GetCardName = "Diners Club"
'Case 3400 To 3499
Case (CardName => 3400 And CardName <= 3499)
GetCardName = "American Express"
'Case 3528 To 3589
Case (CardName => 3528 And CardName <= 3589)
GetCardName = "JCB (Japanese Credit Bureau)"
'Case 3600 To 3699
Case (CardName => 3600 And CardName <= 3699)
GetCardName = "Diners Club"
'Case 3700 To 3799
Case (CardName => 3700 And CardName <= 3799)
GetCardName = "American Express"
'Case 3800 To 3889
Case (CardName => 3800 And CardName <= 3889)
GetCardName = "Diners Club"
'Case 3890 To 3899
Case (CardName => 3890 And CardName <= 3899)
GetCardName = "carteBlanche"
'Case 4000 To 4999
Case (CardName => 4000 And CardName <= 4999)
GetCardName = "VISA"
'Case 5100 To 5599
Case (CardName => 5100 And CardName <= 5599)
GetCardName = "MasterCard"
Case 5610
GetCardName = "Australian BankCard"
Case 6011
GetCardName = "Discover"
Case Else
Select Case Left(CardNumber, 1)
Case 1 'Airline
GetCardName = "Other (Airline)"
Case 2 'Airline and other industry assignments
GetCardName = "Other (Airline and other idustries)"
Case 3 'Travel/Entertainment
GetCardName = "Other (Travel/Entertainment)"
Case 4 'Banking and financial
GetCardName = "Other (Banking/Financial)"
Case 5 'Banking and financial
GetCardName = "Other (Banking/Financial)"
Case 6 'Merchandising and banking
GetCardName = "Other (Merchandising/Banking)"
Case 7 'Petroleum
GetCardName = "Other (Gas Company)"
Case 8 'HealthCare/Telecommunications and other
GetCardName = "Other (HealthCare/Telecomm/Etc)"
Case 9 'National assignment
GetCardName = "Other [Card Carrier Unknown]"
Case 0 'ISO/TC 68 and other industry assignments
GetCardName = "Other [Card Carrier Unknown]"
End Select
End Select
【讨论】:
【参考方案4】: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
根据您的要求进行修改。
【讨论】:
@Mike 也许我应该换个说法。这不是一个优质答案,您无法或详细说明 OP 代码为何不起作用。为了支持您的答案,您应该澄清为什么代码不起作用,您的代码不起作用...... @Codexer - 我给了他解决方案,以及一个更优雅的解决方案,恕我直言。如果他使用的是我的解决方案,那么我的答案应该是被接受的解决方案。此类行为会阻碍人们回答问题。 优雅,这怎么优雅?如果没有解释,OP 应该如何理解他们的问题? 没有理解就无法解决问题... @Mike 我没有投反对票,因为我不会费心去侮辱伤害,但是看看蒂姆的回答。它涉及很多细节,并提供了一个很好的解决方案。这就是 Codexer 的目标。代码转储往往没有那么有用,并且经常被否决即使如果它们解决了问题。 FWIW 的投票实际上比公认的答案更好。 Upvotes 计入标签分数,从长远来看,这会带来更好的好处。 @Mike:imo 接受这一点会阻止人们提出改进建议、解释某些事情不起作用的原因、提供文档并展示替代方法。以上是关于选择数字之间的大小写的主要内容,如果未能解决你的问题,请参考以下文章
375 Guess Number Higher or Lower II 猜数字大小 II