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代码阻止输入字母(字符串),但是当我输入十进制数字时,它仍然接受它。为什么?如何防止这种情况?不接受十进制数,因为整数只接受整数!
感谢。
答案 0 :(得分: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
答案 1 :(得分:2)
如前所述,您可以使用Integer.TryParse来检查是否可以将数字解析为整数。此外,您确实应该使用 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上的“为新项目设置选项严格默认设置”部分。
答案 2 :(得分:1)
使用Option Strict Off,VB.NET尝试表现得像旧的VB版本,它在类型检查方面有相当松散的规则。字符串,浮点类型和整数类型可以在很大程度上互换使用,并且尝试将浮点值分配给整数类型会以某种方式对其进行舍入(我忘记了确切的细节)。虽然有一些非常罕见的情况,Option Strict Off可以用于除了给旧的VB6代码提供工作机会以外的其他目的,但只有那些足够专业才能理解这些案例的复杂性的人甚至应该考虑使用它任何新的代码(甚至只有那些可能有用的非常小的代码)。
顺便说一下,重要的是要注意,即使VB.NET将浮点值转换为整数类型,如果将浮点值舍入为最接近的整数,也会产生一个值即使浮点值具有在转换期间掉落的非零小数部分,也可以在该类型中表示。我不喜欢那个设计(我想如果有人希望Int32
离一个给定的浮点值最近,那么应该使用一个函数来表示那个)但是它就是这样的。