有没有更好的方法来测试字符串是否可以转换为除以下内容之外的整数?
Public Function IsInt(ByVal value As Object) As Boolean
Try
Dim temp As Integer = CInt(value)
Return True
Catch ex As Exception
Return False
End Try
End Function
by“better”我的意思是更简洁和/或没有异常。
TryParse将是可行的方法,但我使用的是紧凑的框架2.0,并且似乎没有实现tryparse ....
非常感谢。
似乎MarkJ是正确的,以上似乎在功能上与IsNumeric相同,所以我想这是我的答案。我不知道为什么我认为CInt比IsNumeric更严格。我想最好使用CInt和IsNumeric进行测试,因为那是我用来进行转换的功能吗?
答案 0 :(得分:13)
您可以使用内置的IsNumeric功能
Dim CanConvert as Boolean = IsNumeric(value)
http://msdn.microsoft.com/en-us/library/6cd3f6w1(VS.71).aspx
答案 1 :(得分:6)
自Compact Framework上的TryParse isn't supported以来,正则表达式是您的下一个最佳选择。
第一个例子不允许小数。第二个是。
Regex.IsMatch(value, "^-?\d+$")
Regex.IsMatch(value, "^-?\d+(?:\.\d+)?$")
如果你需要允许科学记数法,你需要再调整一下。它真的不是那么糟糕。你有一个字符串^
的开头,一个可选的短划线-?
,一个或多个数字\d+
,一个寻找单个小数的非捕获组(?:)
点\.
和一个或多个数字\d+
。另一个?
允许非捕获组的零个或一个实例,然后是字符串$
的结尾。
修改强>
我之前没有考虑过的一件事:这个方法有点不精确,因为你可以得到一个非常庞大的数字,它在数字上是一个有效的整数,但不能转换为Int32。如果这是可能的话,你可以限制字符数。例如,您可以\d+
代替\d{1,8}
。
答案 2 :(得分:5)
你可以使用Integer.TryParse
,这将返回一个bool,表明转换是否成功
答案 3 :(得分:4)
Public Function IsInt(ByVal value As Object) As Boolean
Dim i As Integer
Return Integer.TryParse(Convert.ToString(value), i)
End Function
答案 4 :(得分:3)
如果你想避免使用异常,你可以将它与正则表达式匹配,该正则表达式在转换之前只允许数字字符。
答案 5 :(得分:2)
如果你不经常进行转换,你所拥有的就好了(假设没有TryParse()
可用) - 这不会影响性能。
如果您要执行数百万次转换,并且其中大量转换可能会失败,那么您捕获的异常可能是一个性能问题(可能)。
如果你不能使用TryParse()可能最好的事情(perf-wise)就是简单地检查字符串中的每个字符,如果它不是数字返回false。不要忘记考虑可能的负号和组分隔符(如果你想支持它们)。
否则,将字符串解析为int,这将在99%的情况下成功。如果它不合适,你只会得到一个例外。如果你真的想避免Parse()可能产生的异常,那么自己实际解析数字并不难,如果超出范围则返回失败。
Jon Skeet在框架包含TryParse()
之前对此进行了快速分析:
答案 6 :(得分:1)
Dim s as String = "23"
Dim i as Integer
If Int32.TryParse(s, i) Then
' String was a valid integer... '
End If
答案 7 :(得分:1)
使用整数类型的TryParse共享方法。
例如:
Private Function CanStringBeCastAsInteger(ByVal myString As String) As Boolean
Dim myInt As Integer = 0
Return Integer.TryParse(myString, myInt)
End Function
使用TryParse方法的好处是它可以避免在转换失败时抛出并随后捕获异常。投掷和捕获异常是一项昂贵的操作。
TryParse方法不仅返回True / False结果,告诉您转换是否成功,它还将在我的示例中的myInt参数中返回为您生成的转换,所有这些都在一行中代码。
答案 8 :(得分:1)
这里有一些非常类似于你已经使用的东西但使用Convert类而不是CType并且不使用TryParse
Public Function IsInt(ByVal value As Object) As Boolean
Try
Convert.ToInt32(value)
Return True
Catch ex As System.FormatException
Return False
End Try
End Function
答案 9 :(得分:0)
你需要推出自己的正则表达式e.x。:Regex.IsMatch(“4354354”,“\ d +”),并且仍然包含try / catch块作为备份。
答案 10 :(得分:-1)
执行以下操作
If myString <> "" And IsNumeric(myString) = True Then
If CDbl(myString) - Int(CDbl(myString)) > 0 Then
.... myString is integer
End If
End If