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 :

Eternel problème de conversion des points décimaux


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Eternel problème de conversion des points décimaux
    Bonjour,

    Voici je pense un des problèmes les plus casse-pied qui puisse exister :
    Le traitement des virgules ou point décimaux

    Exemple :
    dans un champ de DataGridView un utilisateur peut introduire un filtre numerique dont l'operande est un float

    > 1.2
    < 2,3

    Pour permettre la saisie d'operateurs je laisse le champs en type texte

    Et a un moment je construit le filtre que j'utilise sur un dataview

    Genre
    fRowFilter=string.Format("Valeur={0}",value);
    Et c'est la que les ennuis commencent

    Si la valeur est 1.2 en texte c'est bon
    Si la valeur est 1,2 en texte (avec virgule) le filtre hurle

    C'est pas grave me dis-je, je vais d'abord faire un TryParse pour convertir en float et puis je ferais un String.Format du float

    Mais là j'ajoute DEUX problèmes

    1- Si la valeur de base est 1.2 le tryparse me rends 12.0
    2- Si la valeur est 1,2 le tryparse rends 1.2 et si je fait un string.format de la valeur float 1.2 il ponds 1,2 : de nouveau le filtre hurle

    En définitive faute de mieux je continue a tout traiter en string a coup de .Replace pour convertir les éventuelles virgules en point

    Et je n'ai franchement pas envie de faire une gestion d'event capilotractée pour analyser a la volée ce que l'utilisateur introduit dans le champs du dgv

    Une meilleure suggestion

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Pour gérer correctement les séparateurs décimaux, il faut tenir compte de la culture courante. En français c'est une virgule, en anglais c'est un point...

    Par contre, si je ne dis pas de bêtise, les expressions de filtres utilisent toujours la culture en-US, donc avec un point.

    SI tu veux pouvoir accepter la saisie de nombre dans les 2 formats, tu es obligé de bidouiller, par exemple comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string sNumber = ...
    string separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    sNumber = sNumber.Replace(",", separator).Replace(".", separator);
    decimal number = decimal.Parse(number);
    De cette façon ça devrait fonctionner dans toutes les langues (en supposant qu'il n'y ait pas des langues qui utilisent autre chose que le point ou la virgule comme séparateur, ce qui n'est pas garanti ) (*)

    Ensuite, la création du filtre... Quand tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fRowFilter=string.Format("Valeur={0}",value);
    Ca formate la valeur en utilisant la culture courante, donc si value est un nombre décimal, il sera formaté avec une virgule (en français). Pour obtenir le format voulu, il faut spécifier explicitement la culture, en général CultureInfo.InvariantCulture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fRowFilter=string.Format(CultureInfo.InvariantCulture, "Valeur={0}",value);
    et là ça devrait marcher comme tu veux...


    (*) EDIT : je viens de vérifier, y en a pas dans les cultures connues... par contre certaines utilisent le point ou la virgule comme séparateur de milliers
    Tu peux éventuellement interdire l'utilisation de séparateurs de milliers, en précisant le NumberStyles dans le TryParse

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Tomlev

    Bravo pour cette synthese tres utile et didactique

    Je vais en faire un post-it

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

Discussions similaires

  1. [GEOTOOLS] Problème d'afiichage des points
    Par raz2008 dans le forum SIG : Système d'information Géographique
    Réponses: 1
    Dernier message: 11/08/2009, 16h40
  2. Problème de conversion des tag struts
    Par reverse_engineer dans le forum Struts 1
    Réponses: 2
    Dernier message: 22/07/2008, 12h57
  3. Problème de conversion des accents
    Par s.azdine dans le forum Administration
    Réponses: 0
    Dernier message: 06/07/2008, 09h17
  4. Problème d'ordre des points dans un Tchart
    Par pasqual dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2007, 12h04
  5. [SQL 2005] problèmes de gestion des chiffres décimaux
    Par skystef dans le forum Accès aux données
    Réponses: 1
    Dernier message: 10/01/2007, 11h40

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