PHP最左边的数字

时间:2010-07-05 13:20:10

标签: php digits

假设我有一个包含整数或浮点数的变量(因为整数可能会溢出到PHP中的浮点数中)。

我想运行一些操作来获取最左边的数字和剩下的其余数字。

更好地解释:

<?php

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

/// run operation


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

?>

现在,我知道如果你将数字表示为字符串,有很多种方法可以做到这一点,但我试图避免将其类型转换为字符串。

我可能正在寻找一个包含按位操作的解决方案,但我在这个主题上相当弱,所以我希望通常低级操作的人可以回答这个问题!

非常感谢。

7 个答案:

答案 0 :(得分:11)

我确信有一种方法可以在不将其转换为字符串的情况下执行此操作,但为什么呢? string绕道很容易:

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

它会给你一个漂亮的,正确的整数。

显然,这不会对错误输入进行扩展检查,并且需要$num才能成为有效数字。

答案 1 :(得分:9)

避免使用任何字符串操作,但不保证浮动甚至负值

$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);

答案 2 :(得分:8)

仅数学方法:

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。

注意:这适用于0到1之间的数字,它将在0.02中返回2,并且字符串转换将失败。

如果您想使用负数,请先使用$ num = abs($ num)。

答案 3 :(得分:0)

获取其余数字

  

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

答案 4 :(得分:0)

如果将值转换为字符串,则可以使用数组类型选择器。

例如:

$n = (string)12345676543.876543;
echo (int)$n[0];

答案 5 :(得分:0)

@Mark Ba​​ker提供了最佳解决方案,但在应用算法之前应该abs(floor($num))

答案 6 :(得分:0)

我知道你说你想避免转换为字符串,但是如果你想在PHP中循环数字,这将是最快的方式:

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

在快速而肮脏的基准测试中,它比同等数学表达式快约50%,即使最小化对logexp的调用也是如此。