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++Builder Discussion :

Formatage données avec sprintf


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Par défaut Formatage données avec sprintf
    Bonjour,

    Je dois formater des données, en ansi string dans une variable char avec la fonction sprintf. Si les variables que j'introduit dans mon formatage son des variable entières, aucun soucis pour le formatage, tout se passe correctement. Par contre, si je lui donne des variable en AnsiString, ce n'est plus le cas, il concatène le tout mais il ne les formate pas au nombre de caractères que j'ai décidé. Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      sprintf(cInscription,"%s\tTemp:%05s\tPression:%05s\tVitesse:%05s\tHumidité:%05s\t Ensoleillement:%06s\tDirection du vent:%05s",
      asDateHeure,iTemp,iPression,iVent,iHumidite,iSoleil,iDirVent);
    Merci de votre aide et à bientôt !

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Si je comprend bien tu dis que tout les variables suivantes sont des AnsiString: asDateHeure, iTemp, iPression, iVent, iHumidite, iSoleil, iDirVent ???

    Si tu veux les transformer en char pour les utiliser un sprintf il faut mettre un .c_str() à la devant chacun d'eux, ex:
    Comme expliquer ici: http://cpp.developpez.com/faq/bcb/?p...es#chainescstr

  3. #3
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Si tu cherches à prendre une partie d'une AnsiString il faut utiliser SubString:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	AnsiString Original = Edit1->Text;
    	AnsiString SubOne = Original.SubString(9, 4);
    	Edit2->Text = SubOne;
    Si tu es intéressé à la manipulation d'AnsiString va voir le site Web suivant: http://www.functionx.com/bcb/topics/strings.htm

  4. #4
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    On n'utilise plus trop la vieille fonction sprintf, on utilise plutôt Format.

    Vous montrez une instruction assez longue sans nous dire le type des variables ni celle qui pose problème. Vous devriez préciser.

    À bientôt
    Gilles

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Par défaut
    Ce sont toutes des variables AnsiString qui doivent être formatées et concatennées dans la variable char "cInscription".

    Si je lui donne une variable entière a la fonction et que le formatage est as 05 et que la valeure est 20 par exemple. Après les formatage de cette variable, j'aurais la valeure "00020". Mais avec les variables AnsiString cela ne fonctionne pas et je dois le faire ! Je ne sais pas si avec la fonction "Format" citée par Gilles cela fonctionne...

    Merci

  6. #6
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Vous ne pouvez pas traiter des AnsiStrings comme des entiers. Si ce sont des AnsiString, ce sera à vous d'ajouter ces zéros. Si ce sont des entiers, vous pouvez imposer un formtage avec des zéros à conditions de traiter ces données comme des entiers.

    Voici un exemple avec l'instruction Format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    AnsiString A;
    int n1,n2,n3;
    TVarRec args[3];
     
    n1=50;
    n2=4;
    n3=1234;
    args[0] =n1;
    args[1] =n2;
    args[2] =n3;
    A=Format("%8.5d %8.5d %10.5d", args, 2);
    args contient les valeurs (c'est un tableau qui peut contenir n'importe quoi). Vous le remplissez. %8.5d indique que c'est un entier (d=décimal), 8 indique l'espace (8 caractères d'espace) et 5 le nombre de chiffres à écrire dont 20 donnera 00020. le 2 final indique le dernier indice du tableau args, il est égal au nombre de valeurs de ce tableau moins un.

    À bientôt
    Gilles

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Par défaut
    Je suis pas sûr d'avoir compris mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(cInscription,"%s\tTemp:%-5.5s...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Par défaut
    Citation Envoyé par Gilles Louïse Voir le message
    Vous ne pouvez pas traiter des AnsiStrings comme des entiers. Si ce sont des AnsiString, ce sera à vous d'ajouter ces zéros. Si ce sont des entiers, vous pouvez imposer un formtage avec des zéros à conditions de traiter ces données comme des entiers.

    Voici un exemple avec l'instruction Format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    AnsiString A;
    int n1,n2,n3;
    TVarRec args[3];
     
    n1=50;
    n2=4;
    n3=1234;
    args[0] =n1;
    args[1] =n2;
    args[2] =n3;
    A=Format("%8.5d %8.5d %10.5d", args, 2);
    args contient les valeurs (c'est un tableau qui peut contenir n'importe quoi). Vous le remplissez. %8.5d indique que c'est un entier (d=décimal), 8 indique l'espace (8 caractères d'espace) et 5 le nombre de chiffres à écrire dont 20 donnera 00020. le 2 final indique le dernier indice du tableau args, il est égal au nombre de valeurs de ce tableau moins un.

    À bientôt
    Gilles
    Merci de ta réponse j'ai encore apris quelque chose mais je dois travailler avec des AnsiString pour pouvoir ajouter le signe "+" si la valeure est générée, comme demandé dans un autre post dont tu m'as aidé.

    Merci

  9. #9
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    C'est à vous de le programmer à la main en concaténant petit à petit vos résultats, je ne crois pas que vous puissiez passer par des fonctions standard dans ces conditions.

    On se demande pourquoi vous avez besoin de ce signe positif mais il faut reconnaître qu'en utilisant Format, cette possibilité n'est pas prévue (ou alors elle m'a échappée).

    À bientôt
    Gilles

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Par défaut
    Je vous explique tout le fonctionnement de mon programme alors :

    Il génère des valeures aléatoires entre un seuil minimum et un seuil maximum définit par l'utilisateur. Quand la valeure est négative, le programme ajoute automatiquement le signe "-" devant le chiffre, par contre quand la valeure est positive je dois avoir le signe "+" devant le chiffre et il ne le met pas auomatquement. Après que toutes les valeures soient générées, la fonction sprintf me concatène et me formate toutes les valeures dans la variable cInscription. Cette variable est ensuite inscrite dans un TMemo et écrite dans un fichier par le bias de la fonction Memo->SaveToFile("C:\\Temp\\coucou.txt").

    Le problème que j'ai c'est que je dois formater mes valeures a 5 caractères et une a 6, et ajouter le signe "+" aux valeures positives. J'ai réussit a ajouter le signe "+" devant les valeures positvies avec les AnsiString, par contre si j'envoie des AnsiString à la fonction sprintf le formatage n'est pas fait. Pouvez-vous m'aoder ?

    Merci

  11. #11
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Vous n’avez qu’à créer vous-même une fonction de formatage qui reçoit le nombre entier n, la longueur du nombre l pour savoir le nombre de zéros à rajouter et l’espace total e dans lequel ce résultat sera calé à droite.

    Vous déclarez cette fonction dans la classe principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString __fastcall FormatNb(int,int,int);
    On peut l’écrire comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AnsiString __fastcall TForm1::FormatNb(int n, int l, int e)
    {
    AnsiString A;
     
    A=IntToStr(abs(n));
    A=A.StringOfChar('0',l-A.Length())+A;
    n>=0? A="+"+A : A="-"+A;
    A=A.StringOfChar(' ',e-A.Length())+A;
    return A;
    }
    À partir de là, vous concaténez petit à petit vos résultats, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AnsiString A,B;
    int n1,n2,n3;
     
    n1=50;
    n2=-4;
    n3=123;
     
    A=FormatNb(n1,5,10);
    A+=FormatNb(n2,5,10);
    A+=FormatNb(n3,5,10);
    À bientôt
    Gilles

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Par défaut
    Merci beacoup de votre aide !

    C'est magnifique !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Formatage de données dans sprintf
    Par raplapente dans le forum Débuter
    Réponses: 2
    Dernier message: 17/07/2009, 16h17
  2. formatage de données avec sprintf
    Par hunter001 dans le forum C
    Réponses: 10
    Dernier message: 18/08/2006, 08h05
  3. Modifier le nom d'une base de donnée avec erreur sy
    Par mmn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2003, 10h12
  4. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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