On Sat, 2013-03-16 at 11:46 -0400, Andrew Ballard wrote: > On Mar 16, 2013 6:14 AM, "Ashley Sheridan" <ash@xxxxxxxxxxxxxxxxxxxx> wrote: > > > > On Fri, 2013-03-15 at 22:32 -0400, Andrew Ballard wrote: > >> > >> > Guess regex are the only useful solution here. When you consider to use > >> > built-in functions, just remember, that for example '0xAF' is an > integer > >> > too, but '42.00' isn't. > >> > >> Shoot...I hadn't considered how PHP might handle hex or octal strings > when > >> casting to int. (Again, not in front of a computer where I can test it > >> right now. ) > >> > >> Regexes have problems with more than 9 digits for 32-bit ints. I guess to > >> some degree it depends on how likely you are to experience values that > >> large. > >> > >> Andrew > > > > > > Do they? Regex's deal with strings, so I don't see why they should have > such issues. I've certainly never come across that problem, or heard of it > before. > > > > Thanks, > > Ash > > http://www.ashleysheridan.co.uk > > > > > > Sure. If the string is nine or fewer digits, they can all be 0-9. If it is > 10 digits, the first digit can only be 1-2. If it's 1, the remaining nine > digits can still be 0-9, but if the first digit is 2, the second digit can > only be 0-1. If the second digit is 0, the remaining eight digits can still > be 0-9, but if it is 1, the third digit can only be 0-4. If the third digit > is 0-3, the remaining seven digits can still be 0-9, but if it is 4, the > fourth digit can only be 0-7. > > This pattern would continue for each of the remaining digits. Hopefully you > get the idea. When you get to the final digit, its range depends not only > on the nine preceding digits, but also the sign. If this is 64-bit, that > adds even more wrinkles (including being aware of whether your > implementation supports 64-bit ints). It may be possible to do with regular > expressions, but it would definitely be complex and probably a time sink. > > As I said, if you KNOW you won't be dealing with integers that are more > than nine digits, the regex should work fine. > > Remember, the OP didn't ask if it was an integer in the realm of infinite > pure integers; he asked how to tell if a string was a number that could be > converted to an int (presumably without loss). > > Andrew Ah, I see. I think that's not an issue as such with regular expressions having problems, more that bit limitations has a problem with numbers! Bearing that in mind, this does the trick: $string1 = '999999999'; $string2 = '9999999999'; $string3 = '999999999999999999999999999999'; var_dump($string === (intval($string1).'')); var_dump($string === (intval($string2).'')); var_dump($string === (intval($string3).'')); I'm getting the expected results on my machine (32-bit) but a 64-bit machine would get the correct results for larger numbers. Thanks, Ash http://www.ashleysheridan.co.uk