簡體   English   中英

在PHP中用前導零格式化數字

[英]Formatting a number with leading zeros in PHP

我有一個包含值1234567的變量。

我希望它精確地包含8位數字,即01234567

是否有PHP函數呢?

使用sprintf

sprintf('%08d', 1234567);

另外,您也可以使用str_pad

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

鑒於該值在$ value中:

  • 回顯它:

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

  • 為拿到它,為實現它:

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

這應該夠了吧

echo str_pad("1234567", 8, '0', STR_PAD_LEFT);

當我需要01而不是1時,以下內容對我有用:

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

盡管我不確定自己要做什么,但您可能正在尋找sprintf

這將是:

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

sprintf是您所需要的。

在上面鏈接的頁面中,編輯(按某種方式由downvotes請求 ),這里有一個示例“零填充整數”:

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

簡單的答案

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

我不確定如何解釋“永遠不會超過8位”的注釋,以及它是指輸入還是輸出。 如果它引用輸出,則必須有一個附加的substr()調用來裁剪字符串。

截斷前8位數字

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

截斷最后8位數字

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

如果輸入數字始終為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位數字

我寫了這個簡單的函數來產生這種格式: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 

這完美地工作:

$number = 13246;
echo sprintf( '%08d', $number );
$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
function duration($time){

    $hours = '';
    $minutes = '00:';
    $seconds = '00';

    if($time >= 3600){
        //0 - ~ hours
        $hours    = floor($time / 3600);
        $hours    = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 3600;
    }

    if($time >= 60){
        //0 - 60 minute     
        $minutes  = floor($time / 60);
        $minutes  = str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':';
        $time     = $time % 60; 
    }

    if($time){
        //0 - 60 second
        $seconds  = str_pad($time, 2, '0', STR_PAD_LEFT);       
    }

    return $hours . $minutes . $seconds;

}

echo duration(59); // 00:59
echo duration(590); // 09:50
echo duration(5900); // 01:38:20

您總是可以濫用類型的雜耍:

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

如果10 ** pad > INT_MAXvalue >= 10 * pad這將無法正常工作。

如果可以將零或任何其他內容附加到字符串中。 喜歡

public function saveHoliday($month)
    {
       return "0{$month}";
    }

  echo $this->saveHoliday(1);   // 01

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM