Am 23.10.2016 um 21:13 schrieb Marc Bennewitz:
Am 23.10.2016 um 13:49 schrieb Niklas Keller:
2016-10-23 12:55 GMT+02:00 Marc Bennewitz <dev@mabe.berlin
<mailto:dev@mabe.berlin>>:
Hi internals,
On casting a non numeric value to a float in PHP the result will be
float(0).
In PHP-7.0 an exception was introduced that on casting a string
"/\s*NaN\s*/i" will result in float(NaN).
https://3v4l.org/2Xakm
Wouldn't it be more logical and expected to return NaN in all cases
of casting a non numeric string to a floating point number?
Thanks
Marc
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
+1
I just noticed that the behavior change in PHP-7 has been "fixed"
already by https://bugs.php.net/bug.php?id=73329.
So the old behavior will be presented soon.
But I'm still curious why casting any non numeric string results in the
valid number float(0) where there is a special value in floating point
numbers declared to represent not a number values.
I also did a small research on other languages and found the following:
C strtod returns float(0)
-> but supports converting the strings "INFINITY" or "NAN"
(case-insensitive)
JavaScript returns NaN
I forgot to mention that in JavaScript (parseFloat) it is nearly the
behavior I would expect. The only difference is that it allows the
string +/- "Infinity" to be casted to Infinity.
Python throws ValueError: could not convert string to float
-> but supports the string +/- "NaN", "Inf", "Infinity"
(case-insensitive)
Perl returns float(0)
-> but supports the string +/- "NaN", "Inf", "Infinity"
(case-insensitive)
So there is a nice mix of how other languages will handle this problem.
In my opinion it still makes much more sense to return NaN in any case a
not numeric string will be casted to float incl. "Inf" and "Infinity".
(If spaces should be ignored or suffixes allowed is another question)
= The beginning of a string must contain at least one number by ignoring
spaces to be casted to a valid floating point number. In any other
situations NaN must be returned because this represents what it is = Not
a Number.
So for me the following example table makes sense:
In -> Out
"" -> NaN
" " -> NaN
"+" -> NaN
"-" -> NaN
"." -> NaN
".5" -> 0.5
"0.5" -> 0.5
" 0.5" -> 0.5
"0" -> 0
" 0" -> 0
"Nan" -> NaN
"Inf" -> NaN
"Info" -> NaN
"foo" -> NaN
".foo" -> NaN
".2foo" -> 0.2
" .2foo" -> 0.2
"foo1" -> NaN
"foo." -> NaN
"foo0.1" -> NaN
Thoughts
Marc
Regards, Niklas
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php