Re: variable type - conversion/checking

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux