Float vs. setlocale()

Mark Story wpadł na ciekawy problem, który opisał na swoim blogu.

W dużym skrócie, jeśli używasz setlocale() to rzutowanie typów danych może działać nieprzewidywalnie. Polecam wpis Marka. Jednak grzebiąc nieco po php.net okazało się, że jest jeden sposób na zmianę typu, która bierze pod uwagę locale:

$pi = 3.141593;
echo (float)(string)$pi ."\n";
var_dump(setlocale(LC_NUMERIC, 'pl_PL.utf8'));
$polishPi = 3.141593;
// poniżej "problematyczne" rzutowanie
echo "string: " . (string)$polishPi ."\n";
echo "float: " . (float)(string)$polishPi ."\n";
echo "floatval(): " . floatval((string)$polishPi) ."\n";
echo "double: " . (double)(string)$polishPi ."\n";
echo "real: " . (real)(string)$polishPi ."\n";

//settype wydaje się działać dobrze z setlocale
var_dump(settype($polishPi, "double")); // można użyć "float"
echo "settype(): " . $polishPi ."\n";
var_dump(gettype($polishPi));
var_dump($polishPi*2);
var_dump(gettype($polishPi*2));

out:

3.141593
string 'pl_PL.utf8' (length=10)

string: 3,141593
float: 3
floatval(): 3
double: 3
real: 3

boolean true

settype(): 3,141593

string 'double' (length=6)

float 6,283186
string 'double' (length=6)
Share Button

Leave a Reply

Your email address will not be published. Required fields are marked *