Dígitos de zero-pad na string

126

Preciso lançar figuras individuais (1 a 9) para (01 a 09). Eu posso pensar em uma maneira, mas é grande, feia e pesada. Tenho certeza de que deve haver uma maneira concisa. Alguma sugestão

Scunliffe
fonte

Respostas:

214

Em primeiro lugar, sua descrição é enganosa. Doubleé um tipo de dados de ponto flutuante. Você provavelmente deseja preencher seus dígitos com zeros à esquerda em uma string. O código a seguir faz isso:

$s = sprintf('%02d', $digit);

Para obter mais informações, consulte a documentação de sprintf.

Konrad Rudolph
fonte
@KonradRudolph Se eu passar como digitvalor inteiro naquele tempo dado o erro, Se passar como string naquele tempo não há problema
Hiren Bhut
@HirenBhut Não. Tenho 100% de certeza de que funciona. A documentação diz isso. Eu até testei só para você: gist.github.com/klmr/e1319f6d921a382e86296cce06eb7dbd
Konrad Rudolph
@KonradRudolph Verifique este código gist.github.com/klmr/…
Hiren Bhut
3
@HirenBhut Bem, isso é completamente diferente e não tem nada a ver com issosprintf . Verifique o formato dos inteiros , em particular a seção sobre dígitos octais.
Konrad Rudolph
@KonradRudolph Sim, existe alguma solução possível?
Hiren Bhut
90

Também há str_pad

<?php
$input = "Alien";
echo str_pad($input, 10);                      // produces "Alien     "
echo str_pad($input, 10, "-=", STR_PAD_LEFT);  // produces "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH);   // produces "__Alien___"
echo str_pad($input, 6 , "___");               // produces "Alien_"
?>
LeppyR64
fonte
67

Solução usando str_pad :

str_pad($digit,2,'0',STR_PAD_LEFT);

Referência em php 5.3

Resultado str_pad: 0,286863088608

Resultado sprintf: 0,234171152115

Código:

$start = microtime(true);
for ($i=0;$i<100000;$i++) {
    str_pad(9,2,'0',STR_PAD_LEFT);
    str_pad(15,2,'0',STR_PAD_LEFT);
    str_pad(100,2,'0',STR_PAD_LEFT);
}
$end = microtime(true);
echo "Result str_pad : ",($end-$start),"\n";

$start = microtime(true);
for ($i=0;$i<100000;$i++) {
    sprintf("%02d", 9);
    sprintf("%02d", 15);
    sprintf("%02d", 100);
}
$end = microtime(true);
echo "Result sprintf : ",($end-$start),"\n";
Alex
fonte
0

O desempenho de str_paddepende muito do comprimento do enchimento. Para uma velocidade mais consistente, você pode usar str_repeat .

$padded_string = str_repeat("0", $length-strlen($number)) . $number;

Use também o valor da string do número para melhor desempenho.

$number = strval(123);

Testado em PHP 7.4

str_repeat: 0.086055040359497   (number: 123, padding: 1)
str_repeat: 0.085798978805542   (number: 123, padding: 3)
str_repeat: 0.085641145706177   (number: 123, padding: 10)
str_repeat: 0.091305017471313   (number: 123, padding: 100)

str_pad:    0.086184978485107   (number: 123, padding: 1)
str_pad:    0.096981048583984   (number: 123, padding: 3)
str_pad:    0.14874792098999    (number: 123, padding: 10)
str_pad:    0.85979700088501    (number: 123, padding: 100)
Cray
fonte