PHPで先行ゼロ付きの数値をフォーマットする


601

値を含む変数があります1234567

私はそれがちょうど8桁を含むようにしたい、すなわち01234567

そのためのPHP関数はありますか?

回答:


1213

使用sprintf

sprintf('%08d', 1234567);

または、次のように使用することもできますstr_pad

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

54
追加したいだけです:str_padは負の数のオプションではありません
wtf8_decode

6
wtf8_decodeが言ったことの上に追加するだけです。負の数は先行ゼロがなく、正の数ではありません。つまり、08は日付などの正の2桁の数字(銀行口座のソートコードなど)を期待するものとして記述されます。私が間違っている場合は修正してください。しかし、私が知る限り、負の値に先行ゼロを要求する実際のインスタンスはありませんか?
guyver4mk 2016年

3
-12〜12の場所を追加したいsprintf('%+03d:00 UTC',$i)場合$iは、必要に応じて+または-を印刷し、2桁未満の数字には先行ゼロを付けます。SELECTHTMLでタイムゾーンを作成するのに最適です。
Volomike 16

2
現在のバージョン(7.1)と下用sprintf3v4l.org/junvv/perf#output)少し速くよりstr_pad3v4l.org/cliNP/perf#output
Vladyslav Startsev

負の数に先行ゼロが必要になる場合... 3桁のリフトオフカウンタ?T-010、T-009、T-008など
TRT 1968

83

値が$ valueにあると仮定します。

  • それをエコーするには:

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

  • それを取得するには:

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

それでうまくいくはずです


32

1の代わりに01が必要な場合、次の方法でうまくいきました。

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



16

sprintf 必要なものです。

上記のリンクされたページからの編集(どういうわけか、賛成投票によって要求されました)のサンプルは、「ゼロが埋め込まれた整数」です。

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

3
単にsprintf()のmanページをリンクするだけではなく、例やもっと説明があればもっと良いでしょう。
jharrell 2014

13

簡単な答え

$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

入力番号が常に7桁または8桁の場合は、

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

私はいくつかのテストを実行し、これはと同じ速さ倍増するまでになることを得ますstr_padsprintf
入力の長さが任意である場合は、次を使用することもできます

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

これは他のものほど高速ではありませんが、またstr_padsprintfです。

ところで、私のテストでsprintfは、str_padます。すべてのテストはPHP 5.6で行いました。

編集:substrバージョンはまだ非常に高速であるように見えますが(PHP 7.2)、入力がパディングしたい長さよりも長くなる場合があるため、バージョンも壊れています。たとえば、3桁にパディングして、入力に4がある場合substr('0000' . '1234', -3) = '234'、最後の3桁になるだけです。


ありがとう、私はあなたのバリエーションが好きですが、それは$ str =(strlen($ input)<8)であるべきだと思いますか?0。$ input:$ input;
JMX 2016年

@JMX実際には、どちらの方法でも問題なく機能します。(私の行方不明の横に私$はちょうど修正しました)
AbcAeffchen

1

この単純な関数を作成して、このフォーマットを作成しました: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 

0
$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

-1

これは完全に機能します:

$number = 13246;
echo sprintf( '%08d', $number );

3
これは既存の回答の単なる繰り返しのようです。
パン

-1

タイプジャグリングはいつでも乱用できます。

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

10 ** pad > INT_MAXまたはの場合、これは期待どおりに機能しませんvalue >= 10 * pad


-2
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.