¿Imprime los primeros 0 en C?

344

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 / if para averiguar cuántos dígitos tiene 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 hacer esto con el sintaxis en formato printf que me está eludiendo.

zxcv
fuente

Respuestas:

567
printf("%05d", zipCode);

El 0indica con qué está rellenando y 5muestra la longitud del número entero. Por ejemplo, si usa "%02d"(Útil para fechas), esto solo rellenará ceros para los números en la columna de unidades, es decir (en 06lugar de 6). El ejemplo 2, "%03d"rellenaría 2 ceros para un número en la columna de las unidades y el relleno 1 cero para un número en la columna de las decenas. es decir. (número 7 acolchado 007y número 17 acolchado 017).

EvilTeach
fuente
237
No almacene códigos postales como números. Algunos países tienen letras en su código postal.
Sec
1
Para su caso, esto sería suficiente. ¿Cómo se pueden tener ceros a la izquierda en un número entero de longitud desconocida?
Dominic Motuka
Necesita saber la longitud máxima de la cadena final acolchada. Alternativamente, si siempre quiso 5 ceros iniciales, entonces "00000" + integer.to_s. etc
mlambie
160

La solución correcta es almacenar el código postal en la base de datos como un STRING. A pesar de que puede parecer un número, no lo es. Es un código, donde cada parte tiene significado.

Un número es algo en lo que haces aritmética. Un código postal no es eso.

James Curran
fuente
32
Ya Tu observación es absolutamente correcta. Eso es lo que hago. Sin embargo, la persona que hace la pregunta probablemente esté tratando de hacer la tarea, en lugar del código de producción. La respuesta debe adaptarse a la persona que hace la pregunta.
EvilTeach
15
Supongo que debería haberlo reformulado con mayor precisión para ilustrar que estaba buscando ver cómo puedo hacer los caracteres iniciales y finales en un idioma con el que no estaba familiarizado. ¡Tendré más cuidado con ejemplos arbitrarios en el futuro!
zxcv
3
Otros países, como Reino Unido tienen letras en códigos postales
jjxtra
47

Coloca un cero antes del ancho mínimo del campo:

printf("%05d",zipcode);
Adam Bellaire
fuente
16

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 de cadena / varchar para almacenarlo si en algún momento estaría enviando u obteniendo usuarios / clientes / clientes / etc. de otros países.

Sin embargo, en el caso general, debe usar la respuesta recomendada ( printf("%05d", number);).

JeeBee
fuente
16

Si está 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 las conversiones d, i, o, u, x, X, a, A, e, E, f, F, gy G, el valor convertido se rellena a la izquierda con ceros en lugar de espacios en blanco. Si aparecen las banderas 0 y -, se ignora la bandera 0. Si se proporciona una precisión con una conversión numérica (d, i, o, u, x y X), se ignora el indicador 0. Para otras conversiones, el comportamiento es indefinido.

Aunque la pregunta es para C, esta página puede ser de ayuda.

Paul Tomblin
fuente
1
¿Por qué se necesita el número 3?
eri0o
44
@Elric Si le da un argumento numérico al mancomando, lo reduce a esa sección en particular. Sin él, obtendrá la página de manual para el comando de shell en printflugar de la función C.
Paul Tomblin
14
sprintf(mystring, "%05d", myInt);

Aquí, "05" dice "use 5 dígitos con ceros a la izquierda".

Dan Hewett
fuente
6

printf permite varias opciones de formato.

ex:

printf("leading zeros %05d", 123);
Trent
fuente
3

Se ahorrará un montón de problemas (a largo plazo) si almacena un código postal como una cadena de caracteres, que es, en lugar de un número, que no lo es.

pro3carp3
fuente
Si tan solo alguien explicara cómo poner a cero una matriz de caracteres. Incluso hay una solución que usa atoi () para convertir el conjunto de caracteres en un init y luego usa% 05d. Espero que esta no sea la única solución.
Niko
0

Más flexible. Aquí hay un ejemplo de impresión de filas de números justificados a la derecha con anchos fijos y relleno de espacio.

//---- 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 los printfs sean más legibles.

rch
fuente
44
No estoy 100% seguro de su intención con la macro, pero parece que tenía la intención de definir una función, como #define FMT(x) (getFmt(8,x).c_str())(¡tenga en cuenta el parámetro x !), En lugar de una variable (que es lo que hace su código).
Ponkadoodle
0

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));
Brad Jennings
fuente