VB Выбрать регистр, если строка текстового поля, числовое текстовое поле elif (isnumeric не работает)

Я использую программу, которая должна обрабатывать ввод пользователя по-разному, в зависимости от числа или строки. Select Case и IsNumeric не работают должным образом.

Я получаю этот код, когда animal= char или string.

Ошибка:

Произошло необработанное исключение типа "System.InvalidCastException" в Microsoft.VisualBasic.dll

Дополнительная информация: Преобразование из строки "D" в тип "Long" недопустимо.

Код, который беспокоит:

Case "D" Or "d"

Весь код:

Option Explicit Off
Option Strict Off

Public Class MainForm

Public Sub ifButton_Click(sender As Object, e As EventArgs) Handles ifButton.Click

    animal = codeTextBox.Text
    Select Case IsNumeric(codeTextBox.Text)
        Case True
            Dim decanimal As Decimal
            decanimal = CDec(animal)
            Select Case decanimal
                Case "1"
                    msgLabel.Text = "Dog"
                Case "2"
                    msgLabel.Text = "Cat"
                Case Else
                    msgLabel.Text = "Bird"
            End Select
        Case False
            Dim stranimal As String
            stranimal = CStr(animal)
            Select Case stranimal
                Case "D" Or "d"
                    msgLabel.Text = "Dog"
                Case "C" Or "c"
                    msgLabel.Text = "Cat"
                Case Else
            End Select
    End Select

End Sub
End Class

3 ответа

Вы должны взглянуть на документацию для Select Case, которую вы не поставили, или вы поставили запятую.

Case "D", "d"

Или поместите сравниваемую строку в нижний регистр.

Select Case stranimal.ToLower()
    Case "d"
        msgLabel.Text = "Dog"
    Case "c"
        msgLabel.Text = "Cat"
    Case Else
End Select

decanimal - это десятичное число, не используйте строку в выражении case. Кроме того, включите эту опцию строго;)

Вы можете использовать возвращаемое значение Double.TryParse() чтобы увидеть, если данные являются числовыми. Вот исправленный код:-

Public Sub ifButton_Click(sender As Object, e As EventArgs) Handles ifButton.Click
    Dim animal As String = codeTextBox.Text
    Select Case Double.TryParse(animal, Nothing) 'See if it is convertible to Double (numeric) or not.
        Case True
            Select Case Double.Parse(animal)

                Case 1
                    msgLabel.Text = "Dog"
                Case 2
                    msgLabel.Text = "Cat"
                Case Else
                    msgLabel.Text = "Bird"
            End Select
        Case False
            Select Case animal.ToLower() 'To compare the strings without case-sensitivity
                Case "d"
                    msgLabel.Text = "Dog"
                Case "c"
                    msgLabel.Text = "Cat"
                Case Else
                    'You didn't mention anything but I guess it should be msgLabel.Text = "Bird"
            End Select
    End Select
End Sub

Альтернативный подход к кодированию...

    Dim cAnimals As New Collection
    cAnimals.Add("Dog", "d")
    cAnimals.Add("Dog", "1")
    cAnimals.Add("Cat", "c")
    cAnimals.Add("Cat", "2")

    Dim s As String = ""
    Do While True
        s = InputBox("code:").ToLower
        If s = "" Then Exit Do
        If cAnimals.Contains(s) Then
            MsgBox(cAnimals(s))
        Else
            MsgBox("Invalid code")
        End If
    Loop

Используйте некоторую структуру данных для хранения кодов для преобразования, здесь VB Collection, затем проверьте, есть ли код в данных или нет.

VB действительно не волнует, являются ли данные числовыми или нет. Это может кусать время от времени, но полезно в другое время. Option Strict победит, в большинстве случаев не нужно IMO. Зависит от важности приложения и локальной политики.

Другие вопросы по тегам