Conversion chêne de caractère en double

Résolu
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 - Modifié par cs_mohellebi le 23/08/2015 à 11:22
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 - 25 août 2015 à 10:15
Bonjour,
J'ai réalisé un code qui lit des chaînes de caractère (numérique) à partir d'un fichier .txt ,maintenant mon problème est lorsque je cumule ces chaines j'ai un message d'erreur "La conversion de la chaîne en type 'Double' n'est pas valide" chose logique, j ai tenté quelques astuces comme créer des variables et les formater avec un CDBL , mais rien à faire le message est toujours là.
Et Merci d'avance pour votre habituelle aide.




le code vb.net
 Do Until objstreamreader.Peek = -1

            strLine = objstreamreader.ReadLine()
            secteur = Mid(strLine, 1, 7)

            'devise = Mid(strLine, 1, 6)
            rot = Mid(strLine, 1, 6)
            'dt = Mid(strLine, 86, 4)


            If rot = "Voyage" Then

                
                Vnavire = Mid(strLine, 11, 5)
                trajet = Mid(strLine, 31, 7)
                numV = Mid(strLine, 71, 3)
                numV = String.Format("0000{0}", numV, " ", vbNullString)
                numV = numV.Substring(numV.Length - 4, 4)
                Vdt = Mid(strLine, 51, 10)
                Vdt = Replace(Vdt, "/", "")

                          If secteur = "EURO" Then

                    dev = Mid(strLine, 91, 3)

                    MontantPax = RTrim(Mid(strLine, 11, 12))
                    MontantPax = Replace(MontantPax, " ", vbNullString)

                    MontantPax = String.Format("000000000000000{0}", MontantPax)
                    MontantPax = MontantPaxEntmv.Substring(MontantPax.Length - 12, 12)

                    MontantVeh = RTrim(Mid(strLine, 51, 12))
                    MontantVeh = Replace(MontantVeh, " ", vbNullString)

                    MontantVeh = String.Format("000000000000000{0}", MontantVeh)
                    MontantVeh = MontantVeh.Substring(MontantVeh.Length - 12, 12)

                    MontantTaxPax = RTrim(Mid(strLine, 31, 12))
                    MontantTaxPax = Replace(MontantTaxPax, " ", vbNullString)

                    MontantTaxPax = String.Format("000000000000000{0}", MontantTaxPax)
                    MontantTaxPax = MontantTaxPax.Substring(MontantTaxPax.Length - 12, 12)


                    MontantTaxVeh = RTrim(Mid(strLine, 71, 12))
                    MontantTaxVeh = Replace(MontantVeh, " ", vbNullString)

                    MontantTaxVeh = String.Format("000000000000000{0}", MontantVeh)
                    MontantTaxVeh = MontantTaxVeh.Substring(MontantVeh.Length - 12, 12)

                    Dim montantpax1 As Single
                    Dim montantVeh1 As Single
                    Dim montanttaxpax1 As Single
                    Dim montanttaxveh1 As Single


                    montantpax1 = MontantPax
                    montantVeh1 = MontantVeh
                    montanttaxpax1 = MontantTaxPax
                    montanttaxveh1 = MontantTaxVeh


'la variable MontantCumule est déclarée comme private (singel) au debut de la classe 
                    MontantCumule = CDbl(montantpax1) + CDbl(montanttaxpax1) + CDbl(montantVeh1) + CDbl(montanttaxveh1)

                    MessageBox.Show(MontantCumule)
                    
                    affiche = Vnavire + " " + "MANI " + Vdt + "    " + "OD10" + " X " + Vnavire + numV + " " + trajet + Vnavire + Vdt + " c " + " c " + MontantPax + " N                 " + dev + " " + dev + " " + MontantPax
                    objstreamwriter.WriteLine(affiche)

                    affiche = Vnavire + " " + "MANI " + Vdt + "    " + "OD60" + " X " + Vnavire + numV + " " + trajet + Vnavire + Vdt + " c " + " c " + MontantVeh + " N                 " + dev + " " + dev + " " + MontantVeh
                    objstreamwriter.WriteLine(affiche)

                    affiche = Vnavire + " " + "MANI " + Vdt + "    " + "OD61" + " X " + Vnavire + numV + " " + trajet + Vnavire + Vdt + " c " + " c " + MontantTaxPax + " N                 " + dev + " " + dev + " " + MontantTaxPax
                    objstreamwriter.WriteLine(affiche)

                    affiche = Vnavire + " " + "MANI " + Vdt + "    " + "OD62" + " X " + Vnavire + numV + " " + trajet + Vnavire + Vdt + " c " + " c " + MontantVeh + " N                 " + dev + " " + dev + " " + MontantTaxVeh
                    objstreamwriter.WriteLine(affiche)

                    affiche = Vnavire + " " + "MANI " + Vdt + "    " + "OD62" + " X " + Vnavire + numV + " " + trajet + Vnavire + Vdt + " c " + " c " + MontantCumule + " N                 " + dev + " " + dev + " " + MontantCumule
                    objstreamwriter.WriteLine(affiche)

end if
end if
loop 

8 réponses

Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 août 2015 à 11:26
Bonjour cs_mohellebi.
Si vous voulez vraiment programmer en VB.net, vous devez avant toute chose respecter les règles suivantes,
Option Explicit : ON
Option Strict : ON
Option Off : Off
Espace de noms Microsoft : désactivé

Pour votre gouverne : un chêne est un gros arbre, une chaîne de caractères est une suite d'objets de classe String.
Cordialement.
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 août 2015 à 11:48
Veuillez m'excuser. Une chaîne de caractères est un objet de classe String.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
Modifié par cs_mohellebi le 23/08/2015 à 14:29
et le gland son fruit, je sais aussi qu une chaîne de caractère est un objet string , en revanche ce n'est pas ma question !!!
merci quand même pour votre suggestion afin d activer les options explicit et strict
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 août 2015 à 20:45
mais avez-vous désactivé l'espace de noms Microsoft ?
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
23 août 2015 à 22:24
Bonjour, peux tu mettre un exemple de ton fichier texte, avec des données non confidentielles ou erronées.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 23/08/2015 à 22:30
Salut

tu ferais beaucoup mieux de lire ce cours
http://plasserre.developpez.com/cours/vb-net/

Ce n'est pas la peine de faire une salade vb6vb.net
Et en plus ce n'est aux membres du forum à debogger ton code.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
24 août 2015 à 09:18
Bonjour cs_mohellebi.

Voici un code VB.net pur et dur, et qui néanmoins pourrait vous être utile.
Public Class Accueil

Private Sub Accueil_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim Txt1 As String = "3,1415926", Vlr1 As Double, Ok1 As Boolean
Ok1 = Double.TryParse(Txt1, Vlr1)
MessageBox.Show(Ok1.ToString)
MessageBox.Show(Vlr1.ToString)

Dim Txt2 As String = "Le chêne un jour dit au roseau", Vlr2 As Double, Ok2 As Boolean
Ok2 = Double.TryParse(Txt2, Vlr2)
MessageBox.Show(Ok2.ToString)
MessageBox.Show(Vlr2.ToString)

End Sub

End Class

Un peu moins cordialement.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
Modifié par cs_mohellebi le 24/08/2015 à 10:15
Oui l'espace de nom Microsoft a été désactivé, si non voila la petite instruction qui permet la conversion d'une chaîne de caractère vers un format de type double

montantVeh1 = Convert.ToDouble(MontantVeh)


Merci encore pour votre code est le cours
qui m a été proposé
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 24/08/2015 à 10:35
montantVeh1 = Convert.ToDouble(MontantVeh)


fonctionne à condition que le string MontantVeh est numérique
c.a.d que chaque caractère est "0" ..."9" "," ou "."
sinon une exception est relevée

le code de Zermelo (que je salue) verifie si le string peut etre
converti en double

ton code cloche
tu écris

secteur = Mid(strLine, 1, 7)
en net donne
secteur = strline.substring(0,7)

rot = Mid(strLine, 1, 6)
rot = strline.substring(0,6)

donc
les 6 caractères du string rot sont identiques aux 6 premiers caractères du string secteur
donc
If rot = "Voyage" Then 

if If secteur = "EURO" Then


la condition est toujours false
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
25 août 2015 à 10:02
Effectivement mon code est moins efficace que celui de Zermelo que je salue aussi pour son effort , en revanche dans mon cas le string est toujours numérique.
après pour les deux chaînes rot et secteur , à mon avis et peut être que je me trompe, mon code est relativement bon car le pointeur de lecture vérifie pour un premier temps et dans la première ligne si rot qui est mid(strline, 1 ,6 ) = "voyage", si oui j'extrais les données dont j'ai besoin dans la même ligne bien sur, ensuite je passe à la seconde ligne pour vérifier si secteur = "Euro" afin d'extraire d'autre donnée, d'ailleurs mon fichier de sortie est correcte.
si non oui je suis vraiment satisfait, non seulement du résultat, mais de toute l'équipe qui m'aide depuis mon inscription à ce site
Merci encore
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
Modifié par cs_mohellebi le 25/08/2015 à 10:17
oui , désolé je viens de vérifier c'était une erreur de ma part , je devais écrire l'instruction elseif secteur = "Euro" , sinon effectivement la condition est toujours false
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
24 août 2015 à 12:47
À cs_ShayW, merci de m'avoir appuyé.
À cs_mohellebi : si vous êtes satisfait, il vous est demandé de déclarer résolue cette discussion.
0
Rejoignez-nous