Re: [PHP] variable type - conversion/checking

[email protected] (Ashley Sheridan)
Newsgroups php.general
Message-ID <[email protected]>
On Sat, 2013-03-16 at 11:46 -0400, Andrew Ballard wrote:

> On Mar 16, 2013 6:14 AM, "Ashley Sheridan" <[email protected]> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.