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#

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    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 sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 177
    Points : 5 738
    Points
    5 738
    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 habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    merci François DORIN mais pour votre information j'ai essayé mais je n'ai pas reussi à le faire

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Tant pis ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Bonjour,

    ça fonctionne pourtant parfaitement.
    La valeur convertie est stockée dans CoefNT.

    Montre-nous ce que tu as fait et nous t'aiguillerons sur ce qui ne va pas.

  10. #10
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    Je suis de retour,
    j'ai essayé votre solution François DORIN mais ca ne donne pas le résultat souhaité :

    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
    double textboxValue;
                        bool ok = Double.TryParse(txtMontantR.Text, out textboxValue) || Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any,
                            System.Globalization.CultureInfo.InvariantCulture, out textboxValue);
     
                    connection.Open();
                    if (ok)
                    {
                        cmdQ = new SqlCommand("insert into Rubriques......;
     
                        cmdQ.Parameters.AddWithValue("@IDR", Guid.NewGuid().ToString());
     
                        cmdQ.Parameters.AddWithValue("@MontantRub", textboxValue);
     
                        cmdQ.ExecuteNonQuery();
                        ClearDataRubriques();
                    }
    mais quant la zone de text txtMontantR contient par exemple : 256.50 je reçois le bon resulat dans ma BD 256.50 sinon si j'introduis 256,50 il me stocke 25650 dans la BD

    Merci pour votre aide

  11. #11
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    mais quant la zone de text txtMontantR contient par exemple : 256.50 je reçois le bon resulat dans ma BD 256.50 sinon si j'introduis 256,50 il me stocke 25650 dans la BD
    Je paris que cela ne fonctionne pas comme souhaité sur un PC avec Windows en anglais.

    Reprenons le code que je t'ai fourni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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.
    La ligne 2 utilise la culture de l'utilisateur. Si le PC est un PC avec Windows en anglais, alors la culture de l'utilisateur est une culture anglais. Dans cette culture, la virgule n'est pas un séparateur décimal, mais le séparateur des milliers. Ce séparateur est inutile, si ce n'est pour faciliter sa lecture par un être humain. Il est donc tout simplement ignoré. Ce qui explique que 256,50 est stockée sous la forme 25650. C'est comme si pour une culture française, tu me disais que "15 540" est stockée sous la forme "15540", car le séparateur des milliers est l'espace.

    Une simple modification du code permettra de répondre à ton problème. Au lieu d'utiliser la culture par défaut de l'utilisateur, il suffit de préciser que tu souhaites utiliser une culture française.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double CoefNT;
    bool ok = Double.TryParse(lblFormule.Text.Substring(0, 3), NumberStyles.Any, new CultureInfo("fr-FR"), out CoefNT) || // Culture française
              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.
    Ainsi, on teste d'abord avec la culture française. Si ça ne marche pas, on essaie avec la culture anglaise.

    On est toujours emm***r en France avec ces bêtises, car on amalgame facilement les deux séparateurs (, et .). Par contre, vu le rôle bien dissocier dans une culture anglaise, je ne pense pas que ce problème se pose (car 18,456 est très différent de 48.456 !). Maintenant juste espérer pour toi qu'aucun anglais n'utilisera ton application, au risque d'avoir des comportements inattendu...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    le meme probleme persiste

  13. #13
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Programme de test
    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
    32
    33
    34
    using System;
    using System.Globalization;
     
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] s = new string[] {
                    "256,50",
                    "256.50",
                "123456,78",
                "12 3456,78",
                "12,3456.78"};
     
                foreach(string number in s)
                {
                    Console.WriteLine("{0}: {1}", number, parse(number));
                }
     
                Console.ReadLine();
            }
     
            public static double? parse(string s)
            {
                double d;
                bool ok = Double.TryParse(s, NumberStyles.Any, new CultureInfo("fr-FR"), out d) || // Culture par défaut de l'utilisateur
                          Double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out d); // Culture invariante, qui est la culture en-US
     
                return ok ? d : (double?)null;
            }
        }
    }
    Résultat obtenu :
    256,50: 256,5
    256.50: 256,5
    123456,78: 123456,78
    12 3456,78: 123456,78
    12,3456.78: 123456,78


    Cette méthode est donc parfaitement fonctionnelle. Ou alors le besoin est mal défini.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Plutôt que d'utiliser InvariantCulture, j'énumèrerais plutôt la liste des cultures potentiellement utilisées par mes utilisateurs, et je les testerais toutes.

    En effet, aujourd'hui on a le souci avec un simple séparateur de décimal, mais que se passera-t-il lorsque l'utilisateur saisira un séparateur de milliers ?

    Mieux vaut prévoir explicitement les différents cas.

    PS : D'où proviennent ces chiffres ? Comment sont-ils saisis ?

    Car plutôt que de corriger "après coup" le mieux est de les récupérer "dès le début" soit dans le bon format, soit savoir dans quelle culture ils sont exprimés (et ainsi savoir comment les relire).

    Car si demain on a des dates, c'est pas la même...

    06/03/2017 => C'est mon anniversaire si on est en fr-FR ou en-GB mais celui de ma sœur si on est en en-US... Et là mise à part appeler madame Irma...
    On ne jouit bien que de ce qu’on partage.

  15. #15
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    effectivement StringBuilder

    les données sont saisies dans un textbox et stockée dans la BD et apres je les recupère de la BD pour faire des calculs

  16. #16
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    François DORIN : je ne fais que saisir 250.50 et 250,50 dans un textbox appelé txtMontantR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    double textboxValue;
                    bool ok = Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, new System.Globalization.CultureInfo("fr-FR"), out textboxValue) || Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out textboxValue);
    et je stocke textboxValue dans la BD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        cmdQ.Parameters.AddWithValue("@MontantRub", textboxValue);
    cela donne :

    250.50
    25050

  17. #17
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    effectivement StringBuilder

    les données sont saisies dans un textbox et stockée dans la BD et apres je les recupère de la BD pour faire des calculs
    Donc c'est au moment de les stocker dans la base de données (au moment où la culture de l'utilisateur est connue) qu'il faut :
    - Soit stocker proprement dans le bon type dans la base de données (utiliser un DECIMAL plutôt qu'un VARCHAR)
    - Soit sérialiser proprement (en utilisant InvariantCulture qui sert à ça) la valeur dans le VARCHAR

    En effet, si la culture locale est fr-FR, alors une conversion de 0,1 version 0.1 fonctionnera automatiquement.
    Idem, si la culture locale est en-US alors la conversion de 0.1 à 0.1 sera automatique aussi.

    Ensuite, à la relecture, même manip mais dans l'autre sens : on converti de InvariantCulture vers le type dédié : ça ira tout seul !

    Mais surtout, essaie de modifier la manière dont c'est stocké en base :
    - De préférence avec le bon type, histoire d'être capable de faire des calculs corrects en SQL
    - Au pire, sérialisé en varchar : plus de calcul possibles, mais au moins les données sont cohérentes

    Là imagine que tu dois faire une soupe, et dans un panier t'as des pommes de terres pas lavées, un choux déjà cuit, des navets épluchés, et des oignons en poudre... Bon courage pour réussir à faire une soupe sans mettre de la terre dedans ni en jeter la moitié !
    On ne jouit bien que de ce qu’on partage.

  18. #18
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    L'erreur doit être ailleurs, car le jeu de tests que j'ai donné en exemple montre que cela fonctionne.

    Peut-on avoir le code complet ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  19. #19
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    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
    32
    33
    34
    35
    36
    37
    38
    private void lkAjouterRub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {
                if (!IsDocumentValidR())
                    return;
                else
                {
                    double textboxValue;
     
                    bool ok = Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, new System.Globalization.CultureInfo("fr-FR"), out textboxValue) || Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out textboxValue);
     
                    connection.Open();
                    if (ok)
                    {
                        cmdQ = new SqlCommand("insert into Rubriques(IDR, NumAO, Chap, Art, Reg, Para, Ligne, MontantRub , typeImputation, AnneeImputation) values(@IDR, @NumAO, @Chap, @Art, @Reg, @Para, @Ligne, @MontantRub, @typeImputation, @AnneeImputation)", connection);
     
                        cmdQ.Parameters.AddWithValue("@IDR", Guid.NewGuid().ToString());
                        cmdQ.Parameters.AddWithValue("@NumAO", (cmbAO.SelectedItem as ComboBoxItem).Text);
                        cmdQ.Parameters.AddWithValue("@Chap", txtChap.Text);
                        cmdQ.Parameters.AddWithValue("@Art", txtArt.Text);
                        cmdQ.Parameters.AddWithValue("@Reg", txtReg.Text);
                        cmdQ.Parameters.AddWithValue("@Para", txtParag.Text);
                        cmdQ.Parameters.AddWithValue("@Ligne", txtLigne.Text);
                        cmdQ.Parameters.AddWithValue("@MontantRub", textboxValue);
                        cmdQ.Parameters.AddWithValue("@typeImputation", cmbTypeImp.SelectedItem.ToString());
                        cmdQ.Parameters.AddWithValue("@AnneeImputation", Convert.ToInt16(txtAnneeImp.Text));
     
                        cmdQ.ExecuteNonQuery();
                        ClearDataRubriques();
                    }
                    else
                    {
                        MessageBox.Show("Revoir votre saisie !");
                    }
     
                    connection.Close();
                    DisplayDataRubriques();
                }
            }
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
            private bool IsDocumentValidR()
            {
                errorProvider2.SetError(txtMontantR, string.Empty);
     
                if (string.IsNullOrEmpty(txtMontantR.Text))
                {
                    errorProvider2.SetError(txtMontantR, "le montant de la rubrique ne doit pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtAnneeImp.Text))
                {
                    errorProvider2.SetError(txtAnneeImp, "l\'année budgétaire ne doit pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtChap.Text))
                {
                    errorProvider2.SetError(txtChap, "Les zones de la rubrique ne doivent pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtArt.Text))
                {
                    errorProvider2.SetError(txtArt, "Les zones de la rubrique ne doivent pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtReg.Text))
                {
                    errorProvider2.SetError(txtReg, "Les zones de la rubrique ne doivent pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtParag.Text))
                {
                    errorProvider2.SetError(txtParag, "Les zones de la rubrique ne doivent pas être vide");
                    return false;
                }
     
                if (string.IsNullOrEmpty(txtLigne.Text))
                {
                    errorProvider2.SetError(txtLigne, "Les zones de la rubrique ne doivent pas être vide");
                    return false;
                }
     
                double textboxValue;
                bool ok = Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, new System.Globalization.CultureInfo("fr-FR"), out textboxValue) || Double.TryParse(txtMontantR.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out textboxValue);
     
                if (!ok)
                {
                    errorProvider2.SetError(txtMontantR, "Le montant engagé par rubrique doit être numérique");
                    return false;
     
                }
                return true;
            }

  20. #20
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Peux-tu t'assurer que le problème vient bien du parsing ? Pour cela, met un point d'arrêt une fois que la valeur a été parsée pour voir ce que tu obtiens (je demande bien un point d'arrêt, pas d'aller voir en BD la valeur stockée).

    Et est-ce bien une virgule qui est utilisée ? Il y a des caractères très ressemblant... ericlm128 a mentionné à juste raison le momayyez par exemple.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

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

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