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 :

Comment faire pour gérer les nombres décimaux avec un "." et avec une "," ?


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut Comment faire pour gérer les nombres décimaux avec un "." et avec une "," ?
    Bonjour à tous,

    je m'explique : j'ai une application qui ouvre des fichiers de type .txt et à l'intérieur des données décimales qui sont soit écrites avec un "." ou soit avec une "," (ex: 22.5 ou 22,5).

    Lorsque j'essaie d'ouvrir un fichier contenant des nombres décimaux avec une "," il n'y a pas de problèmes, mais lorsque c'est un "." l'application ne peut pas ouvrir le fichier et me met : "pas de nombre à virgule flottante correcte".

    Comment faire pour que mon application gère les nombres décimaux autant avec un "." qu'avec une "," ????

    Merci d'avance pour votre aide !!!!


  2. #2
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    le délimiteur décimal est fixé par le système, et tu ne peut pas lui en définir plusieurs.

    Pour modifier le séparateur décimal qui te convient, tu doit modifier le caractère contenu dans la variable DecimalSeparator

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DecimalSeparator = ','; //pour la virgule
    DecimalSeparator = '.'; //pour le point

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Ok merci pottiez !!

    Mais alors il n'y a aucun moyen pour dire que si c'est un "." comme séparateur -> ouvrir le fichier et si c'est une "," -> ouvrir aussi le fichier ???



  4. #4
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Si les deux type d'écriture ne sont jamais mélanger dans un fichier distinct, tu peut faire, grâce au try catch, un essai avec le ., si ça passe dans le catch, retenter avec la , et si ça plante toujours, afficher un message pour dire que le format du fichier n'est pas bon

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Oula, je n'ai jamais utilisé le try catch !!!!!




  6. #6
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    C'est pas très compliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    char decimalSeparatorAvantChangement = DecimalSeparator;
    try
    {
      DecimalSeparator = '.';
      Ouvrir fichier ici
    }
    catch(...)
    {
      try
      {
        DecimalSeparator = ',';
        ouvrir fichier ici
      }
      catch(...)
      {
        DecimalSeparator = decimalSeparatorAvantChangement;
        ShowMessage("Erreur de formatage du fichier");
      }
    }
    DecimalSeparator = decimalSeparatorAvantChangement;
     
    suite du programme

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    personnellement pour régler ce type de problème j'ai implémenté des fonctions qui remplace les ',' par des '.'. Comme ça j'ai toujours la même configuration.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Je te remercie pottiez, mais ça ne fonctionne pas !!!

    Toujours le même problème avec le "." : "pas nombre à virgule flottante correcte".

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut c_boireau
    Un lien sur le sujet

  10. #10
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Et dans ce fichier tu as seulement le format avec les points ou tu as aussi le format avec les virgules

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    seulement avec des points !

  12. #12
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Tu peut mettre un peut de ton code pour voir, sinon la dernière solution est celle de grouff, changer tout les points du fichier par des virgules

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    La solution de grouff est pas mal c'est vrai !!!

    Mais y a t'il une fonction qui remplace les points par des virgules???

  14. #14
    Expert éminent sénior

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je ne pense pas qu'il y en ai de base, il faudra que tu en fasse une

  15. #15
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Tu peut voir ce lien
    ou celui que j'ai psote plus haut

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    AnsiString Decimal(AnsiString A)
    {
    AnsiString N = A;
    for(int j = 1; j <= N.Length(); j++)
        {
        if((N[j] == ',') || (N[j] == '.')) N[j] = DecimalSeparator;
        }
    return N;
    }
    A plus !

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 24
    Points : 31
    Points
    31
    Par défaut traitement du point décimal
    bonjour,
    j'ai été confronté au même problème et voici comment je l'ai traité :

    le séparateur décimal est dans une varable grobale windows (DecimalSeparator) qui est accessible

    dans l'initialisation (fonction formcreate) il suffit de mettre

    DecimalSeparator = 46;//pour que ce soit le "." (code décimal 46) qui soit le séparateur

    ensuite, dans l'évènement onclose() quand on termine le programme, il suffit de mettre l'ancien séparateur de windows (la virgule avec code décimal 44)
    DecimalSeparator = 44;

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Voici le morceau du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    TStringList *Fichier = new TStringList();
     
    char decimalSeparatorAvantChangement = DecimalSeparator;
     
    try
    {
    	DecimalSeparator = '.';
     
    	// Chargement du fichier sélectionné dans la liste
    	Fichier->LoadFromFile(DOC.c_str());
    }
     
    catch (...)
    {
    	try
    	{
    		DecimalSeparator = ',';
     
    		// Chargement du fichier sélectionné dans la liste
    		Fichier->LoadFromFile(DOC.c_str());
    	}
     
    	catch (...)
    	{
    		DecimalSeparator = decimalSeparatorAvantChangement;
    		ShowMessage("Erreur de formatage du fichier");
    	}
    }
     
    DecimalSeparator = decimalSeparatorAvantChangement;
    Avec ce code, lorsque j'ouvre un fichier avec des nombres séparés par un point c'est bon, mais si c'est par une virgule il y a une erreur (par exemple : 4,70 n'est pas un nombre correct à virgule flottante).

    Ce que je voudrai, c'est que mon application puisse ouvrir les fichiers contenant des nombres soit séparés par une virgule, soit par un point.

    Les fichiers que je veux ouvrir, sont toujours "classés" à l'intérieur de la même façon et les séparateurs décimaux à l'intérieur ne sont pas mélangés (soit c'est une virgule, soit c'est un point).


  19. #19
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je pense que cette ligne
    DecimalSeparator = decimalSeparatorAvantChangement;
    doit etre appelee apres avoir effectue tes calculs

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Comment ça, où ça blondelle ?


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

Discussions similaires

  1. Comment faire pour montrer les procédures qui démarrent ave
    Par zoltix dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 09h12
  2. Réponses: 4
    Dernier message: 05/01/2006, 10h01
  3. Réponses: 2
    Dernier message: 23/11/2005, 17h30
  4. Réponses: 2
    Dernier message: 13/11/2005, 19h03

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