cmbecke...@gmx.de ("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

Reply via email to