2
Dim mynumber as Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)

Console.WriteLine("Enter your number..") 'Ask to enter number
    Try
        mynumber = Console.ReadLine 'Read user input and store it
    Catch
        Console.WriteLine()
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
        Console.ResetColor()
        Console.ReadLine()
        Console.Clear()
        GoTo start
    End Try

好的,从上面的示例中可以看出,我设置了一个 Try/Catch 用于错误处理。我遇到了一个问题。是的 Try/Catch 代码阻止输入字母(字符串),但是当我输入十进制数字时,它仍然接受它。为什么?如何防止这种情况发生?十进制数不应该被接受,因为整数只接受整数!

谢谢。

4

3 回答 3

2

数值类型之间存在隐式转换,因此不会触发错误。有不同的方法可以知道确切的数字类型。我想这里最好的选择是以下代码行:

Dim mynumber0 As Double 'This is the variable as an integer, (Integers only allow WHOLE numbers)
Dim wasOK As Boolean = True
Console.WriteLine("Enter your number..") 'Ask to enter number
Try
    mynumber0 = Console.ReadLine 'Read user input and store it
    If (Convert.ToInt32(mynumber0) <> mynumber0) Then
        wasOK = False
    End If
Catch
    wasOK = False
End Try

Dim mynumber As Integer = mynumber0
If (Not wasOK) Then
    Console.WriteLine()
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
    Console.ResetColor()
    Console.ReadLine()
    Console.Clear()
    GoTo start
End If

更新

TryParse替代方案,正如 mafafu 所建议的那样

Dim mynumber As Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)
Console.WriteLine("Enter your number..") 'Ask to enter number
If (Not Integer.TryParse(Console.ReadLine, mynumber)) Then
    Console.WriteLine()
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
    Console.ResetColor()
    Console.ReadLine()
    Console.Clear()
    GoTo start
End If
于 2013-10-10T19:54:25.680 回答
2

如前所述,您可以使用 Integer.TryParse 检查是否可以将数字解析为 Integer。此外,您确实应该使用Option Strict On,这将帮助 Visual Studio 指出 VB.NET 代码中的问题。

我对答案的看法:

Option Strict On

Module Module1

    Sub Main()

        Dim myNumber As Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)
        Dim userInput As String
        Dim userInputValid As Boolean = False

        While Not userInputValid
            Console.Write("Enter your number.. ") 'Ask to enter number

            userInput = Console.ReadLine() 'Read user input and store it
            userInputValid = Integer.TryParse(userInput, myNumber)
            If Not userInputValid Then
                Console.ForegroundColor = ConsoleColor.Red
                Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
                Console.ResetColor()
                Console.ReadLine()
                Console.Clear()
            End If

        End While

        Console.WriteLine("I got the number " & myNumber.ToString())
        Console.ReadLine()

    End Sub

End Module

编辑:请参阅Option Strict Statement中的“为新项目设置 Option Strict 默认设置”部分。

于 2013-10-10T20:09:48.763 回答
1

使用 Option Strict Off,VB.NET 试图表现得像旧版本的 VB,在类型检查方面有相当松散的规则。字符串、浮点类型和整数类型在很大程度上可以互换使用,并且尝试将浮点值分配给整数类型会以某种方式对其进行舍入(我忘记了确切的细节)。虽然在少数非常罕见的情况下 Option Strict Off 可以用于除了让旧的 VB6 代码有机会工作之外的其他目的,但只有足够专业的人才能理解这种情况的复杂性,甚至应该考虑在所有情况下使用它任何新代码(即便如此,也仅限于可能有用的非常小的部分)。

顺便说一下,重要的是要注意,即使 VB.NET 也认为从浮点值到整数类型的转换是“成功的”,如果将浮点值四舍五入到最接近的整数会产生一个可表示的值在那种类型中,即使浮点值有一个非零小数部分在转换过程中被丢弃。我不喜欢这种设计(我认为如果想要Int32最接近给定的浮点值,应该使用这样的函数)但它就是这样。

于 2013-10-10T20:22:42.003 回答