2012-01-18 24 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 

因此,我可以看到只有語言環境效果的視圖。 這是否意味着我應該在運行十進制值之前始終使用str_replace(array(',','.'), '.', $input)

回答

2

我認爲setlocale已經失敗。試着用

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

你已經發布的代碼替換setlocale(LC_ALL, 'ru_RU.UTF-8');給我Locale set failed(win7x86,PHP 5.2.12,系統語言環境是en_US)。

修訂

贏球是setlocale(LC_ALL, 'Russian_Russia.1251'),但轉換的結果是,就像你描述。

答案可以在Using setlocale() doesn't affect PHPs number conversions找到。總之,類型轉換不受語言環境設置的影響(請參閱PHP manual)您必須先用點替換基於區域的小數點分隔符。我認爲

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

會更合適,靈活和強大的(雖然我不知道,使用比逗號和點:)其他小數點分隔符的文化)。

-2

在PHP中,小數點是.。這不取決於語言環境。