Bonjour, je ne trouve plus comme on fait pour afficher un chiffre en un nombre de caracteres constant (1 devient 001, 2 devient 002...).
J'ai essayé %3d mais ça met des espaces au lieu des 0.
Merci
Version imprimable
Bonjour, je ne trouve plus comme on fait pour afficher un chiffre en un nombre de caracteres constant (1 devient 001, 2 devient 002...).
J'ai essayé %3d mais ça met des espaces au lieu des 0.
Merci
et %03d ?
%.3d
Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?
Pour compléter, .3 n'affichera pas mal un float, il l'affichera différemment. S'il veut avoir le même comportement (taille de 3, comblé avec des 0) avec une valeur décimale, .3 ne suffira pas. Utiliser par exempledonneraCode:
1
2 const double dPI = 3,141592; sprintf(monBuffer, "%.3d", dPI);
alors queCitation:
003
donneraCode:
1
2 const double dPI = 3,141592; sprintf(monBuffer, "%.3f", dPI);
Il y a les flux de la STL et sûrement d'autres.Citation:
3.141
:nono::nono::nono::nono::nono::nono:
tu sait combien ça peut couté un bug comme celui là?
c'est plutôt indéfinie, non?Code:
1
2 const double dPI = 3.141592; sprintf(monBuffer, "%.3d", dPI);
Si les flux et leurs manipulateurs.Citation:
Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?
http://cpp.developpez.com/faq/cpp/?page=SL
http://cpp.developpez.com/faq/cpp/?p...stream_iomanip
Pour manipuler une string, le mieux est std::ostringstream et std::istringstream.
Sinon boost.format pour garder la manipulation "à la printf"
Euh.. tu parles de la virgule à la place du point? Si c'est ça, mea culpa, j'ai tapé un peu vite. Sinon, je vois pas trop le problème... :koi:Après vérification, tu as raison. Re-mea culpa. C'est marrant, j'étais persuadé avoir déjà affiché la partie entière d'un double de cette façon.Citation:
c'est plutôt indéfinie, non?
Je dois sûrement confondre :(.
En C++, un truc de ce genre devrait marcher:
Code:
1
2
3
4
5
6
7
8
9
10
11
12 #include <iostream> #include <iomanip> #include <string> #include <sstream> using namespace std; string FormatString(int valeur) { ostringstream oss; oss << dec << setfill('0') << setw(3) << valeur; return oss.str(); }
Bon ben de toute façon, maintenant j'utilise les flux :mrgreen: (exactement comme l'exemple de Medinoc).%lf?? Je le connaissais pas celui-là, j'utilise %f pour les double.
Je me suis renseigné, le 'l' est un paramètre optionnel de taille.
Je crois, par contre, qu'il n'est optionnel que pour printf() : Utilisé avec scanf(), il fait vraiment la différence entre un float et un double.
Merci pour les réponses, %03d fonctionne très bien. Merci
1/ "%.3d" affiche un entier de d'au moins 3 chiffres dans un champs de taille minimale.
"%03d" affiche un entier dans un champs d'au moins 3 caracteres, le champs etant complete avec des zero.
Il y a une difference pour les nombres negatifs ou avec un flag + et <espace> (le signe compte dans la taille du champs, pas dans la precision).
2/ printf ne peut pas faire la difference entre float et double, c'est une fonction variadique et donc ses arguments subissent une promotion.
3/ screetch, a quoi est-ce que tu veux faire allusion?
principalement que les flux C++ sont tres mal faits et qu'ils ont de gros defauts, l'un d'entre eux etant le grand nombre d'appels de fonction et l'autre etant le fait que les chaines se retrouvent coupées et donc intraduisibles (manque de contexte)
l'inconvenient de printf c'est la verification des arguments; quelques compilos donnent des warning si le format et les arguments ne correspondent pas.
il n'y a pas encore de solution type-safe de faire un sprintf en C++, seulement une emulation du meme comportement.