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?

Andrómeda
fuente

Respuestas:

1214

Uso sprintf:

sprintf('%08d', 1234567);

Alternativamente, también puede usar str_pad:

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

Kaze no Koe
fuente
32

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

$number = 1;
$number = str_pad($number, 2, '0', STR_PAD_LEFT);
MD Shafiqur Rahman
fuente
27
echo str_pad("1234567", 8, '0', STR_PAD_LEFT);
joan16v
fuente
19

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

Esto sería:

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

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

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

Esto funciona perfectamente:

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

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