# 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
###### 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.

Commented:
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.

Chief 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
``````
0
Commented:
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
``````
0
Author 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
Commented:
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
Author Commented:
Thanks for the help.
0
High 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
Chief 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
Commented:
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
Chief 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
Commented:
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.