Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет.
Прошу помощи в простой и хитрой проблеме
Субд PostgresDB, есть таблица с полем типа float8. Есть некоторые данные, к примеру 0,00005, 0,00007 и тд. При выборе этих данных из таблицы в php массиве эти числа представлены в виде 8e-005, 5e-005 и тд. Как можно получать в их в первозданном виде?
Не в сети
Ты уверен, что числа возвращаются именно строками? PHP по умолчанию при выводе числа как строки может вывести его с e, но это не значит, что само число было строкой.
Что показывает var_dump? string или double? Если string, то достаточно каста в число:
var_dump( (float) '8e-005' );
// double(8.0E-5)
Не в сети
В базе они имеют тип float. Php преобразовывает такие дробные числа в вид отрицательной степенью 8e-005.
Решение sprintf('%f', '8e-005');
// 0.000080
Спасибо, что подключился к теме
Не в сети
Решение: sprintf('%f', '8e-005');
Мне кажется, это не совсем то решение, которое ты хочешь (во всяком случае, не идеальное). Здесь ты просто преобразуешь одну строку в другую строку. Скорее всего, смысл твоей преобразования записи с e - в том, чтобы получить числовой тип, а не просто строковую запись в более привычном виде.
Я к тому, что sprintf() возвращает все ту же string, а (float) - уже число. Чисто технически, если с 8e-005 и пр. предполагается работать как с числами (складывать и пр.), то sprintf() вообще не нужен, т.е. PHP прозрачно преобразует 8e-005 в число в момент использования ('8e-5' + 1). Итого у тебя лишний и ненужный вызов функции - если уж приводить к формату, то чтобы получился числовой тип и PHP не нужно было его неявно преобразовывать.
В редких случаях тип даже имеет значение. Например, strrchr() ведет себя по-разному в зависимости от типа второго аргумента:
echo strrchr('123', sprintf('%f', '1')); // 123
echo strrchr('123', (float) '1'); // false
Не в сети
Мне нужно было получить из базы запись, которая содержит дробные числа типа float и вывести их на экран. Но php выводил в виде '8e-5' и нужен был метод, который преобразовал бы к виду 0.00008 как строку или как числовой тип не имеет значения в моем случае. Дополнительные операции над ними не требуются.
Не в сети
Но php выводил в виде '8e-5' и нужен был метод, который преобразовал бы к виду 0.00008
Тогда все верно, sprintf() это решение данной проблемы.
Не в сети
Страницы 1