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?

Andrômeda
fonte

Respostas:

1213

Use sprintf:

sprintf('%08d', 1234567);

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

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

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

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

Este seria:

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

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

AbcAeffchen
fonte
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 
Enigma Plus
fonte
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
fonte
-1

Isso funciona perfeitamente:

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

jgmjgm
fonte
-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
fonte