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.
EDITAR (de alguna manera solicitado por los votos negativos ), desde la página vinculada anteriormente, aquí hay una muestra de "enteros rellenos con ceros":
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.
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.
sprintf('%+03d:00 UTC',$i)
donde$i
está -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 horariaSELECT
en HTML.sprintf
( 3v4l.org/junvv/perf#output ) es un poco más rápido questr_pad
( 3v4l.org/cliNP/perf#output )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
fuente
Cuando necesito 01 en lugar de 1, lo siguiente funcionó para mí:
fuente
fuente
Aunque no estoy realmente seguro de lo que quieres hacer, probablemente estés buscando sprintf .
Esto sería:
fuente
sprintf
es lo que necesitasEDITAR (de alguna manera solicitado por los votos negativos ), desde la página vinculada anteriormente, aquí hay una muestra de "enteros rellenos con ceros":
fuente
Respuesta simple
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
Para recortar los últimos 8 dígitos
fuente
Si los números de entrada siempre tienen 7 u 8 dígitos, también puede usar
Realicé algunas pruebas y descubrí que esto sería el doble de rápido
str_pad
osprintf
.Si la entrada puede tener cualquier longitud, entonces también podría usar
Esto no es tan rápido como el otro, pero también debería ser un poco más rápido que
str_pad
ysprintf
.Por cierto: mi prueba también dijo que
sprintf
es un poco más rápido questr_pad
. Hice todas las pruebas con PHP 5.6.Editar: aunque la
substr
versió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 quesubstr('0000' . '1234', -3) = '234'
solo darán como resultado los últimos 3 dígitosfuente
$
, acabo de arreglarlo)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.
Ejemplos:
fuente
fuente
Esto funciona perfectamente:
fuente
Siempre puedes abusar del malabarismo de tipos:
Esto no funcionará como se esperaba si
10 ** pad > INT_MAX
o bienvalue >= 10 * pad
.fuente
fuente