Казалось бы, простейшая задачка. Появилась необходимость преобразовать довольно большое число из инженерной формы в обычное целое. Так, например, Facebook иногда коряво возвращает ID-шники своих объектов (событий, страниц, локаций и проч.). Например, у меня было число «1.0943462574234E+14«, которое я хотел бы видеть как «109434625742340«. Первая попытка преобразования «в лоб» оказалась неудачной.
Первое, что пришло в голову: прямое преобразование в int с тайпкастингом:
$s = "1.0943462574234E+14"; echo (int)$s; // Выводит "1"
Не помогла и специальная функция для преобразования типа intval():
$s = "1.0943462574234E+14"; echo intval($s); // Также выводит "1"
Вторая идея: раз уж тайпкастинг в PHP не может разглядеть в строке число с плавающей запятой в инженерной форме, то, наверное, он сможет преобразовать обычный float в int. Пробуем:
$s = "1.0943462574234E+14"; echo intval((float)$s); // Выводит "-1140959740"
WTF??
Оказывается число, которое я пытаюсь преобразовать в int, больше, чем максимально допустимое значение int в моей операционной системе (т.е. больше 31 двочного разряда!). Поэтому и получается отрицательное целое.
Итак, что же? Проблема нерешаема?
Как всегда меня выручил старый добрый sprintf(). Простая конструкция решает проблему на 100%:
$s = "1.0943462574234E+14"; echo sprintf('%.0f', (float)$s); // Выводит 109434625742340
То, что нужно! Я думаю, что этот рецепт будет работать и для бОльших по модулю чисел. Так что берите на заметку.