Pregunta
Estoy tratando de encontrar una buena manera de imprimir los primeros 0, como 01001 para un código postal. Si bien el número se almacenaría como 1001, ¿cuál es una buena manera de hacerlo?
Pensé en usar cualquiera de las declaraciones de caso / si entonces para averiguar cuántos dígitos es el número y luego convertirlo en una matriz de caracteres con 0 adicionales para imprimir, pero no puedo evitar pensar que puede haber una manera de hacerlo esto con la sintaxis del formato printf que me está eludiendo.
Solución
printf("%05d", zipCode);
Otros consejos
La solución correcta es almacenar el código postal en la base de datos como una CADENA. A pesar de que puede parecer un número, no lo es. Es un código, donde cada parte tiene un significado.
Un número es una cosa en la que haces aritmética. Un código postal no es eso.
Coloca un cero antes del ancho de campo mínimo:
printf("%05d",zipcode);
El código postal es un campo altamente localizado, muchos países tienen caracteres en sus códigos postales, por ejemplo, Reino Unido, Canadá. Por lo tanto, en este ejemplo, debe usar un campo string / varchar para almacenarlo si en algún momento enviaría o conseguiría usuarios / clientes / clientes / etc de otros países.
Sin embargo, en el caso general, debe usar la respuesta recomendada ( printf ("% 05d " ;, número);
).
Si estás en una máquina * NIX:
man 3 printf
Esto mostrará una página de manual, similar a:
0 El valor debe estar rellenado con cero. Para d, i, o, u, x, X, a, A, e, Conversiones E, f, F, g y G, el valor convertido se rellena en la izquierda con ceros en lugar de espacios en blanco. Si las banderas 0 y - ambos aparecen, la bandera 0 se ignora. Si se da una precisión. con una conversión numérica (d, i, o, u, xy X), el indicador 0 es ignorado Para otras conversiones, el comportamiento no está definido.
Aunque la pregunta es para C, esta página puede ser de ayuda.
sprintf(mystring, "%05d", myInt);
Aquí, " 05 " dice "usar 5 dígitos con ceros a la izquierda" #
printf permite varias opciones de formato.
ej:
printf("leading zeros %05d", 123);
Te ahorrarás un montón de problemas (a largo plazo) si almacenas un código postal como una cadena de caracteres, que es, en lugar de un número, que no es.
Más flexible .. Aquí hay un ejemplo de impresión de filas de números justificados a la derecha con anchos fijos y espacio de relleno.
//---- Header
std::string getFmt ( int wid, long val )
{
char buf[64];
sprintf ( buf, "% *ld", wid, val );
return buf;
}
#define FMT (getFmt(8,x).c_str())
//---- Put to use
printf ( " COUNT USED FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );
//-------- Output
COUNT USED FREE
A: 354 148523 3283
B: 54138259 12392759 200391
C: 91239 3281 61423
La función y la macro están diseñadas para que las impresoras sean más legibles.
Si necesita almacenar el código postal en un código postal de matriz de caracteres [], puede usar esto:
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));