Dígitos de pad cero en cadena

126

Necesito lanzar figuras individuales (1 a 9) a (01 a 09). Puedo pensar en una forma, pero es grande, fea y engorrosa. Estoy seguro de que debe haber alguna forma concisa. Alguna sugerencia

scunliffe
fuente

Respuestas:

214

En primer lugar, su descripción es engañosa. Doublees un tipo de datos de coma flotante. Es de suponer que desea rellenar sus dígitos con ceros a la izquierda en una cadena. El siguiente código hace eso:

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

Para obtener más información, consulte la documentación de sprintf.

Konrad Rudolph
fuente
@KonradRudolph Si he pasado como digitvalor como entero esa vez dado el error, si paso como cadena esa vez no hay problema
Hiren Bhut
@HirenBhut No. Estoy 100% seguro de que funciona. La documentación lo dice. Incluso lo probé solo para ti: gist.github.com/klmr/e1319f6d921a382e86296cce06eb7dbd
Konrad Rudolph
@KonradRudolph Por favor verifique este código gist.github.com/klmr/…
Hiren Bhut
3
@HirenBhut Bueno, eso es completamente diferente y no tiene nada que ver con esosprintf . Consulta el formato de los enteros , en particular la sección sobre dígitos octales.
Konrad Rudolph
@KonradRudolph Sí, ¿hay alguna solución posible?
Hiren Bhut
90

También hay 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
fuente
67

Solución usando str_pad :

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

Benchmark en php 5.3

Resultado str_pad: 0.286863088608

Sprint de resultado: 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
fuente
0

El rendimiento de str_paddepende en gran medida de la longitud del acolchado. Para una velocidad más constante, puede usar str_repeat .

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

También use el valor de cadena del número para un mejor rendimiento.

$number = strval(123);

Probado en 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
fuente