Formatage d'un nombre avec des zéros non significatifs en PHP


601

J'ai une variable qui contient la valeur 1234567.

Je voudrais qu'il contienne exactement 8 chiffres, c'est-à-dire 01234567.

Existe-t-il une fonction PHP pour cela?

Réponses:


1214

Utilisation sprintf:

sprintf('%08d', 1234567);

Alternativement, vous pouvez également utiliser str_pad:

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

54
Je voulais juste ajouter: str_pad n'est pas une option avec des nombres négatifs
wtf8_decode

6
Juste pour ajouter ce que wtf8_decode a dit; Les nombres négatifs n'auraient pas de zéros en tête et ce ne sont pas des nombres positifs. c'est-à-dire que 08 serait écrit comme une date, ou quelque chose qui attend un nombre positif à deux chiffres (code de tri du compte bancaire, etc.). Veuillez me corriger si je me trompe, mais pour autant que je sache, il n'y a pas d'exemple réel d'exiger un zéro de tête sur une valeur négative?
guyver4mk

3
Je voulais ajouter que sprintf('%+03d:00 UTC',$i)$iest -12 à 12, imprimera + ou - selon les besoins, et mettra également des zéros de tête pour les nombres de moins de 2 chiffres. Idéal pour créer un fuseau horaire SELECTen HTML.
Volomike

2
pour la version actuelle (7.1) et inférieure sprintf( 3v4l.org/junvv/perf#output ) est un peu plus rapide que str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Quand un nombre négatif peut-il nécessiter un zéro non significatif ... Un compteur de décollage à trois chiffres? T-010, T-009, T-008 etc.
TRT 1968

83

Étant donné que la valeur est en $ value:

  • Pour en faire écho:

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

  • Pour l'obtenir:

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

Cela devrait faire l'affaire


32

Lorsque j'ai besoin de 01 au lieu de 1, les éléments suivants ont fonctionné pour moi:

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


19

Bien que je ne sois pas vraiment sûr de ce que vous voulez faire, vous recherchez probablement un sprintf .

Ce serait:

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

16

sprintf est ce dont vous avez besoin.

EDIT (en quelque sorte demandé par les votes négatifs ), à partir de la page liée ci-dessus, voici un exemple de "nombres entiers à remplissage nul":

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

3
Ce serait mieux avec un exemple ou plus d'explications au-delà de simplement lier la page de manuel de sprintf ().
jharrell

13

Réponse simple

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

Je ne sais pas comment interpréter le commentaire en disant "il ne sera jamais plus de 8 chiffres" et s'il fait référence à l'entrée ou à la sortie. S'il fait référence à la sortie, vous devrez avoir un appel substr () supplémentaire pour couper la chaîne.

Pour découper les 8 premiers chiffres

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

Pour couper les 8 derniers chiffres

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

7

Si les numéros d'entrée ont toujours 7 ou 8 chiffres, vous pouvez également utiliser

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

J'ai effectué quelques tests et je me suis rendu compte que cela doublerait aussi vite que str_pador sprintf.
Si l'entrée peut avoir n'importe quelle longueur, vous pouvez également utiliser

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

Ce n'est pas aussi rapide que l'autre, mais devrait également être un peu plus rapide que str_padet sprintf.

Btw: Mon test a également dit que sprintfc'est un peu plus rapide que str_pad. J'ai fait tous les tests avec PHP 5.6.

Edit: Bien que la substrversion semble être encore très rapide (PHP 7.2), elle est également cassée au cas où votre entrée pourrait être plus longue que la longueur à laquelle vous souhaitez effectuer le remplissage. Par exemple, vous voulez remplir à 3 chiffres et votre entrée a 4 que substr('0000' . '1234', -3) = '234'ne résultera que dans les 3 derniers chiffres


Merci, j'aime votre variation mais pensez que ce devrait être $ str = (strlen ($ input) <8)? 0. $ input: $ input;
JMX

@JMX En fait, les deux méthodes fonctionnent bien. (À côté de mes disparus, $je viens de
corriger

1

J'ai écrit cette fonction simple pour produire ce format: 01:00:03

Les secondes sont toujours affichées (même si elles sont nulles). Les minutes sont affichées si elles sont supérieures à zéro ou si des heures ou des jours sont nécessaires. Les heures sont affichées si supérieures à zéro ou si des jours sont nécessaires. Les jours sont affichés s'ils sont supérieurs à zéro.

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

Exemples:

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

Cela fonctionne parfaitement:

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

3
Cela semble être juste une répétition des réponses existantes.
Pang

-1

Vous pouvez toujours abuser du jonglage de type:

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

Cela ne fonctionnera pas comme prévu si 10 ** pad > INT_MAXou 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.