Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > переопределение floatval()


Автор: bars80080 14.10.2011, 16:32
на одном сайте каким-то образом переопределена floatval, так, что она конвертирует число с точкой в число с запятой.

каким образом это происходит? чтобы я мог найти сие место и вернуть в нужное состояние

Автор: CruorVult 14.10.2011, 16:43
http://php.net/manual/en/function.override-function.php
?

Добавлено через 4 минуты и 38 секунд
или
http://de3.php.net/manual/en/function.runkit-function-redefine.php

Автор: bars80080 14.10.2011, 16:59
у меня чего-то эти функции чего-то не определяются
Fatal error: Call to undefined function 


вообще, как я понимаю, floatval могли перекрутить с помощью setlocal()
но я не могу найти в коде эту функцию, а главное, в нужном месте просто не могу сделать повторного setlocal() на нужный мне делиметер

Автор: baldina 14.10.2011, 17:23
Цитата(bars80080 @  14.10.2011,  16:32 Найти цитируемый пост)
на одном сайте каким-то образом переопределена floatval, так, что она конвертирует число с точкой в число с запятой.

это точно? оригинальная floatval() возвращает float, у которого нет понятия символа разделителя. разделитель появляется при конвертации в строку

Добавлено через 38 секунд
bars80080, покажите фрагмент кода, где вызывается floatval

Автор: CruorVult 14.10.2011, 17:27
может как-то через апач переопределяеться с помощью подключаемого модуля

хотя не думаю что кто-то на столько изощрен smile но мало ли, стоит проверить

Автор: baldina 14.10.2011, 17:46
может речь о том, что floatval воспринимает запятую во входной строке как разделитель? но это странно, насколько я понимаю, floatval не учитывает localeconv[decimal_point] при преобразовании из строки и всегда ожидает точку.
bars80080, попробуйте 
Код

setlocale(LC_NUMERIC, 'en_US');
echo 123456.789 . ' ' . floatval('123456.789') . ' ' . floatval('123456,789')."\n";
setlocale(LC_NUMERIC, 'ru_RU');
echo 123456.789 . ' ' . floatval('123456.789') . ' ' . floatval('123456,789');

имхо должно быть 
123456.789 123456.789 123456
123456,789 123456,789 123456

Автор: bars80080 14.10.2011, 17:51
Цитата(baldina @  14.10.2011,  17:23 Найти цитируемый пост)
покажите фрагмент кода, где вызывается floatval 

floatval там вызывается везде, поэтому есть сложность с заменой на свою функцию

я провёл тест, загнал такой код


Код

$total = $cart->getOrderTotal(true, 3); // какой-то свой метод
var_dump($total); // float(275,48)
$total = str_replace(',', '.', $total);
var_dump($total); // string("275.48")

$total = floatval($total);
var_dump($total); // float(275,48)


если же вместо floatval просто помножить на единицу, то результат тот же

Код

var_dump($total); // string("275.48")
$total *= 1;
var_dump($total); // float(275,48)


и этих floatval там по коду - до чёрта. но данные надо вставить в БД, поэтому необходимо их перевести в корректный вид

Добавлено через 6 минут и 55 секунд
уф! помогло

засунул
setlocale(LC_NUMERIC, 'en_US')
посередь кода - сработало

раньше пытался 
setlocale(LC_NUMERIC, 'en_EN') - не работало



спасибо

Автор: baldina 14.10.2011, 18:01
дело не в floatval, её никто не переопределял, и Вам переопределять не нужно
попробуйте сделать setlocale. её результат зависит от текущих настроек системы (напр, под windows разделитель для текущей локали меняется из панели управления, под linux определения локалей лежат обычно в /usr/share/locale и т.д.)
параметры текущей локали можно проверить при помощи localeconv()

Цитата(bars80080 @  14.10.2011,  17:51 Найти цитируемый пост)
данные надо вставить в БД

мест, где производится вставка данных вероятно намного меньше, чем вызовов floatval. в крайнем случае замените разделитель.

Добавлено через 1 минуту и 32 секунды
Цитата(bars80080 @  14.10.2011,  17:51 Найти цитируемый пост)
en_EN

просто нет такой локали))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)