Преобразование числа из инженерной формы в целое в PHP

Казалось бы, простейшая задачка. Появилась необходимость преобразовать довольно большое число из инженерной формы в обычное целое. Так, например, 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

То, что нужно! Я думаю, что этот рецепт будет работать и для бОльших по модулю чисел. Так что берите на заметку.

Подписаться
Уведомить о
guest

 

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии