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.
printf("%05d", zipCode);
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.
Vous placez un zéro avant la largeur minimale du champ:
printf("%05d",zipcode);
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);
).
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.
sprintf(mystring, "%05d", myInt);
Ici, "05" dit "utilisez 5 chiffres avec des zéros au début".
printf permet diverses options de formatage.
ex:
printf("leading zeros %05d", 123);
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.
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.
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));