【问题标题】:Formatting a number with leading zeros in PHP [duplicate]在PHP中用前导零格式化数字[重复]
【发布时间】:2010-12-14 13:43:14
【问题描述】:

我有一个包含值 1234567 的变量。

我希望它恰好包含 8 位数字,即01234567

有 PHP 函数吗?

【问题讨论】:

    标签: php numbers format


    【解决方案1】:

    如果输入的数字始终为 7 位或 8 位,也可以使用

    $str = ($input < 10000000) ? 0 . $input : $input;
    

    我进行了一些测试,发现这将是 str_padsprintf 的两倍。
    如果输入可以有任何长度,那么你也可以使用

    $str = substr('00000000' . $input, -8);
    

    这个不如另一个快,但也应该比str_padsprintf快一点。

    顺便说一句:我的测试还说sprintfstr_pad 快一点。我使用 PHP 5.6 进行了所有测试。

    编辑:尽管substr 版本似乎仍然非常快(PHP 7.2),但如果您的输入可能比您想要填充的长度长,它也会被破坏。例如。您想填充 3 位数字,而您的输入有 4 位而不是 substr('0000' . '1234', -3) = '234' 只会导致最后 3 位数字

    【讨论】:

    • 谢谢,我喜欢你的变化,但认为它应该是 $str = (strlen($input)
    • @JMX 事实上,这两种方式都可以正常工作。 (除了我失踪的$我刚刚修复)
    【解决方案2】:
    $no_of_digit = 10;
    $number = 123;
    
    $length = strlen((string)$number);
    for($i = $length;$i<$no_of_digit;$i++)
    {
        $number = '0'.$number;
    }
    
    echo $number; ///////  result 0000000123
    

    【讨论】:

      【解决方案3】:

      你总是可以滥用类型杂耍:

      function zpad(int $value, int $pad): string {
          return substr(1, $value + 10 ** $pad);
      }
      

      如果是10 ** pad &gt; INT_MAXvalue &gt;= 10 * pad,这将无法正常工作。

      【讨论】:

        【解决方案4】:

        当我需要 01 而不是 1 时,以下对我有用:

        $number = 1;
        $number = str_pad($number, 2, '0', STR_PAD_LEFT);
        

        【讨论】:

        • str_pad 比 sprintf 好
        【解决方案5】:

        我写了这个简单的函数来产生这种格式:01:00:03

        始终显示秒数(即使为零)。 如果大于零或需要几小时或几天,则显示分钟。 如果大于零或需要天数,则显示小时数。 如果大于零,则显示天数。

        function formatSeconds($secs) {
            $result = '';
        
            $seconds = intval($secs) % 60;
            $minutes = (intval($secs) / 60) % 60;
            $hours = (intval($secs) / 3600) % 24;
            $days = intval(intval($secs) / (3600*24));
        
            if ($days > 0) {
                $result = str_pad($days, 2, '0', STR_PAD_LEFT) . ':';
            } 
        
            if(($hours > 0) || ($result!="")) {
                $result .= str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
            } 
        
            if (($minutes > 0) || ($result!="")) {
                $result .= str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
            } 
        
            //seconds aways shown
            $result .= str_pad($seconds, 2, '0', STR_PAD_LEFT); 
        
            return $result;
        
        } //funct
        

        例子:

        echo formatSeconds(15); //15
        echo formatSeconds(100); //01:40
        echo formatSeconds(10800); //03:00:00 (mins shown even if zero)
        echo formatSeconds(10000000); //115:17:46:40 
        

        【讨论】:

          【解决方案6】:

          使用sprintf

          sprintf('%08d', 1234567);
          

          或者你也可以使用str_pad:

          str_pad($value, 8, '0', STR_PAD_LEFT);
          

          【讨论】:

          • 只是想补充一下:str_pad 不是带有负数的选项
          • 只是添加到 wtf8_decode 所说的内容之上;负数不会有前导零,它们也不是正数。即 08 将被写成日期,或者期望一个正的两位数的东西(银行账户排序代码等)。如果我错了,请纠正我,但据我所知,现实生活中没有要求负值前导零的实例吗?
          • 想要添加sprintf('%+03d:00 UTC',$i),其中$i 是-12 到12,将根据需要打印+ 或-,并且还会为小于2 位的数字添加前导零。非常适合在 HTML 中创建时区 SELECT
          • 对于当前版本 (7.1) 及更低版本,sprintf(3v4l.org/junvv/perf#output) 比 str_pad(3v4l.org/cliNP/perf#output) 快一点
          • 负数何时可能需要前导零... 一个三位数的升降计数器? T-010、T-009、T-008 等
          【解决方案7】:

          假设值在 $value 中:

          • 回应它:

            printf("%08d", $value);

          • 得到它:

            $formatted_value = sprintf("%08d", $value);

          这应该可以解决问题

          【讨论】:

            【解决方案8】:

            sprintf 是您所需要的。

            编辑(以某种方式被否决票要求),来自上面链接的页面,这是一个示例“零填充整数”:

            <?php
                $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
            ?>
            

            【讨论】:

            • 除了简单地链接 sprintf() 的手册页之外,如果有一个示例或更多解释会更好。
            【解决方案9】:
            echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
            

            【讨论】:

              【解决方案10】:

              虽然我不太确定你想做什么,但你可能正在寻找sprintf

              这将是:

              $value = sprintf( '%08d', 1234567 );
              

              【讨论】:

                【解决方案11】:

                简单的答案

                $p = 1234567;
                $p = sprintf("%08d",$p);
                

                我不确定如何解释“它永远不会超过 8 位”的评论以及它是指输入还是输出。如果它引用了输出,则必须额外调用 substr() 来剪辑字符串。

                截取前 8 位数字

                $p = substr(sprintf('%08d', $p),0,8);
                

                截取最后 8 位数字

                $p = substr(sprintf('%08d', $p),-8,8);
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-06
                  • 2017-08-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多