Conversion chêne de caractère en double [Résolu]

cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention - 23 août 2015 à 10:51 - Dernière réponse : cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention
- 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 
Afficher la suite 

Votre réponse

12 réponses

Zermelo 378 Messages postés samedi 22 septembre 2012Date d'inscription 13 août 2017 Dernière intervention - 23 août 2015 à 11:26
0
Merci
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.
Zermelo 378 Messages postés samedi 22 septembre 2012Date d'inscription 13 août 2017 Dernière intervention - 23 août 2015 à 11:48
Veuillez m'excuser. Une chaîne de caractères est un objet de classe String.
cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention - 23 août 2015 à 14:23
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
Commenter la réponse de Zermelo
Zermelo 378 Messages postés samedi 22 septembre 2012Date d'inscription 13 août 2017 Dernière intervention - 23 août 2015 à 20:45
0
Merci
mais avez-vous désactivé l'espace de noms Microsoft ?
Commenter la réponse de Zermelo
Whismeril 11816 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 23 août 2015 à 22:24
0
Merci
Bonjour, peux tu mettre un exemple de ton fichier texte, avec des données non confidentielles ou erronées.
Commenter la réponse de Whismeril
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 23/08/2015 à 22:30
0
Merci
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.
Commenter la réponse de cs_ShayW
Zermelo 378 Messages postés samedi 22 septembre 2012Date d'inscription 13 août 2017 Dernière intervention - 24 août 2015 à 09:18
0
Merci
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.
Commenter la réponse de Zermelo
cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention - Modifié par cs_mohellebi le 24/08/2015 à 10:15
0
Merci
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é
Commenter la réponse de cs_mohellebi
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 24/08/2015 à 10:35
0
Merci
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
cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention - 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
cs_mohellebi 103 Messages postés mercredi 31 octobre 2007Date d'inscription 10 juin 2018 Dernière intervention - 25 août 2015 à 10:15
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
Commenter la réponse de cs_ShayW
Zermelo 378 Messages postés samedi 22 septembre 2012Date d'inscription 13 août 2017 Dernière intervention - 24 août 2015 à 12:47
0
Merci
À cs_ShayW, merci de m'avoir appuyé.
À cs_mohellebi : si vous êtes satisfait, il vous est demandé de déclarer résolue cette discussion.
Commenter la réponse de Zermelo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.