Formatear un número con ceros a la izquierda en PHP


601

Tengo una variable que contiene el valor 1234567.

Me gustaría que contenga exactamente 8 dígitos, es decir 01234567.

¿Hay una función PHP para eso?

Respuestas:


1214

Uso sprintf:

sprintf('%08d', 1234567);

Alternativamente, también puede usar str_pad:

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

54
Solo quería agregar: str_pad no es una opción con números negativos
wtf8_decode

66
Solo para agregar encima de lo que dijo wtf8_decode; Los números negativos no tendrían ceros a la izquierda, y no son números positivos. es decir, 08 se escribiría como una fecha, o algo que espera un número positivo de dos dígitos (código de clasificación de cuenta bancaria, etc.). Por favor, corríjame si me equivoco, pero que yo sepa, ¿no hay una instancia de la vida real de requerir un cero inicial en un valor negativo?
guyver4mk

3
Quería agregar que sprintf('%+03d:00 UTC',$i)donde $iestá -12 a 12, imprimirá + o - según sea necesario, y también pondrá ceros a la izquierda para números de menos de 2 dígitos. Genial para hacer una zona horaria SELECTen HTML.
Volomike

2
para la versión actual (7.1) y versiones anterioressprintf ( 3v4l.org/junvv/perf#output ) es un poco más rápido que str_pad( 3v4l.org/cliNP/perf#output )
Vladyslav Startsev

¿Cuándo podría un número negativo requerir un cero a la izquierda ... Un contador de despegue con tres dígitos? T-010, T-009, T-008 etc.
TRT 1968

83

Dado que el valor está en $ value:

  • Para repetirlo:

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

  • Para conseguirlo:

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

Eso debería hacer el truco


32

Cuando necesito 01 en lugar de 1, lo siguiente funcionó para mí:

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


19

Aunque no estoy realmente seguro de lo que quieres hacer, probablemente estés buscando sprintf .

Esto sería:

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

16

sprintf es lo que necesitas

EDITAR (de alguna manera solicitado por los votos negativos ), desde la página vinculada anteriormente, aquí hay una muestra de "enteros rellenos con ceros":

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

3
Sería mejor con un ejemplo o más explicación más allá de simplemente vincular la página de manual para sprintf ().
jharrell

13

Respuesta simple

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

No estoy seguro de cómo interpretar el comentario diciendo "Nunca tendrá más de 8 dígitos" y si se refiere a la entrada o la salida. Si se refiere a la salida, tendría que tener una llamada substr () adicional para recortar la cadena.

Para recortar los primeros 8 dígitos

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

Para recortar los últimos 8 dígitos

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

7

Si los números de entrada siempre tienen 7 u 8 dígitos, también puede usar

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

Realicé algunas pruebas y descubrí que esto sería el doble de rápido str_pado sprintf.
Si la entrada puede tener cualquier longitud, entonces también podría usar

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

Esto no es tan rápido como el otro, pero también debería ser un poco más rápido que str_pady sprintf.

Por cierto: mi prueba también dijo que sprintfes un poco más rápido questr_pad . Hice todas las pruebas con PHP 5.6.

Editar: aunque la substrversión parece ser aún muy rápida (PHP 7.2), también está rota en caso de que su entrada pueda ser más larga que la longitud que desea rellenar. Por ejemplo, desea rellenar con 3 dígitos y su entrada tiene 4 que substr('0000' . '1234', -3) = '234'solo darán como resultado los últimos 3 dígitos


Gracias, me gusta su variación, pero creo que debería ser $ str = (strlen ($ input) <8)? 0. $ input: $ input;
JMX

@JMX De hecho, ambas formas funcionan bien. (Además de mi falta $, acabo de arreglarlo)
AbcAeffchen

1

Escribí esta función simple para producir este formato: 01:00:03

Los segundos siempre se muestran (incluso si son cero). Los minutos se muestran si son mayores que cero o si se requieren horas o días. Las horas se muestran si son mayores que cero o si se requieren días. Los días se muestran si son mayores que cero.

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

Ejemplos:

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

Esto funciona perfectamente:

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

3
Esto parece ser solo una repetición de las respuestas existentes.
Pang

-1

Siempre puedes abusar del malabarismo de tipos:

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

Esto no funcionará como se esperaba si 10 ** pad > INT_MAXo bien 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.