PHP самая левая цифра - PullRequest
6 голосов
/ 05 июля 2010

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

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

Чтобы объяснить лучше:

<?php

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

/// run operation


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

?>

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

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

Спасибо большое.

Ответы [ 7 ]

11 голосов
/ 05 июля 2010

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

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

Это даст вам хорошее, правильное целое число.

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

9 голосов
/ 05 июля 2010

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

$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);
8 голосов
/ 05 июля 2010

Math-only метод:

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, который получает floor'd и равен 1.

Примечание: это работает для чисел от нуля до единицы, где он возвращает 2 в 0.02, иПреобразование строки не удастся.

Если вы хотите работать с отрицательными числами, сначала сделайте $ num = abs ($ num).

0 голосов
/ 05 июля 2010

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

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

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

0 голосов
/ 05 июля 2010

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

0 голосов
/ 05 июля 2010

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

Например:

$n = (string)12345676543.876543;
echo (int)$n[0];
0 голосов
/ 05 июля 2010

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

$ Остаток = (int) substr ((строка) $ num, 1, strlen ($ num));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...