选择数字之间的大小写

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 Offexpressionlist(范围)将转换为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 接受这一点会阻止人们提出改进建议、解释某些事情不起作用的原因、提供文档并展示替代方法。

以上是关于选择数字之间的大小写的主要内容,如果未能解决你的问题,请参考以下文章

WPS的字体大小

375 Guess Number Higher or Lower II 猜数字大小 II

js字符串和数字之间的大小对比!

小写金额怎样生成大写

验证数字,大写字母,小写字母,特殊字符四选三组成的密码强度,且长度在8到30个数之间

CAD怎么调整标注线的间距?