Вопрос

Скажем, у меня есть переменная, содержащая целое число или поплавок (поскольку целые числа могут переполняться в поплавок в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top