Check for Integer or Decimal value

Good Day

Experts:

Currently I have the following code for checking if a value is an Integer in one of my programs.  This works great.  However, I need to integrate the ability to validate for a decimal value as well.  If decimal
then it should be valid as well.  How can I adjust this code to check for both?

Thanks,
jimbo99999

Dim chkForInt As Integer
Try
     chkForInt = Integer.Parse(Matrix.Columns.Item("NumEntry").Cells.Item(i).Specific.Value())
Catch
      g_B1Connection.Application.MessageBox("Value entered is not an Integer: " & (Matrix.Columns.Item("NumEntry").Cells.Item(i).Specific.Value()), 1, "OK")
      ErrFlag = "1"
      Exit Sub
End Try
Jimbo99999Asked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

SStoryCommented:
Trapping an error is not a good way to check for an integer. This is expensive.
IsNumeric(somevar)
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Kevin CrossChief Technology OfficerCommented:
SStory showed how to check if IsNumeric, so once you are in that block of code where you know the value is numeric then you can use this to test if you have a whole number of decimal.

Something like this may work:
If Math.Round(Double.Parse("2.5"), 0) <> Double.Parse("2.5") Then
            'Decimal
        Else
            'Integer
        End If

Open in new window

0
HooKooDooKuCommented:
IMHO, it is poor programming practice to use exceptions to accomplish a task.  In other words, exceptions are just that, exceptions.  They shouldn't ever be the expected execution path.

So I personally would have written a subroutine that either utilizes some of the various 'Is' functions (IsDate, IsNumeric, etc) or converted the value to a string and simply iterate through the string looking for non-numeric characters (for integers) or non-numeric characters save a single decimal point.

While I don't have anything handy to check for decimal v. non-decimal, I'll provide the following subroutine I've used in VB6 to take a string and strip out everything that didn't belong in a floating point number.  Obviously not what you were looking for, but if you do want to write your own routine, you could utilize some of these concepts
'Given a String, remove everything from the string that could not be interpreted as a floating point number
' 12.3ABC45.6 => 12.3456
Public Function StripToFloat$(Data As String)
Dim Ch As String * 1
Dim DecimalPoint As Boolean   'Has a Decimal Point Been Found
Dim NegativeSign As Boolean   'Has a Negative Sign Been Found
Dim I As Integer
 
'Allow a Leading or Trailing '-' to indicate a negative Number
'but only if the sign abuts the first or last number in the string...
' '-10' or '10-' would be negative
' neither '- 10' nor '10 -' would be negative
' neither '10-10' nor '10 - 10' nor '10- 10' nor '10 -10' would be negative
 
'Save the FIRST Period found in the string as a Decimal Point
 
    DecimalPoint = False
    NegativeSign = False
    
    For I = 1 To Len(Data)
        Ch = Mid$(Data, I, 1)
        If "0" <= Ch And Ch <= "9" Then
            StripToFloat$ = StripToFloat$ & Ch
        
        ElseIf Ch = "." Then
            If Not DecimalPoint Then
                StripToFloat$ = StripToFloat$ & Ch
            End If
        
        'NOTE: Any Logic Change to interpretation of Negative Sign should also be done in StripToInt
        ElseIf Ch = "-" Then        '07/09/97 Addition of Negative Signs
            If Not NegativeSign Then    'Can only Find one negative sign
                If Len(StripToFloat$) = 0 Then     'If NO numerics have been found AND...
                    Ch = Mid$(Data, I + 1, 1)       'If next char is a numeric then
                    If "0" <= Ch And Ch <= "9" Then '   this is a negative sign
                        NegativeSign = True
                    End If
                Else    'Length is > 0
                    If Len(StripToFloat$(Mid$(Data, I + 1))) = 0 Then 'If no additional numerics to the right AND...
                        Ch = Mid$(Data, I - 1, 1)                       'If previous char is a numeric then
                        If "0" <= Ch And Ch <= "9" Then                 '   this is a negative sign
                            NegativeSign = True
                        End If
                    End If
                End If
            End If
        End If
    Next I
    
    If NegativeSign Then
        StripToFloat$ = "-" & StripToFloat$
    End If
    
End Function

Open in new window

0
Introduction to Web Design

Develop a strong foundation and understanding of web design by learning HTML, CSS, and additional tools to help you develop your own website.

Jimbo99999Author Commented:
mwvisa1 I am not sure I understand what you mean ---> ...to test if you have a whole number of decimal

what is the Double.Parse("2.5") code doing ?

thanks for your help,
jimbo99999
0
SStoryCommented:
I agree that it is a poor practice to use exceptions to handle things...unless there is no other way.

In Dotnet to see if it is a decimal or not  you could do

if IsNumeric(myvar) then
    if myvar.tostring.indexof(".")=-1 then
        'it is an integer--no "." was found
    else
        'it has a decimal place
    end if
else
   'not a number
end if
0
Jimbo99999Author Commented:
Thanks for the help.
0
Mike TomlinsonHigh School Computer Science, Computer Applications, and Mathematics TeachersCommented:
Hi Jimbo99999,

I believe you are using VB.Net 2005 right?

Use the Integer.TryParse() and Decimal.TryParse() methods:
http://msdn.microsoft.com/en-us/library/f02979c7(VS.80).aspx
http://msdn.microsoft.com/en-us/library/9zbda557(VS.80).aspx

An example:

        Dim value As String = Matrix.Columns.Item("NumEntry").Cells.Item(i).Specific.Value()
        Dim intValue As Integer
        Dim decValue As Decimal

        If Integer.TryParse(value, intValue) OrElse Decimal.TryParse(value, decValue) Then
            ' ...It was a VALID Integer or Decimal...
        Else
            g_B1Connection.Application.MessageBox("Value entered is not an Integer or Decimal: " & value, 1, "OK")
            ErrFlag = "1"
        End If


0
Kevin CrossChief Technology OfficerCommented:
If you test for index of ".", IMHO, is not appropriately telling you if you have a decimal value or an Integer as you can end up with 25.0 which is an Integer value from my interpretation and 25.1 is a decimal.  

If you are looking for whether the value is written with decimal points I would agree.

Therefore, to answer your question Jimbo99999, I was doing this:

Double.Parse("2.5")
+"2.5" represents your variable coming in as string with a value that has numeric value
+I would usually recommend Double.TryParse here, but since SStory's suggestion already go you in a true portion of an IF statement that validated IsNumeric then Double.Parse was used to convert the string to actual number value, specifically a Double which allows decimals.  This could have been Decimal.Parse.

Math.Round(Double.Parse("2.5"), 0)
+Following same logic as above, the inner portion of code gets you numeric value of your variable.
+Rounding to zero decimal places gets you whole number (Integer).  Another method would be say Math.Floor.

Then by comparing the two you will know if you have a decimal versus an Integer written with a .0 after it.

i.e.

25 = 25.0
25 <> 25.4
26 <> 25.8

Hope that makes sense.
0
SStoryCommented:
mwvisa1, It is true that 25.0 would fail.  In the previous VB rounding never seemed to work like I would think.  I was concerned about rounding errors.  I guess if the new Round works better then it might be OK.
0
Kevin CrossChief Technology OfficerCommented:
I didn't see Idle_Mind's post until after I posted -- that is what I use more than trusting round, but it does work better in .NET.
0
SStoryCommented:
Yes, his way does seem best.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.