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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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

  5. #5
    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.

  6. #6
    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".

  7. #7
    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à.

  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
    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.

  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
    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.

  10. #10
    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.

  11. #11
    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

+ 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