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

VB.NET Discussion :

Problème conversion de chaîne en double [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut Problème conversion de chaîne en double
    Bonjour à tous, je viens demander un peu d'aide car j'ai un erreur que j'ai du ma à comprendre, et je suis un grand débutant dans ce langage. je suis un tuto ou il est demandé de faire un programme qui calcul le coup d'un voyage, mais j'arrive pas à cause d'une erreur: La conversion de la chaîne "2.10" en type 'Double' n'est pas valide.

    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
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            Me.Label5.Text = calc(Me.TextBox2.Text, Me.TextBox3.Text, Me.TextBox1.Text)
     
     
        End Sub
     
        Function calc(ByVal prixLitre As Double, ByVal km As Double, ByVal conso As Double) As Double
     
            Dim result As Double
     
            result = ((km / 100) * conso) * prixLitre
     
            Return result
     
        End Function
     
    End Class
    Si je met une fonction loadFrom, et que j'initialise les valeurs de mes textbox dedans ça marche par contre. Donc mes textbox sont vides quand j'appelle ma fonction calc(), mais je comprend pas comment faire ... j'ai dû louper une étape mais je sais pas laquelle..

    Merci à vous.

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir ,

    Il s'agit d'une erreur de débutant !

    Regarde bien le type du 1er argument de ta fonction "Calc" dans ton gestionnaire d'évènement "Clic" de ton Button1" :



    ....et compare avec les types dans la signature de ta fonction "Calc" :



    Tu travailles avec 3 types string alors qu'il faudrait travailler avec des Types Double donc il faut convertir les valeurs string de tes textbox en Double :

    A+

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Par défaut
    Oh la jolie boulette

    Je te conseille de faire un truc comme :
    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
     
    Function calc(ByVal txtPrixLitre As Double, ByVal txtKM As String, ByVal txtConso As String) As Double
     
     
    Dim prixLitre As Double?
    Dim km As Double?
    Dim conso As Double?
     
    Double.TryParse(txtPrixLitre, out prixLitre)
    Double.TryParse(txtKM , out km )
    Double.TryParse(txtConso , out conso )
     
    ' Puis des km.GetValueOrDefault(0) etc
    ....
    End function

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Salut, et merci pour ton aide, mais j'ai déjà essayé les cast sur mes valeurs, mais il veut rien savoir, j'ai toujours la même erreur.

    Quand je rajoute cette fonction, par contre ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Me.TextBox2.Text = 1.08
            Me.TextBox3.Text = 120
            Me.TextBox1.Text = 6
     
        End Sub
    C'est donc bien dans ma Sub Button1_Click le problème, les valeurs arrivent vides, et c'est donc pour ça qu'il pense que c'est pas des "double". Je ne comprend pas.

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    N'oublies pas que tu affectes aussi un type Double en retour de ta fonction Calc à ta textbox5 qui recois un type String !!!! La aussi c'est pas bon donc ton problème vient bien d'ici !

    Bonne soirée.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    J'ai essayé comme tu me dit, mais toujours la même erreur. Je comprend plus rien.

  7. #7
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par jujudelyon Voir le message
    J'ai essayé comme tu me dit, mais toujours la même erreur. Je comprend plus rien.
    ......
    Ooops.....

    Voilà qui devrait mieux fonctionner j'avais pas vu que tu avais mis un point à la place d'une virgule !

    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
    Public Class Form1
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim txt2 As Double = CType("1,08", Double)
            Dim txt3 As Double = CType("120", Double)
            Dim txt1 As Double = CType("6", Double)
     
            MsgBox(CStr(calc(txt2, txt3, txt1)))
        End Sub
     
        Function calc(ByVal prixLitre As Double, ByVal km As Double, ByVal conso As Double) As Double
     
            Dim result As Double
     
            result = ((km / 100) * conso) * prixLitre
     
            Return result
     
        End Function
    End Class

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Réessayes je viens de modifier le code et ca fonctionne très bien chez moi !
    Je viens d'essayer à nouveau, et c'est pareil. En mettant les nombres ça marche aussi chez moi, ce code marche par exemple:

    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
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim txt2 As Double = CType(textbox2.text, Double)
            Dim txt3 As Double = CType(textbox3.text, Double)
            Dim txt1 As Double = CType(textbox1.text, Double)
     
            Me.Label5.Text = CStr(calc(txt2, txt3, txt1))
     
        End Sub
     
        Function calc(ByVal prixLitre As Double, ByVal km As Double, ByVal conso As Double) As Double
     
            Dim result As Double
     
            result = ((km / 100) * conso) * prixLitre
     
            Return result
     
        End Function
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Me.TextBox1.Text = 4.5
            Me.TextBox2.Text = 3.5
            Me.TextBox3.Text = 5.2
     
        End Sub
    Mais ma fenêtre a aucune utilité si les textbox sont pré-remplies..

  9. #9
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Dans ce cas il faut créer des conditionnels pour vérifier si les valeurs de tes Textboxes sont vides. Si c'est le cas alors tu n'exécutes pas ta fonction "Calc" !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     If not textbox1.text = "" orelse not textbox2.text = "" orelse not textbox3.text = ""  Then
     
     Me.Label5.Text = CStr(calc(txt2, txt3, txt1))
    else
    Msgbox("Toutes les textboxes doivent contenir des valeurs afin d'effectuer le calcul !!!") 
     
    End if
    C'est pas super beau mais c'est pour t'expliquer très simplement c'est tout !

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Par défaut
    Désolé j'étais en train de manger ! Vous pouvez consulter ma réponse éditée !

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Bonjour,

    Excusez moi de ne pas vous avoir répondu hier soir, mais la fatigue m'a emportée. Pour le code, j'ai réussi en fouinant un peu de partout comment résoudre mon problème. Donc voici le code qui marche, je fais une vérification pour savoir c'est bien des nombres mais pour que ça marche, dans les TextBox il faut taper des "doubles" avec la virgule du clavier et pas le point ! C'est contraire à tout ce que j'avais rencontré jusqu’à maintenant en programmation. Est-ce que c'est parce que c'est une String qu'il faut rentrer une virgule ou est-ce que c'est tellement bien francisé que ça comprend plus les points ?

    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
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            If IsNumeric(Me.TextBox1.Text) And IsNumeric(Me.TextBox2.Text) And IsNumeric(Me.TextBox3.Text) Then
     
                Dim txt2 As Double = CType(TextBox2.Text, Double)
                Dim txt3 As Double = CType(TextBox3.Text, Double)
                Dim txt1 As Double = CType(TextBox1.Text, Double)
     
                Me.Label5.Text = calc(txt2, txt3, txt1)
     
            End If
     
        End Sub
     
        Function calc(ByVal prixLitre As Double, ByVal km As Double, ByVal conso As Double) As Double
     
            Dim result As Double
     
            result = ((km / 100) * conso) * prixLitre
     
            Return result
     
        End Function

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    Citation Envoyé par Kikuts Voir le message
    Oh la jolie boulette

    Je te conseille de faire un truc comme :
    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
     
    Function calc(ByVal txtPrixLitre As Double, ByVal txtKM As String, ByVal txtConso As String) As Double
     
     
    Dim prixLitre As Double?
    Dim km As Double?
    Dim conso As Double?
     
    Double.TryParse(txtPrixLitre, out prixLitre)
    Double.TryParse(txtKM , out km )
    Double.TryParse(txtConso , out conso )
     
    ' Puis des km.GetValueOrDefault(0) etc
    ....
    End function
    La solution de Kikuts est plus élégante, si un jours l'utilisateur rentre une lettre ou un caractère non numérique, l'application sortira pas d’exception.
    Pour plus d'information sur les TryParse

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Salut,

    Je ne doute pas une seconde que sa solution soit plus élégante, mais je ne suis pas encore en mesure de bien comprendre le code. Je vais déjà aller voir du côté de la fonction Try Parse, puis essayer de savoir ce que veut dire le ? après les déclarations, et je finirais par la fonction GetValueOrDefault.

    Merci à tous en tous les cas.

  14. #14
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Citation Envoyé par jujudelyon Voir le message
    puis essayer de savoir ce que veut dire le ? après les déclarations[/B].
    Il a utilisé les ? pour préciser qu'il s'agit d'un "nullable type".

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Par défaut
    Le ? après la déclaration sert à déclarer un Double nullable (c'est le raccourcie qui revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim monDouble As Nullable (Of Double)
    Double.TryParse permet de faire de manière transparente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Try
     
    dim x = Ctype(leDoubleAConvertir.Tostring(), Double)
     
    Catch
     
    End try
    Si aucune exception n'est levée, la variable passée en deuxième paramètre avec out (tu peux voir out comme un genre de byref : c'est pour que la valorisation reste persistante en dehors de la fonction : comme si tu avais une variable locale dans une fonction et que tu voulais impacter une variable globale)

    Si une exception est levée, tu auras un null dans ta variable.

    Faire un GetValueOrDefault permet d'utiliser tes variables sans faire de multiple tests pour vérifier que tu as bien convertit les valeurs et pas du null. Si c'est le cas tu travail avec des zéros (attention à ne pas diviser par zéro ! dans ce cas GetValueOrDefault(1) ou alors un If variable.GetValueOrDefault(0) > 0 then je fais ma divisionà.

  16. #16
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Salut jujudelyon

    N'oublie pas de mettre option explicit à On
    Option strict à On
    Projet ->proprieté du projet -> onglet compiler
    Après tu verras que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.Label5.Text = calc(Me.TextBox2.Text, Me.TextBox3.Text, Me.TextBox1.Text)
    n'est pas permis car les types de données des parametres de ta fonction calc
    sont différents de celles que tu fournis
    en vb.net on ne peut pas assigner à une variable une donnée différent du
    type de donné de la variable
    aussi dans ton cas calc rend un double donc tu ne peux pas
    assigner cette valeur à label5.text qui est un string
    tu peux par ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Label5.Text =  calc(Convert.ToDouble(TextBox2.Text), Convert.ToDouble(TextBox3.Text), Convert.ToDouble(TextBox1.Text)).ToString
    la tu n'auras pas d'erreur de compilation mais une exception peut etre relevé
    dans le cas où une des textboxs ne contient pas un nombre
    tu peux essayer ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim param1 As Double
            Dim param2 As Double
            Dim param3 As Double
            If Double.TryParse(TextBox1.Text, param1) AndAlso Double.TryParse(TextBox2.Text, param2) AndAlso Double.TryParse(TextBox3.Text, param3) Then
              Me.Label5.Text =  calc(param2,param3,param1).ToString 
            End If
    bonne prog

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2012
    Messages : 26
    Par défaut
    Salut,

    Merci à tous pour vos explications, je vais tenir compte de vos conseils, à commencer par le strict à On.

    Je n'avais jamais touché au VB, c'est assez spécial, j'ai l'impression d'avoir un mélange de C et de python. Il y a les côtés fastoches de python et le côté compliqué du C. Mais j'aime beaucoup, surtout l 'EDI, qu' est-ce que c'est complet, il aide vraiment le programmeur. Je sens que suis dans le VB pour un moment..

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

Discussions similaires

  1. Conversion de chaîne "" en type Double non valide
    Par vérokit dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/04/2008, 08h14
  2. problème conversion date en chaîne
    Par fakhita dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2007, 14h16
  3. Réponses: 1
    Dernier message: 13/05/2007, 10h07
  4. Réponses: 1
    Dernier message: 15/05/2006, 22h22
  5. Problème conversion float vers double
    Par jhenaff dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/01/2006, 10h39

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