IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

sprintf %d et nombre de chiffre constant (001, 002, etc.)


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut sprintf %d et nombre de chiffre constant (001, 002, etc.)
    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

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    et %03d ?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    %.3d

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    et %03d ?
    +1.
    Écrit avec 3 caractères, comblant avec des 0 si la taille du nombre est inférieure à 3.
    Citation Envoyé par Ubiquité
    %.3d
    Fonctionne également, mais dans le cas particulier du nombre entier. Le résultat ne sera pas le même avec un double.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    Citation Envoyé par Spout Voir le message
    Fonctionne également, mais dans le cas particulier du nombre entier. Le résultat ne sera pas le même avec un double.
    D'un autre côté afficher un double avec %d...

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    D'un autre côté afficher un double avec %d...
    Je parlais du .3 bien sûr ...

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    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 exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const double dPI = 3,141592;
    sprintf(monBuffer, "%.3d", dPI);
    donnera
    003
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const double dPI = 3,141592;
    sprintf(monBuffer, "%.3f", dPI);
    donnera
    3.141
    Citation Envoyé par Ubiquité Voir le message
    Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?
    Il y a les flux de la STL et sûrement d'autres.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Spout Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const double dPI = 3,141592;

    tu sait combien ça peut couté un bug comme celui là?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const double dPI = 3.141592;
    sprintf(monBuffer, "%.3d", dPI);
    c'est plutôt indéfinie, non?

    Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?
    Si les flux et leurs manipulateurs.
    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"

  10. #10
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Au fait y a pas mieux que sprintf pour jouer avec les chaines en C++ ?
    bah non.
    les flux ne font pas vraiment la meme chose, il y a bien quelques solutions plus C++iennes mais elles ne font pas partie du standard.

  11. #11
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Mongaulois Voir le message

    tu sait combien ça peut couté un bug comme celui là?
    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...
    c'est plutôt indéfinie, non?
    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.
    Je dois sûrement confondre .

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En C++, un truc de ce genre devrait marcher:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Spout Voir le message
    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...
    oui oui je parle bien de cela


    Citation Envoyé par Spout Voir le message
    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.
    Je dois sûrement confondre .
    Disons que suivant comment est codé un double et sa valeur ça tombe en marche...
    J'ai jamais vraiment bien compris le problème...Si je me trompe pas :
    %d : int
    %f : float
    %lf : double

  14. #14
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Disons que suivant comment est codé un double et sa valeur ça tombe en marche...
    Bon ben de toute façon, maintenant j'utilise les flux (exactement comme l'exemple de Medinoc).
    Citation Envoyé par Mongaulois Voir le message
    Si je me trompe pas :
    %d : int
    %f : float
    %lf : double
    %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.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Spout Voir le message
    Bon ben de toute façon, maintenant j'utilise les flux (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.
    oui, en gros, c'est pour dire long float donc double.
    Mais c'est un peu obscure pour moi...

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    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.
    Vérifié dans la MSDN .
    Je me coucherais moins bête ce soir .

  18. #18
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    Merci pour les réponses, %03d fonctionne très bien. Merci

  19. #19
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    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?

  20. #20
    screetch
    Invité(e)
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [C#] Limiter le nombre de chiffre apres la virgule ?
    Par MaxiMax dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/08/2011, 14h20
  2. [9i] Créer une séquence formatée (001, 002, etc)
    Par chatroux dans le forum Oracle
    Réponses: 10
    Dernier message: 28/06/2007, 10h59
  3. Limiter nombre de chiffre apres la virgule
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/08/2005, 12h02
  4. arrondir un nombre à 2 chiffres après la virgule
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/02/2005, 08h36
  5. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 13h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo