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?

Andromeda
quelle

Antworten:

1212

Verwendung sprintf:

sprintf('%08d', 1234567);

Alternativ können Sie auch verwenden str_pad:

str_pad($value, 8, '0', STR_PAD_LEFT);
reko_t
quelle
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

Kaze no Koe
quelle
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);
Md. Shafiqur Rahman
quelle
27
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
joan16v
quelle
19

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

Das wäre:

$value = sprintf( '%08d', 1234567 );
Huppie
quelle
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);
?>

quelle
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);
Peter Lindqvist
quelle
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

AbcAeffchen
quelle
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 
Enigma Plus
quelle
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
Rutvik kakadiya
quelle
-1

Das funktioniert perfekt:

$number = 13246;
echo sprintf( '%08d', $number );
CZ Arbeiter
quelle
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.

jgmjgm
quelle
-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
Anand Kumar Prajapati
quelle