Vb.net Integer.TryParse-更好的方法?

Vb.net Integer.TryParse-更好的方法?,vb.net,tryparse,Vb.net,Tryparse,我发现自己经常需要使用Integer.TryParse来测试值是否为整数。但是,当您使用TryParse时,必须向函数传递一个引用变量,因此我发现自己总是需要创建一个空整数来传递。通常它看起来像: Dim tempInt as Integer If Integer.TryParse(myInt, tempInt) Then 考虑到我想要的只是一个简单的对/错回答,我觉得这相当麻烦。有没有更好的办法?为什么没有一个重载函数,我可以通过它传递我想要测试的值并得到一个真/假响应?试试这段代码 Mod

我发现自己经常需要使用Integer.TryParse来测试值是否为整数。但是,当您使用TryParse时,必须向函数传递一个引用变量,因此我发现自己总是需要创建一个空整数来传递。通常它看起来像:

Dim tempInt as Integer
If Integer.TryParse(myInt, tempInt) Then
考虑到我想要的只是一个简单的对/错回答,我觉得这相当麻烦。有没有更好的办法?为什么没有一个重载函数,我可以通过它传递我想要测试的值并得到一个真/假响应?

试试这段代码

Module IntegerHelpers

  Function IsInteger(ByVal p1 as String) as Boolean
    Dim unused as Integer = 0
    return Integer.TryParse(p1,unused)
  End Function
End Module
很好的一点是,由于它被声明为模块级函数,因此可以在没有限定符的情况下使用它。示例用法

return IsInteger(mInt)

由于您使用的是VB.net,因此可以使用IsNumeric函数

If IsNumeric(myInt) Then
    'Do Suff here
End If

不需要声明整数

If Integer.TryParse(intToCheck, 0) Then


如果您具有.NET3.5功能,则可以为字符串创建扩展方法

Public Module MyExtensions

    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsInteger(ByVal value As String) As Boolean
        If String.IsNullOrEmpty(value) Then
            Return False
        Else
            Return Integer.TryParse(value, Nothing)
        End If
    End Function

End Module

很抱歉,我知道你有点忘乎所以了,但是你也可以将它添加到上面.NET3.5中的MyExtensions类中,除非你需要验证,否则别担心

<System.Runtime.CompilerServices.Extension()> _
Public Function ToInteger(ByVal value As String) As Integer
    If value.IsInteger() Then
        Return Integer.Parse(value)
    Else
        Return 0
    End If
End Function

如果不是有效的整数,它将返回0。

为什么不编写一个扩展方法来清理代码呢?我已经有一段时间没有编写VB.Net了,但这里有一个c#的例子:

表演。您可能希望使用CLR的v2重试上述测试。

一个变体是:

Int32.TryParse(input_string, Globalization.NumberStyles.Integer)


“Then”之后是什么?你不把它当作一个整数吗?如果不是,你为什么要关心它是不是一个整数?你可以写你自己的检查,以确保它只包含数字,并且不是太大。但这可能比库调用慢。您可以在TryParse的第二个参数中传递值0,无需声明。我不喜欢在“Then”之后执行任何操作,我只想检查以确保事情是整数。它让我内心感到温暖和模糊。谢谢,我不知道为什么我没有想到仅仅通过0或者什么都不通过。“那将解决问题。”汤姆,正如提问者所指出的。TryParse需要一个变量。我将其命名为unused,以表明它实际上不会被使用。我本可以通过0,但我想让它更清楚,它是一个未使用的引用。@Tom,这就是当您不使用编译器验证您的解决方案时得到的结果:(.FixedNice建议,应该发布一个vb.net版本,但它几乎相同,只是删除参数中的“this”,将扩展属性添加到方法,将其放入模块中(无需在模块中使用静态函数),并删除分号,将brak替换为end*。此外,他可能没有使用.Net 3.5,在我的版本中添加了“Nothing”和+1+1,C#注释与问题无关,因为它指定了vb.Net。祝贺你,Tom,你得到了一个非常好的简明答案,并将其变成了一篇500字的短文。:-)我真的会将其称为ToIntegerOrDefault()。ToInteger对我来说意味着它实际上是一个整数。另外,直接在ToInteger方法中执行integer.TryParse更有效。否则解析将发生两次。+1回答很好Tom。顺便说一句,ToInteger函数声明为“布尔”。您应该将其编辑为“作为整数”。您不需要VB,“VB运行时”是.NET framework的一部分,从C开始就可以正常工作。IsNumeric仅在.NET中提供旧版支持。TryParse是更好的选项。请小心使用IsNumeric,即使对于某些非整数值,它也会返回true。从MSDN页面如果表达式的数据类型是布尔型、字节型、十进制、双精度、整数型、长型、SByte型、短型、单精度、UInteger型、ULong型或UShort型,或包含这些数字类型之一的对象,则IsNumeric返回True。如果表达式是可以成功转换为数字的字符或字符串,则IsNumeric也返回True。“现在nullable有了很大的用途!如果框架库从一开始就被重新设计以利用泛型和nullable,那不是很好吗?的文档不包含这种重载
(String,NumberStyles)
,而是包含
(String,NumberStyles,IFormatProvider,Int32)
。它是文档中的第一个:TryParse(String,Int32),但用法不正确!从文档中可以看出:当此方法返回时,[result]包含与s中包含的数字等效的32位带符号整数值。您所指的方法(String,Int32)因此,字符串的解析值将存储在Int32参数中(因为
ByRef
关键字)!这就像说“解析整数,并将其存储在名为
Globalization.NumberStyles.integer
的变量中。”,这没有意义。好的,如果最后只需要
Boolean
值,那么我建议将
Globalization.NumberStyles.Integer
替换为
Nothing
,因为它没有任何效果。
<System.Runtime.CompilerServices.Extension()> _
Public Function ToInteger(ByVal value As String) As Integer
    If value.IsInteger() Then
        Return Integer.Parse(value)
    Else
        Return 0
    End If
End Function
value.ToInteger()
public static class MyIntExtensionClass
{
  public static bool IsInteger(this string value)
  {
    if(string.IsNullOrEmpty(value))
      return false;

    int dummy;
    return int.TryParse(value, dummy);
  }
}
public static class Util {

    public static Int32? ParseInt32(this string text) {
        Int32 result;
        if(!Int32.TryParse(text, out result))
            return null;
        return result;
    }

    public static bool IsParseInt32(this string text) {
        return text.ParseInt32() != null;
    }

}
Int32.TryParse(input_string, Globalization.NumberStyles.Integer)