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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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 confirmé

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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 confirmé

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

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




  6. #6
    Expert confirmé

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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 averti
    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
    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;

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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).


  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
    Par défaut
    Je pense que cette ligne
    DecimalSeparator = decimalSeparatorAvantChangement;
    doit etre appelee apres avoir effectue tes calculs

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

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


  11. #11
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AnsiString DOC;
    TStringList *Fichier;
    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
     
    if(FileExists(DOC))
        {
        AnsiString N;
        Fichier = new TStringList();
        Fichier->LoadFromFile(DOC);
        for(int j = 0; j < Fichier->Count; j++)
            {
            N = Fichier->Strings[j]; 
            for(int i = 1; i <= N.Length(); i++)
                {
                if( (N[i] == '.') || (N[i] == ',') ) 
                    {
                    N[i] = DecimalSeparator;
                    }
                }
            Fichier->Strings[j] = N;
            }
     
        //... le traitement
        //...
        //...
     
        delete Fichier;
        }

    Quelle que soit la valeur système DecimalSeparator et quelle que soit le séparateur décimal utilisé dans le fichier, on obtient des chaînes (dans Fichier) avec le bon formatage (même si un rigolo aura fait un panachage de '.' et de ',').

    A plus !

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

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, 08h12
  2. Réponses: 4
    Dernier message: 05/01/2006, 09h01
  3. Réponses: 2
    Dernier message: 23/11/2005, 16h30
  4. Réponses: 2
    Dernier message: 13/11/2005, 18h03

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