[email protected] ("Christoph M. Becker") wrote:
> Hi!
>
> Regarding the decimal separator (aka. decimal point), the behavior of
> casting float to string is inconsistent with casting string to float.
> [...]
I'm shocked... Lot of code here assumes (float) does the exact reverse of
(string); forunately most servers are configures with the default locale
"C", but I'm still concerned for libraries portability.
Did you filed a bug for that?
Anyway, here is some test code I wrote:
<?php // test-float-cast.php
/**
* Performs string to float and float to string tests vs. locale.
* @param string $loc LC_NUMERIC locale to set for the test.
*/
function test($loc)
{
if( setlocale(LC_NUMERIC, $loc) === FALSE )
throw new RuntimeException("setlocale() failed");
// Cast float to string test:
$exp = "0.5";
$got = (string) 0.5;
if( $got !== $exp )
echo "FAILED with LC_NUMERIC=$loc, (string) 0.5: got $got, exp
$exp\n";
// Cast string to float test:
$exp = 0.5;
$got = (float) "0.5";
if( $got !== $exp )
echo "FAILED with LC_NUMERIC=$loc, (float) \"0.5\": got $got,
exp $exp\n";
// printf() formatting of float:
$exp = "0.500000";
$got = sprintf("%f", 0.5);
if( $got !== $exp )
echo "FAILED with LC_NUMERIC=$loc, sprintf(\"%f\", 0.5): got
$got, exp $exp\n";
}
test("C");
test("de");
Output:
FAILED with LC_NUMERIC=de, (string) 0.5: got 0,5, exp 0.5
FAILED with LC_NUMERIC=de, sprintf("%f", 0.5): got 0,500000, exp 0.500000
The second failed test is expected, as printf, scanf and co. are intended
to be locale-aware.
But the first one? Is there any simple, efficient and safe way to convert
back a string into float?
Regards,
___
/_|_\ Umberto Salsi
\/_\/ www.icosaedro.it
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php