XPost: comp.programming   
   From: tac@tac.co.uk   
      
   "Rick Rothstein [MVP - Visual Basic]"    
   wrote in message news:jN-dnUImFI79q5rZnZ2dnUVZ_tOdnZ2d@comcast.com...   
   >> I have decided to provide students with a pre-defined function of my own   
   >> design   
   >> please review and improve if you can   
   >> the function:   
   >>   
   >> Function isInteger(strVal As String) As Boolean   
   >>   
   >> 'if not numeric or decimal point found   
   >> If Not IsNumeric(strVal) Or InStr(strVal, ".") Then   
   >> isInteger = False   
   >> Else   
   >> isInteger = True   
   >> End If   
   >>   
   >> End Function   
   >   
   > From a previous post of mine...   
   >   
   > I usually try and steer people away from using IsNumeric to "proof"   
   > supposedly numeric text. Consider this (also see note below):   
   >   
   > ReturnValue = IsNumeric("($1,23,,3.4,,,5,,E67$)")   
   >   
   > Most people would not expect THAT to return True. IsNumeric has some   
   > "flaws"   
   > in what it considers a proper number and what most programmers are looking   
   > for.   
   >   
   > I had a short tip published by Pinnacle Publishing in their Visual Basic   
   > Developer magazine that covered some of these flaws. Originally, the tip   
   > was   
   > free to view but is now viewable only by subscribers.. Basically, it said   
   > that IsNumeric returned True for things like -- currency symbols being   
   > located in front or in back of the number as shown in my example (also   
   > applies to plus, minus and blanks too); numbers surrounded by parentheses   
   > as   
   > shown in my example (some people use these to mark negative numbers);   
   > numbers containing any number of commas before a decimal point as shown in   
   > my example; numbers in scientific notation (a number followed by an upper   
   > or   
   > lower case "D" or "E", followed by a number equal to or less than 305 --   
   > the   
   > maximum power of 10 in VB); and Octal/Hexadecimal numbers (&H for   
   > Hexadecimal, &O or just & in front of the number for Octal).   
   >   
   > NOTE:   
   > ======   
   > In the above example and in the referenced tip, I refer to $ signs and   
   > commas and dots -- these were meant to refer to your currency, thousands   
   > separator and decimal point symbols as defined in your local settings --   
   > substitute your local regional symbols for these if appropriate.   
   >   
   > As for your question about checking numbers, here are two functions that I   
   > have posted in the past for similar questions..... one is for digits only   
   > and the other is for "regular" numbers:   
   >   
   > Function IsDigitsOnly(Value As String) As Boolean   
   > IsDigitsOnly = Len(Value) > 0 And _   
   > Not Value Like "*[!0-9]*"   
   > End Function   
   >   
   > Function IsNumber(ByVal Value As String) As Boolean   
   > ' Leave the next statement out if you don't   
   > ' want to provide for plus/minus signs   
   > If Value Like "[+-]*" Then Value = Mid$(Value, 2)   
   > IsNumber = Not Value Like "*[!0-9.]*" And _   
   > Not Value Like "*.*.*" And _   
   > Len(Value) > 0 And Value <> "." And _   
   > Value <> vbNullString   
   > End Function   
   >   
   > Here are revisions to the above functions that deal with the local   
   > settings   
   > for decimal points (and thousand's separators) that are different than   
   > used   
   > in the US (this code works in the US too, of course).   
   >   
   > Function IsNumber(ByVal Value As String) As Boolean   
   > Dim DP As String   
   > ' Get local setting for decimal point   
   > DP = Format$(0, ".")   
   > ' Leave the next statement out if you don't   
   > ' want to provide for plus/minus signs   
   > If Value Like "[+-]*" Then Value = Mid$(Value, 2)   
   > IsNumber = Not Value Like "*[!0-9" & DP & "]*" And _   
   > Not Value Like "*" & DP & "*" & DP & "*" And _   
   > Len(Value) > 0 And Value <> DP And _   
   > Value <> vbNullString   
   > End Function   
   >   
   > I'm not as concerned by the rejection of entries that include one or more   
   > thousand's separators, but we can handle this if we don't insist on the   
   > thousand's separator being located in the correct positions (in other   
   > words,   
   > we'll allow the user to include them for their own purposes... we'll just   
   > tolerate their presence).   
   >   
   > Function IsNumber(ByVal Value As String) As Boolean   
   > Dim DP As String   
   > Dim TS As String   
   > ' Get local setting for decimal point   
   > DP = Format$(0, ".")   
   > ' Get local setting for thousand's separator   
   > ' and eliminate them. Remove the next two lines   
   > ' if you don't want your users being able to   
   > ' type in the thousands separator at all.   
   > TS = Mid$(Format$(1000, "#,###"), 2, 1)   
   > Value = Replace$(Value, TS, "")   
   > ' Leave the next statement out if you don't   
   > ' want to provide for plus/minus signs   
   > If Value Like "[+-]*" Then Value = Mid$(Value, 2)   
   > IsNumber = Not Value Like "*[!0-9" & DP & "]*" And _   
   > Not Value Like "*" & DP & "*" & DP & "*" And _   
   > Len(Value) > 0 And Value <> DP And _   
   > Value <> vbNullString   
   > End Function   
   >   
      
   interesting, you have made a comprehensive study of the flawed isNumeric()   
   function   
   I don't understand this aspect of your code : Like "*[!0-9]*" can't find it   
   in my VB manual.   
   what's going on there?   
      
   cw   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|