PHP Крайняя левая цифра

скажем, у меня есть переменная, содержащая целое число или плавание (так как целые числа могли бы переполниться в плавание в PHP).

Я хочу выполнить некоторую операцию для получения крайней левой цифры и остальной части остающихся цифр.

Объяснить лучше:

<?php

$x   = NULL;  //this will hold first digit
$num = 12345; //int

/// run operation


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

?>

Теперь, я знаю, что существуют множества способов сделать это, если Вы представляете число как строку, но я стараюсь избегать преобразования типа оно в строку.

Я, вероятно, ищу решение, которое включает битовые операции, но я довольно слаб в той теме, таким образом, я надеюсь кто-то, кто обычно работает, низкий уровень смог отвечать на это!

Огромное спасибо.

6
задан Jean Paul Galea 5 July 2010 в 13:20
поделиться

7 ответов

Избегает использования каких-либо манипуляций со строками, но не дает никаких гарантий для значений с плавающей запятой или даже отрицательных значений

$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);
9
ответ дан 8 December 2019 в 03:38
поделиться

Если вы передаете значение в строку, вы можете использовать селектор типа массива.

Например:

$n = (string)12345676543.876543;
echo (int)$n[0];
0
ответ дан 8 December 2019 в 03:38
поделиться

Я знаю, что вы заявили, что хотите избежать преобразования в строку, но если вы хотите перебирать цифры в PHP, это будет самый быстрый способ:

$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
  $d = $n[$i];

В быстром и грязном тесте это было примерно На 50% быстрее, чем эквивалентный набор математических выражений, даже при минимальном обращении к log и exp .

0
ответ дан 8 December 2019 в 03:38
поделиться

@Mark Baker предложил лучшее решение, хотя вам следует выполнить abs (floor ($ num)) перед применением алгоритма.

0
ответ дан 8 December 2019 в 03:38
поделиться

Математический метод:

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).

8
ответ дан 8 December 2019 в 03:38
поделиться

Я уверен, что есть способ сделать это, не преобразовывая его в строку , но почему? Обход строки настолько прост:

$x = (int)substr($num, 0, 1); 

Он даст вам правильное целое число.

Очевидно, что при этом не выполняется расширенная проверка на наличие ошибочного ввода, и требуется, чтобы $ num было действительным числом.

11
ответ дан 8 December 2019 в 03:38
поделиться

Чтобы получить остальные цифры

$remainingnum = (int)substr((string)$num, 1, strlen($num));

0
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: