Impression de 0 en C?

345

J'essaie de trouver un bon moyen d'imprimer les 0 en tête, comme 01001 pour un code postal. Bien que le numéro soit stocké sous la forme 1001, quelle est la bonne façon de procéder?

J'ai pensé à utiliser l'une ou l'autre des déclarations de cas / if pour déterminer le nombre de chiffres, puis le convertir en un tableau de caractères avec des 0 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 syntaxe du format printf qui m'échappe.

zxcv
la source

Réponses:

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

Le 0indique avec quoi vous remplissez et le 5indique la longueur du nombre entier. Par exemple, si vous utilisez "%02d"(Utile pour les dates), cela ne remplit que des zéros pour les nombres dans la colonne des uns, c'est-à-dire ( 06au lieu de 6). Exemple 2, "%03d"remplirait 2 zéros pour un nombre dans la colonne des et le tampon 1 zéro pour un nombre dans la colonne des dizaines. c'est à dire. (numéro 7 rembourré 007et numéro 17 rembourré 017).

EvilTeach
la source
238
Veuillez ne pas stocker les codes postaux sous forme de nombres. Certains pays ont des lettres dans leur code postal.
Sec
1
Pour votre cas, cela suffirait. Comment peut-on avoir des zéros non significatifs dans un entier de longueur inconnue?
Dominic Motuka
Vous devez connaître la longueur maximale de la chaîne rembourrée finale. Alternativement, si vous avez toujours voulu 5 zéros en tête, alors "00000" + entier.to_s. etc
mlambie
160

La bonne solution consiste à stocker le code postal dans la base de données en tant que STRING. Malgré le fait qu'il puisse ressembler à un nombre, ce n'est pas le cas. C'est un code, où chaque partie a un sens.

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

James Curran
la source
32
Ouais. Votre observation est absolument correcte. Voilà ce que je fais. Cependant, la personne qui pose la question essaie probablement de s'occuper des devoirs plutôt que du code de production. La réponse doit être adaptée à la personne qui pose la question.
EvilTeach
15
Je suppose que j'aurais dû le reformuler plus précisément pour illustrer que je cherchais à voir comment je peux faire des caractères principaux et suivis dans une langue que je ne connaissais pas. Je serai plus prudent avec des exemples arbitraires à l'avenir!
zxcv
3
D'autres pays, comme le Royaume-Uni, ont des lettres dans les codes postaux
jjxtra
47

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

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

Le code postal est un champ très localisé, de nombreux pays ont des caractères dans leurs codes postaux, par exemple le Royaume-Uni et le Canada. Par conséquent, dans cet exemple, vous devez utiliser un champ chaîne / varchar pour le stocker si, à tout moment, 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);).

JeeBee
la source
16

Si vous êtes sur une machine * NIX:

man 3 printf

Cela affichera une page de manuel, semblable à:

0 La valeur doit être complétée par zéro. Pour les conversions d, i, o, u, x, X, a, A, e, E, f, F, g et G, la valeur convertie est complétée à gauche avec des zéros plutôt que 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 n'est pas défini.

Même si la question s'adresse à C, cette page peut être utile.

Paul Tomblin
la source
1
pourquoi le numéro 3 est-il nécessaire?
eri0o
4
@Elric Si vous donnez un argument numérique à la mancommande, il le restreint à cette section particulière. Sans cela, vous obtiendrez la page de manuel de la commande shell printfau lieu de la fonction C.
Paul Tomblin
14
sprintf(mystring, "%05d", myInt);

Ici, "05" dit "utilisez 5 chiffres avec des zéros non significatifs".

Dan Hewett
la source
6

printf permet diverses options de formatage.

ex:

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

Vous vous épargnerez un tas de problèmes (à long terme) si vous stockez un code postal sous forme de chaîne de caractères, ce qu'il est, plutôt qu'un nombre, ce qu'il n'est pas.

pro3carp3
la source
Si seulement quelqu'un pouvait expliquer comment mettre à zéro un tableau de caractères. Il existe même une solution qui utilise atoi () pour transformer le tableau char en init puis utiliser% 05d. J'espère que ce n'est pas la seule solution.
Niko
0

Plus flexible. Voici un exemple d'impression de lignes de nombres justifiés à droite avec des largeurs fixes et un espace.

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

rch
la source
4
Je ne suis pas sûr à 100% de votre intention avec la macro, mais il semble que vous vouliez définir une fonction, comme #define FMT(x) (getFmt(8,x).c_str())(notez le paramètre x !), Par opposition à une variable (ce que fait votre code).
Ponkadoodle
0

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

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