2008-09-30 9 views
236

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á como 1001, ¿cuál es una buena manera de hacerlo?Imprimiendo los 0's principales en C?

Pensé en usar cualquiera de los enunciados de caso/si entonces para averiguar cuántos dígitos es el número y luego convertirlo en un arreglo de caracteres con 0 extra para imprimir, pero no puedo evitar pensar que puede haber una manera de haz esto con la sintaxis del formato printf que me elude.

Respuesta

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

+161

Por favor, no almacenan como números de códigos postales. Algunos países tienen letras en su código postal. – Sec

7

printf permite varias opciones de formato.

ejemplo:

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

Se coloca un cero antes de que el ancho de campo mínimo:

printf("%05d",zipcode); 
14

Si usted está en una máquina * NIX:

man 3 printf 

Esto le mostrará una Página de manual, similar a:

0 El valor debe ser cero acolchado. Para las conversiones d, i, o, u, x, X, a, A, e, E, f, F, gy G, el valor convertido se rellena en a la izquierda con ceros en lugar de espacios en blanco. Si aparecen los indicadores 0 y - , se ignora el indicador 0. Si se proporciona una precisión de con una conversión numérica (d, i, o, u, xy X), la bandera 0 es ignorada. Para otras conversiones, el comportamiento no está definido.

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

+0

¿por qué es necesario el número 3? – Elric

+1

@Elric Si le da un argumento numérico al comando 'man', lo reduce a esa sección en particular. Sin él, obtendrá la página man para el comando de shell 'printf' en lugar de la función C. –

11
sprintf(mystring, "%05d", myInt); 

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

138

La solución correcta es almacenar el código postal en la base de datos como STRING. 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 operación aritmética. Un código postal no es eso.

+19

Ya. Tu observación es absolutamente correcta. Eso es lo que hago. Sin embargo, la persona que hace la pregunta probablemente esté tratando de lidiar con la tarea, en lugar del código de producción. La respuesta debe adaptarse a la persona que hace la pregunta. – EvilTeach

+11

Supongo que debería haberlo reformulado con más precisión para ilustrar que estaba buscando ver cómo puedo hacer caracteres iniciales y finales en un idioma con el que no estaba familiarizado. ¡Seré más cuidadoso con ejemplos arbitrarios en el futuro! – zxcv

+1

Otros países, como el Reino Unido tienen letras en los códigos postales – jjxtra

16

El código postal es un campo muy 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);).

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, lo que no es.

0

Más flexible .. Aquí hay un ejemplo de filas de impresión de números justificados a la derecha con anchos fijos y espaciado 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 el macro están diseñados para que los printfs sean más legibles.

+2

No estoy 100% seguro de su intención con la macro, pero parece que quería definir una función, como '#define FMT (x) (getFmt (8, x) .c_str()) '(tenga en cuenta el parámetro * x *!), a diferencia 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 matriz de caracteres [], puede utilizar esto:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode)); 
Cuestiones relacionadas