如何循环直到用户输入的变量是VB.NET中的整数?

时间:2014-04-24 18:08:40

标签: vb.net loops input integer console-application

这是我到目前为止的代码:

Module Module1

    Sub Main()
        Dim A, B, C, D As Integer
        Do
            Try
                System.Console.WriteLine("How high is the cube?")
                A = Int32.Parse(Console.ReadLine())
            Catch leg As System.FormatException
                System.Console.WriteLine(leg.Message)
            Finally
            End Try
        Loop Until A =
        System.Console.WriteLine("How wide is the cube?")
        B = Int32.Parse(Console.ReadLine())
        System.Console.WriteLine("How long is the cube?")
        C = Int32.Parse(Console.ReadLine())
        D = A * B * C
        Console.WriteLine(D)
        System.Console.ReadKey()
    End Sub

End Module

我希望第一个try块循环,直到A是一个Integer,以防用户输入一个字母而不是一个数字。有谁知道我怎么做?

4 个答案:

答案 0 :(得分:3)

使用TryParse代替try / catch块和do循环。它成功时返回True,并将int32值放入变量a

            Dim a As Integer, tmp As String

            Do
                System.Console.WriteLine("How high is the cube?")
                tmp = Console.ReadLine()
            Loop While Int32.TryParse(tmp, a) = False

循环后,a中存储的值将为整数。对每个其他值重复此操作。

你也可以像他在C#样本中做的那样做,而不是费心存储到临时变量中:

        Dim a As Integer

        Do
            System.Console.WriteLine("How high is the cube?")
        Loop While Int32.TryParse(Console.ReadLine(), a) = False

如果您必须使用Try / Catch进行作业,您可以尝试这一点,但出于实际目的,我会按上述方式进行。

        Dim a As Integer, valid As Boolean = True
        Do
            Try
                System.Console.WriteLine("How high is the cube?")
                a = Int32.Parse(Console.ReadLine())
            Catch ex As Exception
                valid = False
            End Try
        Loop While Not valid

答案 1 :(得分:0)

在C#中(转换为VB是读者的练习):

public static Int32 GetInt32() {

    Int32 value;
    while( !Int32.TryParse( Console.ReadLine(), out value ) ) {
        Console.WriteLine("Please enter an integer");
    }
    Console.WriteLine("You entered {0}", value);
    return value;
}

答案 2 :(得分:0)

这是一个真实世界的例子,进一步扩展了使用Try / Catch来控制程序流的一个原因。至少在.NET中,抛出错误并在catch中处理它比使用适当的控制流结构正确处理错误需要更多的执行时间。

我从同事那里拿起了一个项目,他正在使用一个函数来清理那些应该是数字的输入。他正在使用类似下面的代码来做这件事。

Public Shared Function SafeDouble(value As Object, Optional DefaultValue As Double = 0.0) As Double
    Dim CleanDouble As Double

    Try
        CleanDouble = CDbl(value) 'try to convert to a double
    Catch ex As Exception
        CleanDouble = DefaultValue 'if it fails use the default value
    End Try

    Return CleanDouble
End Function

对于他最初使用它来处理一行数据的地方,它工作得很好。当我开始使用它处理1000行数据时出现了问题。当执行导入的这一部分时,执行陷入困境。

使用一些计时器,我确定它无法转换的每个值需要50到100毫秒,并且会抛出异常。

我更改了代码以使用适当的控制结构,并且每个值无法转换的时间减少到2到5毫秒。目前的代码如下。我知道有些值可能不是数字的。如果它不是数字,我只是立即分配默认值。

Public Shared Function SafeDouble(value As Object, Optional DefaultValue As Double = 0.0) As Double
        Dim CleanDouble As Double

        Try
            If IsNumeric(value) Then 'test to see if the data is numeric before converting it
                CleanDouble = CDbl(value)
            Else
                CleanDouble = DefaultValue 'if it isn't numeric, use default value
            End If
        Catch ex As Exception
            CleanDouble = DefaultValue 'if something unexpected happens, use default value
        End Try

        Return CleanDouble
    End Function

正如您所看到的,我已经处理了它未转换的预期错误,因为它不是数字。这应该是可能发生的大多数问题的原因。我仍然将try / catch留在那里,以防发生其他意外错误。

答案 3 :(得分:0)

我还有一个要添加的概念。方法触发异常,让您处理不正常的问题并防止应用程序崩溃。 Readlin和writeline可以抛出异常,如果你没有捕获它们并且它们发生,你的程序将崩溃。使用try块来实现其意义:处理不太可能的崩溃以增强稳健性。要做好彻底的工作,你应该研究异常并编写代码以防止崩溃。