36

I find myself often needing to use Integer.TryParse to test if a value is an integer. However, when you use TryParse, you have to pass a reference variable to the function, so I find myself always needing to create a blank integer to pass in. Usually it looks something like:

Dim tempInt as Integer
If Integer.TryParse(myInt, tempInt) Then

I find this to be quite cumbersome considering that all I want is a simple True / False response. Is there a better way to approach this? Why isn't there an overloaded function where I can just pass the value I want to test and get a true / false response?

4
  • 1
    what comes after the "Then" ? Don't you do something with it as an integer? If not, why do you care if it's an integer or not? Commented Jan 7, 2009 at 2:52
  • You could write your own which checked to ensure it only held digits and wasn't too big. But that's likely to be slower than a library call. Commented Jan 7, 2009 at 2:55
  • 7
    you can pass the value 0 in the second parameter of the TryParse, you don't need to declare it. Commented Jan 7, 2009 at 3:02
  • I don't like to do anything after the "Then" I just like to check to make sure things are integer. It makes me feel warm and fuzzy inside. Thanks, I don't know why I didn't think of simply passing 0 or nothing. That will solve the problem. Commented Jan 7, 2009 at 4:35

7 Answers 7

94

No need to declare the integer.

If Integer.TryParse(intToCheck, 0) Then

or

If Integer.TryParse(intToCheck, Nothing) Then

If you have .Net 3.5 ability you can create an extension method for strings.

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

And then call like:

If value.IsInteger() Then

Sorry, getting carried away I know, but also you can add this to the MyExtensions class above in .Net 3.5 and not worry unless you need validations.

<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

Then simply use

value.ToInteger()

This will return 0 if it isn't a valid Integer.

Sign up to request clarification or add additional context in comments.

8 Comments

added in my version with 'Nothing', and +1
+1, the C# comment is irrelevant to the question since it specifies vb.net.
Congrats, Tom, you've taken a perfectly good concise answer and turned it into a mushy 500-word essay. :-)
I would really call it ToIntegerOrDefault(). ToInteger implies to me that it is in fact an integer. Also, it's more efficient to do Integer.TryParse directly in the ToInteger method. Otherwise the Parse will happen twice.
+1 Nice answer Tom. By the way, the ToInteger function is declared "As Boolean". You should edit that to say "As Integer".
|
10

Since you are using VB.net you can use the IsNumeric Function

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

3 Comments

You don't need VB, the "VB runtime" is part of the .NET framework and works just fine from C#
IsNumeric is only still in .NET for legacy support. TryParse is the better option.
Be careful with IsNumeric, it will return true even for some non Integer values. From the MSDN page "IsNumeric returns True if the data type of Expression is Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong, or UShort, or an Object that contains one of those numeric types. It also returns True if Expression is a Char or String that can be successfully converted to a number."
5
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;
    }

}

2 Comments

Now there's a great use for the nullable!
Wouldn't it be nice if the Framework libraries were reworked from the ground up to take advantage of generics and nullables?
3

Try this code.

Module IntegerHelpers

  Function IsInteger(ByVal p1 as String) as Boolean
    Dim unused as Integer = 0
    return Integer.TryParse(p1,unused)
  End Function
End Module

The nice part is that since it's declared as a Module level function it can be used without a qualifier. Example Usage

return IsInteger(mInt)

2 Comments

@Tom, As the questioner pointed out. TryParse requires a variable. I named it unused to indicate that it will in fact not be used. I could have passed 0 but I wanted it to be clearer it was an unused reference.
@Tom, that's what you get when you don't use a compiler to verify your solution :(. Fixed
1

Why not write an extension method to clean up your code? I haven't written VB.Net for a while, but here is an example in c#:

public static class MyIntExtensionClass
{
  public static bool IsInteger(this string value)
  {
    if(string.IsNullOrEmpty(value))
      return false;

    int dummy;
    return int.TryParse(value, dummy);
  }
}

2 Comments

Nice suggestion, should post a vb.net version though, its almost identical except remove the "this" in the param, add the Extension attribute to the method, put it in a module (no need to static functions in a module), and remove the semi-colon and replace brak with end *.
Also, he may not be using .Net 3.5
0

J Ambrose Little performed timing tests for IsNumeric checks back in 2003. You may wish to retry the mentioned tests with v2 of the CLR.

Comments

0

A variation would be:

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

4 Comments

The docs for Int32.TryParse does not contain this overload (String, NumberStyles) but instead has (String, NumberStyles, IFormatProvider, Int32).
it's the first one in the documentation: TryParse(String, Int32)
But the usage is incorrect! From the docs: When this method returns, [result] contains the 32-bit signed integer value equivalent of the number contained in s. The method which you're referring to (String, Int32) is such that, the parsed value of the String will be STORED IN THE Int32 PARAMETER (because of the ByRef keyword)! So it's like saying that "parse the integer, and store it in this variable called Globalization.NumberStyles.Integer", which does not make sense.
OK, if all you need at the end is the Boolean value, then I'd suggest replacing Globalization.NumberStyles.Integer with Nothing because it has no effect anyway.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.