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 :

Conversion double independamment du separateur


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut Conversion double independamment du separateur
    Bonjour, J'ai un petit souci que je n'ai pas reussi a resoudre

    je veux convertir un string de type 0.6 ou 0,6 en double
    quand j'exécute mon application sur un win francais ca marche et quand je veux l'exécuter sur un win Anglais ca donne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double CoefNT = Convert.ToDouble(lblFormule.Text.Substring(0, 3));
    je veux que la conversion passe que ce soit avec un virgule ou un point ?

    que dois je faire ?

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    moi je fais un replace de , par decimalseparator puis pareil pour .
    (decimalseparator se trouve sur l'objet cultureinfo de mémoire, et retourne le paramètre de l'OS)

    j'ose espérer qu'il y a mieux

    à noter que ca permet aussi en france de gérer des saisies avec le . car beaucoup d'utilisateurs (comme moi) préfèrent rester sur le pad numérique pour saisir des nombres, et ce sans que ca râle qu'il faut une virgule ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    A la place de Convert.ToDouble, j'utiliserai Double.TryParse qui permet de préciser la culture.

    Pour tenir compte de deux cultures, il suffit de faire deux appels à la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double CoefNT;
    bool ok = Double.TryParse(lblFormule.Text.Substring(0, 3), out CoefNT) || // Culture par défaut de l'utilisateur
              Double.TryParse(lblFormule.Text.Substring(0, 3), NumberStyles.Any, CultureInfo.InvariantCulture, out CoefNT); // Culture invariante, qui est la culture en-US
     
    // ok = true si la conversion à réussie.

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Si tu doit le faire fréquemment je te propose une méthode d'extension. Et puis ça fait longtemps que je n'en ai pas croisée.

    Code c# : 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
        class Program
        {
            static void Main(string[] args)
            {
                string oldS = "a.b.c,d,e.f.g";
                string newS = oldS.FormatNumberDecimalSeparator();
                // newS contient (sur mon poste FR) : a,b,c,d,e,f,g
            }
        }
     
        public static class extension
        {
            /// <summary>
            /// Retourne une nouvelle chaîne dans laquelle les séparateurs de décimal connues sont remplacées par le séparateur de décimal courant
            /// </summary>
            /// <param name="chaine"></param>
            /// <param name="oldValue"></param>
            /// <param name="newValue"></param>
            /// <returns></returns>
            public static string FormatNumberDecimalSeparator(this string chaine)
            {
                // Séparateur : point, virgule, momayyez (https://fr.wiktionary.org/wiki/%D9%AB)
                StringBuilder sb = new StringBuilder(chaine);
                foreach (string s in new string[] { ".", ",", "٫" })
                    sb.Replace(s, System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
                return sb.ToString();
            }
        }

    PS : Mon séparateur momayyez semble être converti en "٫" sur le site, j'ai ajouté le lien pour retrouver le caractère (qui ressemble à la virgule mais n'en ai pas une).

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    France Lorin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double CoefNT;
    bool ok = Double.TryParse(lblFormule.Text.Substring(0, 3), out CoefNT) || // Culture par défaut de l'utilisateur
              Double.TryParse(lblFormule.Text.Substring(0, 3), CultureInfo.InvariantCulture, out CoefNT) // Culture invariante, qui est la culture en-US
     
    // ok = true si la conversion à réussie.
    tryparse : Double.TryParse(lblFormule.Text.Substring(0, 3), CultureInfo.InvariantCulture, out CoefNT) // Culture invariante, qui est la culture en-US ne veut pas passer il accepte uniquement ' parametre (style

  6. #6
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    France Lorin
    Je suppose, vu que tu me cites, qu'il s'agit de moi. Par respect envers les bénévoles qui viennent ici et qui t'apporte de l'aide, merci de bien faire attention à eux

    Citation Envoyé par Msysteme Voir le message
    tryparse : Double.TryParse(lblFormule.Text.Substring(0, 3), CultureInfo.InvariantCulture, out CoefNT) // Culture invariante, qui est la culture en-US ne veut pas passer il accepte uniquement ' parametre (style
    Mon erreur a été de faire cela de tête sans tester. Double.Parse accepte la version sans paramètre NumberStyle, contrairement à Double.TryParse. Mea culpa donc.

    Mais un minimum de jugeote t'aurait permis de résoudre simplement le problème, plutôt que "d'attendre le code tout fait qui marche du premier coup", puisque l'idée principale, elle, est bonne.

    Comme le message a été mis en avant par le nombre de vote positif, j'ai corrigé l'erreur directement au sein de mon précédent message.

Discussions similaires

  1. conversion double/long possible?
    Par filor dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2007, 17h51
  2. conversion Double[] <-> double[]
    Par mobi38 dans le forum Langage
    Réponses: 2
    Dernier message: 07/09/2006, 17h37
  3. Conversion double => string
    Par alfonsebrown dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2006, 15h56
  4. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/01/2006, 07h59
  5. Réponses: 3
    Dernier message: 12/05/2005, 12h10

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