setlocale LC_NUMERIC странно работает

bsv

Guest
setlocale LC_NUMERIC странно работает

Есть код:
PHP:
<?
setlocale(LC_NUMERIC, 'ru');
$a = "11,11";
$b = "22,22";
echo ($a+$b),"<br>";
echo (str_replace(",", ".", $a) + str_replace(",", ".", $b)),"<br>";
?>
на выходе имеем:
Почему математика не распознает запятую как разделитель, а на экран выводит через запятую?:confused:
 

Profic

just Profic (PHP5 BetaTeam)
Все правильно :)
Так и должно быть :) Давно в PHP был глюк еще полее странный :)
setlocale (LC_ALL, 'ru_RU.KOI8-R');
$a = 5.6;
$b = 4,6;
в $a получалось 5, а на строке с $b вываливалось с parse_error...
ЗЫ, вот потому в качестве разделителя всегда используется . вне зависимости от локали
 

deek

Новичок
setlocale не может магическим образом подействовать на приведение типов в пхп.

если в строке есть '.', 'e', или 'E', то пхп при приведении типа от строки к числу будет интерпретировать эту строку как float. иначе - integer.

если хочется переконвертировать из строки в float с учетом разделителя для локали, надо почитать про localeconv и операции работы со строками.
 

bsv

Guest
если хочется переконвертировать из строки в float с учетом разделителя для локали, надо почитать про localeconv и операции работы со строками.
То есть фактически:
echo (str_replace(",", ".", $a) + str_replace(",", ".", $b)),"<br>";
вот таким вот манером?
 

deek

Новичок
скорее так:

PHP:
setlocale(LC_NUMERIC, 'ru');
$locale_info = localeconv();

echo (str_replace($locale_info["decimal_point"], ".", $a) + str_replace($locale_info["decimal_point"], ".", $b)),"<br>";
 

bsv

Guest
Автор оригинала: deek
скорее так:

PHP:
setlocale(LC_NUMERIC, 'ru');
$locale_info = localeconv();

echo (str_replace($locale_info["decimal_point"], ".", $a) + str_replace($locale_info["decimal_point"], ".", $b)),"<br>";
Мохет под *никсами и так, а я давеча вновь наступил на эти грабли (збивает с толку, что в переменной не то, что выводится на экран ;) ) и внимательно просмотрел все ...
Долго страдал, пытаясь "настроить локаль", а получается вот что :
В
PHP:
$locale_info["decimal_point"]
точка, а вот
PHP:
$a = "1,1";
echo $a;
выдает "1,1" через запятую. :confused:
Так что, похоже, под вынью нельзя полагаться на содержимое localeconv(). :(
 

bsv

Guest
тьфу, блин, совсем мозги поплыли ... копирую, и не смотрю что ... Звыняйте, день совсем дурдомный ...
Вкратце: дробь вычисляемого значения разделена запятой,
а $locale_info["decimal_point"] - точка.
PHP:
setlocale(LC_NUMERIC, 'ru');
$locale_info = localeconv(); 
print_r($locale_info);
echo "<BR><HR>\n";
$a = "1,1";
$e = "10,01";
echo str_replace(",", ".", $a) / str_replace(",", ".", $e);
Имеем

Array
(
[decimal_point] => .
...
)
0,10989010989011

Вот, это моя проверка.
 

deek

Новичок
да, действительно точка. загадочно, но лениво разбираться - жить не мешает.

в обшем, делай
setlocale(LC_MONETARY, 'Russian');

и используй из массива, возвращаемого localeconv, для правильного форматирования не decimal_point, а mon_decimal_point. он совпадает с локальными настройками, которые видны в панели управления (вкладка "Язык и стандарты").
 
Сверху