2012-01-18 8 views
0

ロケールはsetlocale(LC_ALL, 'ru_RU.UTF-8') に設定されています。小数点は,です。ロケール小数点と型キャストによる不思議な動作

文字列が入力されています(たとえば、11,25)。 倍精度にキャストするときに$double = (double)$double;精度が低下しています。

setlocale(LC_ALL, 'ru_RU.UTF-8'); 

$input = '11,25'; 
var_dump((double)$input); //11 

$linfo = localeconv(); 
$input = '11'.$linfo['decimal_point'].'25'; 
var_dump((double)$input); //11 

$input = '11.25'; 
var_dump((double)$input); //11,25 

だから、私はロケールエフェクトだけを見ることができます。 10進数値を操作する前に、常にstr_replace(array(',','.'), '.', $input)にする必要がありますか?

答えて

2

私はsetlocaleが失敗したと信じています。あなたが投稿したコードは(win7x86、PHP 5.2.12、システムロケールがen_USです)私にLocale set failedを与える

if (false !== setlocale(LC_ALL, 'en_GB')) { 
    echo "Locale set"; 
} 
else{ 
    echo "Locale set failed"; 
} 

setlocale(LC_ALL, 'ru_RU.UTF-8');を交換してみてください。

は勝利で

を更新し、それはsetlocale(LC_ALL, 'Russian_Russia.1251')だが、変換の結果は、あなたが説明しただけのようなものです。

答えはUsing setlocale() doesn't affect PHPs number conversionsです。要するに、型キャスティングはロケール設定の影響を受けません(PHP manual参照)。ロケールベースの小数点区切り文字を最初にドットで置き換える必要があります。私は(私はコンマとドット:)以外の小数点の記号を使用しています文化を意識しませんが)

str_replace($linfo['decimal_point'], '.', $input) 

は、より適切な柔軟かつ堅牢になると思います。

-2

PHPの小数点は、.です。ロケールに依存しません。