Formattazione di un numero con zeri iniziali in PHP


601

Ho una variabile che contiene il valore 1234567.

Vorrei che contenga esattamente 8 cifre, ad es 01234567.

Esiste una funzione PHP per questo?

Risposte:


1213

Utilizzare sprintf:

sprintf('%08d', 1234567);

In alternativa puoi anche usare str_pad:

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

54
Volevo solo aggiungere: str_pad non è un'opzione con numeri negativi
wtf8_decode

6
Solo per aggiungere in aggiunta a ciò che ha detto wtf8_decode; I numeri negativi non avrebbero zeri iniziali e non sono numeri positivi. cioè 08 verrebbe scritto come una data o qualcosa che si aspetta un numero a due cifre positivo (codice di ordinamento del conto bancario ecc.). Per favore, correggimi se sbaglio, ma per quanto ne so, non esiste un'istanza di vita reale che richiede uno zero iniziale su un valore negativo?
guyver4mk,

3
Volevo aggiungere che sprintf('%+03d:00 UTC',$i)dove $iè compreso tra -12 e 12, stamperà + o - secondo necessità e inserirà anche zeri iniziali per numeri inferiori a 2 cifre. Ottimo per creare un fuso orario SELECTin HTML.
Volomike

2
per la versione corrente (7.1) e precedenti sprintf( 3v4l.org/junvv/perf#output ) è un po 'più veloce di str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev il

Quando un numero negativo potrebbe richiedere uno zero iniziale ... Un contatore di decollo a tre cifre? T-010, T-009, T-008 ecc.
TRT 1968

83

Dato che il valore è in $ value:

  • Per fare eco:

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

  • Capirlo:

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

Questo dovrebbe fare il trucco


32

Quando ho bisogno di 01 anziché 1, per me ha funzionato:

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


19

Anche se non sono sicuro di cosa tu voglia fare, probabilmente stai cercando Sprintf .

Questo sarebbe:

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

16

sprintf è quello che ti serve.

EDIT (in qualche modo richiesto dai downvotes ), dalla pagina collegata sopra, ecco un esempio di "numeri interi con zero":

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

3
Sarebbe meglio con un esempio o più spiegazioni oltre al semplice collegamento della pagina man per sprintf ().
Jharrell,

13

Semplice risposta

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

Non sono sicuro di come interpretare il commento dicendo "Non sarà mai più di 8 cifre" e se si riferisce all'input o all'output. Se si riferisce all'output, è necessario disporre di una chiamata substr () aggiuntiva per tagliare la stringa.

Per tagliare le prime 8 cifre

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

Per tagliare le ultime 8 cifre

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

7

Se i numeri di input hanno sempre 7 o 8 cifre, puoi anche usare

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

Ho eseguito alcuni test e ho capito che questo sarebbe raddoppiato più velocemente di str_pado sprintf.
Se l'input può avere qualsiasi lunghezza, è possibile utilizzare anche

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

Questo non è veloce come l'altro, ma dovrebbe anche essere un po 'più veloce di str_pade sprintf.

Btw: Il mio test ha anche detto che sprintfè un po 'più veloce di str_pad. Ho effettuato tutti i test con PHP 5.6.

Modifica: anche se la substrversione sembra essere ancora molto veloce (PHP 7.2), si interrompe anche nel caso in cui l'input possa essere più lungo della lunghezza che si desidera pad. Ad esempio, vuoi passare a 3 cifre e il tuo input ha 4 cifre che substr('0000' . '1234', -3) = '234'comporteranno solo le ultime 3 cifre


Grazie, mi piace la tua variazione ma pensi che dovrebbe essere $ str = (strlen ($ input) <8)? 0 $ input: $ input;
JMX,

@JMX In effetti, entrambi i modi funzionano bene. (Oltre alla mia scomparsa $ho appena risolto)
AbcAeffchen

1

Ho scritto questa semplice funzione per produrre questo formato: 01:00:03

I secondi vengono sempre visualizzati (anche se zero). I minuti vengono visualizzati se maggiore di zero o se sono necessarie ore o giorni. Le ore vengono visualizzate se maggiore di zero o se sono richiesti giorni. I giorni vengono visualizzati se maggiore di zero.

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

Esempi:

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

Funziona perfettamente:

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

3
Questa sembra essere solo una ripetizione delle risposte esistenti.
Pang

-1

Puoi sempre abusare del tipo di giocoleria:

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

Questo non funzionerà come previsto se uno 10 ** pad > INT_MAXo 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.