скажем, у меня есть переменная, содержащая целое число или плавание (так как целые числа могли бы переполниться в плавание в 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);
Если вы передаете значение в строку, вы можете использовать селектор типа массива.
Например:
$n = (string)12345676543.876543;
echo (int)$n[0];
Я знаю, что вы заявили, что хотите избежать преобразования в строку, но если вы хотите перебирать цифры в PHP, это будет самый быстрый способ:
$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
$d = $n[$i];
В быстром и грязном тесте это было примерно На 50% быстрее, чем эквивалентный набор математических выражений, даже при минимальном обращении к log
и exp
.
@Mark Baker предложил лучшее решение, хотя вам следует выполнить abs (floor ($ num))
перед применением алгоритма.
Математический метод:
function leftMost($num) {
return floor($num/pow(10,(floor((log10($num))))));
}
объяснил, я думаю ...
1+ log10 of num вычисляет количество цифр в числе, мы уменьшаем его, чтобы удалить любые десятичные значения, поместите его как показатель степени, чтобы для однозначного числа мы получили 10 ^ 0 = 1, или для восьмизначного числа мы получили 10 ^ 8. Затем мы просто делим 12345678/10000000 = 1,2345678, которое получает пол и составляет всего 1.
примечание: это также работает для чисел от нуля до единицы, где оно вернет 2 в 0,02, и преобразование строки будет неудача.
Если вы хотите работать с отрицательными числами, сначала сделайте $ num = abs ($ num).
Я уверен, что есть способ сделать это, не преобразовывая его в строку , но почему? Обход строки
настолько прост:
$x = (int)substr($num, 0, 1);
Он даст вам правильное целое число.
Очевидно, что при этом не выполняется расширенная проверка на наличие ошибочного ввода, и требуется, чтобы $ num
было действительным числом.
Чтобы получить остальные цифры
$remainingnum = (int)substr((string)$num, 1, strlen($num));