Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Leftmost digit

Tags:

php

digits

let's say I have a variable containing an integer or a float (since integers might overflow into a float in PHP).

I want to run some operation to get the leftmost digit and the rest of the remaining digits.

To explain better:

<?php

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

/// run operation


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

?>

Now, I know there's multitudes of ways to do this if you represent the number as a string, but I'm trying to avoid type casting it into a string.

I'm probably looking for a solution which includes bitwise operations, but I'm pretty weak in that topic so I'm hoping someone who usually works low-level might be able to answer this!

Thanks a bunch.

like image 804
Jean Paul Galea Avatar asked Jul 05 '10 13:07

Jean Paul Galea


3 Answers

I'm sure there is a way to do this without casting it to a string, but why? The string detour is so easy:

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

It'll give you a nice, proper integer.

Obviously, this does no extended checking for faulty input, and requires $num to be a valid number.

like image 51
Pekka Avatar answered Nov 13 '22 18:11

Pekka


Avoids using any string manipulation, but no guarantees for float or even negative values

$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);
like image 34
Mark Baker Avatar answered Nov 13 '22 18:11

Mark Baker


Math-only method:

function leftMost($num) {  
    return floor($num/pow(10,(floor((log10($num))))));
}

explained I guess...

1+ log10 of num calculates the number of digits a number is, we floor it to remove any decimal values, put it as the exponent so for a 1 digit number we get 10^0=1, or a 8 digit number we get 10^8. We then are just divding 12345678/10000000 = 1.2345678, which gets floor'd and is just 1.

note: this works for numbers between zero and one also, where it will return the 2 in 0.02, and a string transform will fail.

If you want to work with negative numbers, make $num = abs($num) first.

like image 20
Incognito Avatar answered Nov 13 '22 18:11

Incognito