web-dev-qa-db-fra.com

Imprimer les premiers 0 en C?

J'essaie de trouver un bon moyen d'imprimer les 0 premiers, tels que 01001 pour un code postal. Alors que le nombre serait stocké comme 1001, quel est le bon moyen de le faire?

J'ai pensé utiliser l'un ou l'autre cas/if pour déterminer le nombre de chiffres puis le convertir en tableau de caractères avec des caractères supplémentaires pour l'impression, mais je ne peux m'empêcher de penser qu'il peut y avoir un moyen de le faire avec le La syntaxe de format printf qui m’échappe.

311
zxcv
printf("%05d", zipCode);
524
EvilTeach

La bonne solution consiste à stocker le code postal dans la base de données en tant que chaîne. Malgré le fait que cela puisse ressembler à un chiffre, ce n'est pas le cas. C'est un code, où chaque partie a une signification.

Un nombre est une chose sur laquelle vous faites de l'arithmétique. Un code postal n'est pas ça.

156
James Curran

Vous placez un zéro avant la largeur minimale du champ:

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

Le code postal est un champ très localisé. De nombreux pays ont des caractères dans leurs codes postaux, par exemple Royaume-Uni, Canada. Par conséquent, dans cet exemple, vous devez utiliser un champ string/varchar pour le stocker si, à un moment quelconque, vous expédiez ou obtenez des utilisateurs/clients/clients/etc. d'autres pays.

Cependant, dans le cas général, vous devez utiliser la réponse recommandée (printf("%05d", number);).

16
JeeBee

Si vous êtes sur une machine * NIX:

man 3 printf

Cela montrera une page de manuel, semblable à:

0 La valeur doit être remplie à zéro. Pour les conversions d, i, o, u, x, x, a, e, e, e, f, f, g et g, la valeur convertie est complétée à gauche par des zéros plutôt que par des blancs. Si les drapeaux 0 et - apparaissent tous les deux, le drapeau 0 est ignoré. Si une précision est donnée avec une conversion numérique (d, i, o, u, x et X), l'indicateur 0 est ignoré. Pour les autres conversions, le comportement est indéfini.

Même si la question est pour C, this page peut être utile.

15
Paul Tomblin
sprintf(mystring, "%05d", myInt);

Ici, "05" dit "utilisez 5 chiffres avec des zéros au début".

14
Dan Hewett

printf permet diverses options de formatage.

ex:

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

Vous vous épargnerez beaucoup de problèmes (à long terme) si vous stockez un code postal sous la forme d'une chaîne de caractères, ce qui est le cas, plutôt que d'un nombre, ce qui n'est pas le cas.

3
pro3carp3

Plus de flexibilité. Voici un exemple d'impression de lignes de nombres justifiés à droite de largeur fixe et d'espacement.

//---- 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 fonction et la macro sont conçues pour que les printfs soient plus lisibles.

0
rch

Si vous avez besoin de stocker le code postal dans un code postal de tableau de caractères [], vous pouvez utiliser ceci:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
0
Brad Jennings