¿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.

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).


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.


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


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);).


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.


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".


6

printf permite varias opciones de formato.

ex:

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

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.


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.


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));
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.