6

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

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

为了更好地解释:

<?php

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

/// run operation


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

?>

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

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

谢谢一堆。

4

7 回答 7

11

我敢肯定有一种方法可以做到这一点,而无需将其转换为字符串,但为什么呢?string绕路很简单:

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

它会给你一个很好的,适当的整数。

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

于 2010-07-05T13:23:07.393 回答
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);
于 2010-07-05T13:37:28.103 回答
8

仅数学方法:

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

解释我猜...

num 的 1+ log10 计算数字的位数,我们将其取底以删除任何十进制值,将其作为指数,因此对于 1 位数字我们得到 10^0=1,或 8 位数字我们得到 10 ^8. 然后我们只是将 12345678/10000000 = 1.2345678 相除,它得到了 floor'd 并且只有 1。

注意:这也适用于零和一之间的数字,它将返回 0.02 中的 2,并且字符串转换将失败。

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

于 2010-07-05T13:47:43.963 回答
0

得到其余的数字

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

于 2010-07-05T13:28:48.020 回答
0

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

例如:

$n = (string)12345676543.876543;
echo (int)$n[0];
于 2010-07-05T13:36:23.907 回答
0

@Mark Ba​​ker 提供了最好的解决方案,尽管您应该abs(floor($num))在应用算法之前这样做。

于 2010-07-05T13:43:13.843 回答
0

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

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

在快速和肮脏的基准测试中,它比等效的数学表达式集快约 50%,即使在最小化对 和 的调用时log也是如此exp

于 2010-07-05T14:56:24.783 回答