PHP-获取数字中的数字长度

PHP-获取数字中的数字长度,php,numbers,string-length,Php,Numbers,String Length,我想问一下如何得到整数中数字的长度。例如: $num = 245354; $numlength = mb_strlen($num); $numlength在本例中应为6。不知怎的,我不能让它工作 谢谢 编辑:上面的示例代码--^及其相应的方法mbstrlen()工作正常。可能: $num = 245354; $numlength = strlen((string)$num); 更优雅的方式:) 你也可以用一些基础数学 $digits = (int)(log($num,10)+1) <

我想问一下如何得到整数中数字的长度。例如:

$num = 245354;
$numlength = mb_strlen($num);
$numlength
在本例中应为6。不知怎的,我不能让它工作

谢谢

编辑:上面的示例代码--^及其相应的方法
mbstrlen()工作正常。

可能:

$num = 245354;
$numlength = strlen((string)$num);
更优雅的方式:)


你也可以用一些基础数学

$digits = (int)(log($num,10)+1) 

<?php
  $num = 123;
  $num2 = 1234;
  $num3 = 12345;

  function digits($num){
    return (int) (log($num, 10) + 1);
  }

  echo "\n $num: " . digits($num);  // 123: 3
  echo "\n $num2:" . digits($num2); // 1234: 4
  echo "\n $num3:" . digits($num3); // 12345: 5 
  echo "\n";
$digits=(int)(log($num,10)+1)

接受的答案对大数字不起作用。计算任何数字长度的更好方法是调用
floor(log10($num)+1)
并检查
0

$num = 12357;
echo $num !== 0 ? floor(log10($num) + 1) : 1; // prints 5
它有多重优势。它的速度更快,你不需要进行类型转换,它适用于大数字,它适用于不同的数字系统,如bin,hex,oct

该方程以10为底进行对数运算,然后以10为底加1

此解决方案可以在基数上独立工作,因此如果要计算二进制或十六进制的长度,只需更改对数的基数即可


仅使用某些版本的
(int)(log($num,10)+1)
在10、100、1000等情况下失败。它将数字10计为1位,100计为两位,等等。在0或任何负数情况下也会失败。
如果必须使用数学(且数字为非负数),请使用:
$numlength=(int)(log($num+1,10)+1)


或对于以正数或负数计算数字的数学解决方案:
$numlength=($num>=0)?(int)(log($num+1,10)+1):(int)(log(1-$num,10)+1)



但是strlen解决方案在PHP中的速度几乎一样快。

以下函数适用于整数或浮点数(适用于PHP7+):


在PHP中,类型是松散设置和猜测的,如果您想将某个对象视为字符串(如果它是整数、float和(我没有尝试过这个)bool),那么@Gorjunav是最正确的答案

将变量重置为字符串

然后你可以用它去任何与字符串相关的地方!反之亦然,用于将字符串更改为int

$number = (int) $stringNum;

等等…

在计算负数时,公认的解决方案会出现问题

它适用于正数:

$num = 245354;
$numlength = strlen((string)$num);
// Result: 6
但如果是负数,则(-)将添加到计数中:

$num = -245354;
$numlength = strlen((string)$num);
// Result: 7
快速解决方法:

$num = -245354;
$numlength = strlen((string)abs($num));
// Result: 6

只计算整数值

  `<?php
        $n1 =12345;
        $n2 =123454.55;
        $n3 =12345564.557;
        echo "The Number you Type: ".$n1."<br>";
        $count = 0; 
        while ($n1 != 0)  
        { 
            $n1 = $n1 / 10;
            $n1 = intval($n1);
            ++$count; 
        } 
        echo "The Digit in a Number: ".$count;
    }
    ?>`
``

另一种计算数字长度的方法是将数字的整数部分除以10,直到变成0

例如:

2021/10 = 202.1 
202/10 = 20.2 
20/10 = 2 
2/10 = 0.2
代码:


在PHP4.4.9-8.0.0中测试

$array = array(-1, 0, -0, 1, 4, 9, 10, -10, 20, -20, 100, -100);
foreach( $array as $key => $num ){
    echo $key."\t{$num}\t=>\t".($num !== 0 ? floor(log10(abs($num)) + 1) : 1)."\n";
}
/* Output:
0   -1  =>  1
1   0   =>  1
2   0   =>  1
3   1   =>  1
4   4   =>  1
5   9   =>  1
6   10  =>  2
7   -10 =>  2
8   20  =>  2
9   -20 =>  2
10  100 =>  3
11  -100    =>  3
*/

它怎么不起作用?你得到了什么结果?不是给出很多解决方案,而是有人想到了“为什么这段代码不起作用?”。因为代码应该有效。发布的代码就像一个符咒!更好的解决方法是使用log(),这样就不需要将其转换为字符串。使用像
log()
这样的数学函数对我来说是不可读的。我相信那个程序员数学家这个解对更大的数字不起作用。使用任何超过19位的数字进行测试。正如Robert所说,它不适用于任何10^n数字系列(n>=0)。零也不行!我认为你必须为0设置一个if;它会导致PHP7中的-INF。什么会导致它?我刚刚用PHP7检查了一下,它正在工作。我明白了,我不明白你的意思,我会编辑答案,谢谢三元运算符中的第三个表达式是1,不是0;因为0有一个数字!这应该是可接受的答案,因为当前可接受的答案不适用于大数字。这不提供问题的答案。一旦你有足够的钱,你将能够;相反@奥利弗哈德:这是一个什么样的评论,还是不是一个答案?当然,它缺乏解释,但这只是一个值得否决的答案。尽管答案是正确的,但它是(2019年11月)的翻版。上面的注释源于审阅队列中使用的StackOverflow模板。将答案数量保持在较低水平并集中注意力,有助于其他用户更快地确定解决方案。谢谢你的理解!
  `<?php
        $n1 =12345;
        $n2 =123454.55;
        $n3 =12345564.557;
        echo "The Number you Type: ".$n1."<br>";
        $count = 0; 
        while ($n1 != 0)  
        { 
            $n1 = $n1 / 10;
            $n1 = intval($n1);
            ++$count; 
        } 
        echo "The Digit in a Number: ".$count;
    }
    ?>`
echo strlen((string) abs($num)); // using **abs** it'll work with negative integers as well  
2021/10 = 202.1 
202/10 = 20.2 
20/10 = 2 
2/10 = 0.2
function numberGetLength($number) {
     $count = 0;
     while (intval($number) > 0) {
        $number = intval($number) / 10;
        $count += 1;
     }
     return $count
}
$array = array(-1, 0, -0, 1, 4, 9, 10, -10, 20, -20, 100, -100);
foreach( $array as $key => $num ){
    echo $key."\t{$num}\t=>\t".($num !== 0 ? floor(log10(abs($num)) + 1) : 1)."\n";
}
/* Output:
0   -1  =>  1
1   0   =>  1
2   0   =>  1
3   1   =>  1
4   4   =>  1
5   9   =>  1
6   10  =>  2
7   -10 =>  2
8   20  =>  2
9   -20 =>  2
10  100 =>  3
11  -100    =>  3
*/