Вопрос
Скажем, у меня есть переменная, содержащая целое число или поплавок (поскольку целые числа могут переполняться в поплавок в PHP).
Я хочу запустить некоторую операцию, чтобы получить левую цифру и остальные оставшиеся цифры.
Чтобы объяснить лучше:
<?php
$x = NULL; //this will hold first digit
$num = 12345; //int
/// run operation
//outputs
//$x = 1;
//$num = 2345;
var_dump($x, $num);
?>
Теперь я знаю, что есть множество способов сделать это, если вы представляете номер в виде строки, но я пытаюсь избежать типа литья его в строку.
Я, вероятно, ищу решение, которое включает в себя побитовые операции, но я довольно слаб в этой теме, поэтому я надеюсь, что кто-то, кто обычно работает низкоуровневый, может быть в состоянии ответить на это!
Огромное спасибо.
Решение
Избегает использования любых строковых манипуляций, но нет гарантий для поплавки или даже отрицательных значений
$x = NULL; //this will hold first digit
$num = 12345; //int
$m = 1;
while(true) {
$m *= 10;
if ($m > $num)
break;
}
$m /= 10;
$x = (int) floor($num / $m);
$num = $num % $m;
//outputs
//$x = 1;
//$num = 2345;
var_dump($x, $num);
Другие советы
Я уверен, что есть способ сделать это, не качая его в строку, но почему? То string
Обход так просто:
$x = (int)substr($num, 0, 1);
Это даст вам хорошее, правильное целое число.
Очевидно, это не расширенная проверка неисправного ввода и требует $num
быть действительным числом.
Метод только математики:
function leftMost($num) {
return floor($num/pow(10,(floor((log10($num))))));
}
Объяснил, я думаю ...
1+ Log10 Num вычисляет количество цифр, которое есть номер, мы наполируем его, чтобы удалить любые десятичные значения, поместите его в качестве показателя, поэтому для 1-значного числа мы получаем 10 ^ 0 = 1, или 8-значный номер, который мы получаем 10 ^ 8. Затем мы просто деврим 12345678/10000000 = 1,2345678, которые получают пол и всего 1.
Примечание. Это работает для номеров между нулем и один также, где он вернет 2 в 0,02, а преобразование строки будет не удальчено.
Если вы хотите работать с отрицательными числами, сначала сделайте $ num = ABS ($ num).
Чтобы получить остальные цифры
$ Remainingnum = (int) substr ((строка) $ num, 1, strlen ($ num));
Если вы типируете значение строки, вы можете использовать селектор типа массива.
Например:
$n = (string)12345676543.876543;
echo (int)$n[0];
@Mark Baker предложил лучшее решение, хотя вы должны сделать abs(floor($num))
перед применением алгоритма.
Я знаю, что вы заявили, что вы хотите избежать литья в строку, но если вы хотите закрутить цифры в PHP, это будет самый быстрый способ:
$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
$d = $n[$i];
В быстром и грязном этапе, это было около 50% быстрее, чем эквивалентный набор математических выражений, даже при минимизации вызовов на log
и exp
.