Formatando um número com zeros à esquerda no PHP


601

Eu tenho uma variável que contém o valor 1234567.

Eu gostaria que ele contenha exatamente 8 dígitos, ou seja 01234567.

Existe uma função PHP para isso?

Respostas:


1213

Use sprintf:

sprintf('%08d', 1234567);

Como alternativa, você também pode usar str_pad:

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

54
Só queria adicionar: str_pad não é uma opção com números negativos
wtf8_decode 12/01

6
Apenas para adicionar o que o wtf8_decode disse; Números negativos não teriam zeros à esquerda e não são números positivos. por exemplo, 08 seria escrito como uma data ou algo que espera um número positivo de dois dígitos (código de classificação da conta bancária, etc.). Por favor, corrija-me se eu estiver errado, mas, tanto quanto eu sei, não existe um exemplo da vida real de exigir um zero inicial com um valor negativo?
guyver4mk

3
Queria acrescentar que sprintf('%+03d:00 UTC',$i)onde $ié -12 a 12, será impressa + ou - conforme a necessidade, e também irá colocar zeros à esquerda para números menos de 2 dígitos. Ótimo para criar um fuso horário SELECTem HTML.
Volomike

2
para a versão atual (7.1) e menor sprintf( 3v4l.org/junvv/perf#output ) é um pouco mais rápido do que str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

Quando um número negativo pode exigir um zero à esquerda ... Um contador de três dígitos? T-010, T-009, T-008 etc.
TRT 1968 06/03/19

83

Dado que o valor está em $ value:

  • Para fazer eco:

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

  • Para obtê-la:

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

Isso deve fazer o truque


32

Quando preciso de 01 em vez de 1, o seguinte funcionou para mim:

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


19

Embora eu não tenha muita certeza do que você quer fazer, provavelmente está procurando o sprintf .

Este seria:

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

16

sprintf é o que você precisa.

EDIT (de alguma forma solicitado pelos votos negativos ), na página vinculada acima, aqui está um exemplo de "números inteiros preenchidos com zero":

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

3
Seria melhor com um exemplo ou mais explicação além de simplesmente vincular a página de manual para sprintf ().
precisa saber é o seguinte

13

Resposta simples

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

Não sei como interpretar o comentário dizendo "Ele nunca terá mais de 8 dígitos" e se está se referindo à entrada ou à saída. Se se referir à saída, você precisaria ter uma chamada substr () adicional para cortar a string.

Para recortar os 8 primeiros dígitos

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

Para recortar os últimos 8 dígitos

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

7

Se os números de entrada sempre tiverem 7 ou 8 dígitos, você também poderá usar

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

Fiz alguns testes e concluí que isso seria o dobro do mais rápido que str_padou sprintf.
Se a entrada puder ter algum comprimento, você também poderá usar

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

Isso não é tão rápido quanto o outro, mas também deve ser um pouco mais rápido que str_padesprintf .

Btw: Meu teste também disse que sprintfé um pouco mais rápido questr_pad . Fiz todos os testes com o PHP 5.6.

Edit: Embora a substrversão pareça ainda ser muito rápida (PHP 7.2), ela também está corrompida caso sua entrada possa ser maior que o comprimento que você deseja usar. Por exemplo, você deseja preencher com 3 dígitos e sua entrada possui 4 que substr('0000' . '1234', -3) = '234'resultarão apenas nos últimos 3 dígitos


Obrigado, eu gosto da sua variação, mas acho que deve ser $ str = (strlen ($ input) <8)? 0 $ input: $ input;
JMX #

@JMX De fato, ambas as formas funcionam bem. (Ao lado de minha falta $Eu apenas fixo)
AbcAeffchen

1

Eu escrevi esta função simples para produzir este formato: 01:00:03

Segundos são sempre mostrados (mesmo que zero). Os minutos são mostrados se for maior que zero ou se forem necessárias horas ou dias. As horas são mostradas se maior que zero ou se forem necessários dias. Os dias são mostrados se maiores que 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

Exemplos:

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

Isso funciona perfeitamente:

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

3
Isso parece ser apenas uma repetição das respostas existentes.
Pang

-1

Você sempre pode abusar do malabarismo de tipos:

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

Isso não funcionará conforme o esperado, se é 10 ** pad > INT_MAXou não 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.