【问题标题】:PHP - Get length of digits in a numberPHP - 获取数字中的数字长度
【发布时间】:2015-04-10 14:39:38
【问题描述】:

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

$num = 245354;
$numlength = mb_strlen($num);

$numlength 在本例中应为 6。不知怎的,我无法让它工作?

谢谢

编辑: 上面的示例代码 --^ 及其各自的方法 mb_strlen(); 工作正常。

【问题讨论】:

  • 怎么不行?你得到了什么结果?
  • 没有给出许多解决方案,而是有人对“为什么这个代码不起作用?”有一个想法。因为代码应该可以工作。
  • 贴出的代码works像个魅力!

标签: php numbers string-length


【解决方案1】:

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

function digitsCount($number): int
{
    $number = abs($number);
    $numberParts = explode(".", $number);

    return
        strlen($numberParts[0]) +
        (strlen($numberParts[1] ?? 0));
}

【讨论】:

    【解决方案2】:

    在 PHP 4.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
    */
    

    【讨论】:

    • $array = array(-1, 0156, -0, 1, 4, 9, 10, -10, 20, -20, 100, -100); 失败
    【解决方案3】:

    找出数字长度的另一种方法是将数字的整数部分除以 10,直到它变为 0。

    例子:

    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
    }
    

    【讨论】:

      【解决方案4】:
      echo strlen((string) abs($num)); // using **abs** it'll work with negative integers as well  
      

      【讨论】:

      【解决方案5】:

      只计算整数值

        `<?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;
          }
          ?>`
      

      【讨论】:

      • $n1 = 0156; 失败
      【解决方案6】:

      接受的解决方案在评估负数时会出现问题。

      它适用于正数:

      $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
      

      【讨论】:

      • $n = 0156; 失败
      【解决方案7】:

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

      $num = 12357;
      echo $num !== 0 ? floor(log10($num) + 1) : 1; // prints 5
      

      它有很多优点。它更快,您无需进行类型转换,它适用于大数字,它适用于 bin、hex、oct 等不同的数字系统。

      等式以 10 为底做对数,然后取其底并加 1。

      这个解决方案可以在底数上独立工作,所以如果你想计算二进制或十六进制的长度,只需改变对数的底数。

      Working fiddle

      【讨论】:

      • 我认为你必须为 0 加上一个 if;它会导致 PHP7 中的 -INF。
      • 是什么原因造成的?我刚刚用 PHP7 检查了它,它正在工作。
      • 我明白了,我不明白你的意思,我会编辑答案,谢谢
      • 三元运算符中的第三个表达式是 1,而不是 0;因为 0 有 1 个数字!
      • 这应该是接受的答案,因为当前接受的答案不适用于大数字
      【解决方案8】:

      在 PHP 中,类型是松散设置和猜测的,如果您想将某些内容视为字符串,如果它是 integerfloat 和(我还没有尝试过) bool 那么@Gorjunav 是最正确的答案。

      将变量重置为字符串

      $stringNum = (string) $num;
      

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

      $number = (int) $stringNum;
      

      等等……

      【讨论】:

      • $n = 0156; 失败
      【解决方案9】:

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

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

      但是 strlen 解决方案在 PHP 中的速度差不多。

      【讨论】:

        【解决方案10】:

        你也可以使用一些基本的数学!

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

        【讨论】:

          【解决方案11】:

          更优雅的方式:)

          ceil(log10($num));
          

          【讨论】:

          • 正如罗伯特所说,它不适用于任何 10 ^ n 数字系列 (n >= 0)。零也行不通!
          • $n = 0156; 失败
          【解决方案12】:

          也许:

          $num = 245354;
          $numlength = strlen((string)$num);
          

          【讨论】:

          • 更好的解决方案是使用 log() 然后你不需要将它转换为字符串。
          • 使用像 log() 这样的数学函数对我来说是不可读的。我相信程序员!=数学家
          • 此解决方案不适用于更大的数字。使用任何超过 19 位的数字进行测试。
          • $n = 0156; 失败
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-20
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多