Formatieren einer Zahl mit führenden Nullen in PHP


600

Ich habe eine Variable, die den Wert enthält 1234567.

Ich möchte, dass es genau 8 Ziffern enthält, dh 01234567.

Gibt es dafür eine PHP-Funktion?

Antworten:


1212

Verwendung sprintf:

sprintf('%08d', 1234567);

Alternativ können Sie auch verwenden str_pad:

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

54
Ich wollte nur hinzufügen: str_pad ist keine Option mit negativen Zahlen
wtf8_decode

6
Nur um das zu ergänzen, was wtf8_decode gesagt hat; Negative Zahlen hätten keine führenden Nullen und sie sind keine positiven Zahlen. dh 08 wird als solches geschrieben oder als etwas, das eine positive zweistellige Zahl erwartet (Bankkontosortiercode usw.). Bitte korrigieren Sie mich, wenn ich falsch liege, aber soweit ich weiß, gibt es keinen realen Fall, in dem eine führende Null für einen negativen Wert erforderlich ist.
guyver4mk

3
Wollte hinzufügen, dass, sprintf('%+03d:00 UTC',$i)wo $i-12 bis 12 ist, + oder - nach Bedarf druckt und auch führende Nullen für Zahlen mit weniger als 2 Ziffern setzt. Ideal zum Erstellen einer Zeitzone SELECTin HTML.
Volomike

2
für die aktuelle Version (7.1) und niedriger sprintf( 3v4l.org/junvv/perf#output ) ist ein bisschen schneller als str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Wann könnte eine negative Zahl eine führende Null erfordern ... Ein dreistelliger Abhebezähler? T-010, T-009, T-008 usw.
TRT 1968,

83

Vorausgesetzt, der Wert ist in $ value:

  • Um es zu wiederholen:

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

  • Es bekommen:

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

Das sollte den Trick machen


32

Wenn ich 01 anstelle von 1 benötige, hat Folgendes für mich funktioniert:

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


19

Obwohl ich nicht sicher bin, was Sie tun möchten, suchen Sie wahrscheinlich nach Sprintf .

Das wäre:

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

16

sprintf ist was du brauchst.

EDIT ( irgendwie von den Downvotes angefordert ), von der oben verlinkten Seite, hier ein Beispiel "Null-aufgefüllte Ganzzahlen":

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

3
Wäre besser mit einem Beispiel oder mehr Erklärungen, als nur die Manpage für sprintf () zu verlinken.
Jharrell

13

Einfache Antwort

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

Ich bin mir nicht sicher, wie ich den Kommentar "Es wird nie mehr als 8 Stellen haben" interpretieren soll und ob er sich auf die Eingabe oder die Ausgabe bezieht. Wenn es sich auf die Ausgabe bezieht, müssten Sie einen zusätzlichen Aufruf von substr () haben, um die Zeichenfolge zu beschneiden.

Zum Abschneiden der ersten 8 Ziffern

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

Zum Abschneiden der letzten 8 Ziffern

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

7

Wenn die Eingabenummern immer 7 oder 8 Stellen haben, können Sie auch verwenden

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

Ich habe einige Tests durchgeführt und festgestellt, dass dies doppelt so schnell sein würde wie str_padoder sprintf.
Wenn die Eingabe eine beliebige Länge haben kann, können Sie sie auch verwenden

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

Dies ist nicht so schnell wie das andere, sollte aber auch etwas schneller sein als str_padund sprintf.

Übrigens: Mein Test hat auch gesagt, dass sprintfdas etwas schneller ist als str_pad. Ich habe alle Tests mit PHP 5.6 gemacht.

Bearbeiten: Obwohl die substrVersion immer noch sehr schnell zu sein scheint (PHP 7.2), ist sie auch fehlerhaft , falls Ihre Eingabe länger sein kann als die Länge, auf die Sie auffüllen möchten. Sie möchten beispielsweise 3 Stellen auffüllen und Ihre Eingabe hat 4 Stellen, substr('0000' . '1234', -3) = '234'die nur die letzten 3 Stellen ergeben


Danke, ich mag deine Variation, aber denke, es sollte $ str = (strlen ($ input) <8) sein? 0. $ input: $ input;
JMX

@JMX In der Tat funktionieren beide Möglichkeiten gut. (Neben meinem Vermissten habe $ich gerade behoben)
AbcAeffchen

1

Ich habe diese einfache Funktion geschrieben, um dieses Format zu erzeugen: 01:00:03

Sekunden werden immer angezeigt (auch wenn Null). Minuten werden angezeigt, wenn sie größer als Null sind oder wenn Stunden oder Tage erforderlich sind. Stunden werden angezeigt, wenn sie größer als Null sind oder wenn Tage erforderlich sind. Tage werden angezeigt, wenn sie größer als Null sind.

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

Beispiele:

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

Das funktioniert perfekt:

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

3
Dies scheint nur eine Wiederholung der vorhandenen Antworten zu sein.
Pang

-1

Sie können das Jonglieren immer missbrauchen:

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

Dies funktioniert nicht wie erwartet, wenn entweder 10 ** pad > INT_MAXoder 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.