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

Messages postés
103
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
10 juin 2018
-
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

8 réponses

Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
13
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
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
13 -
Veuillez m'excuser. Une chaîne de caractères est un objet de classe String.
cs_mohellebi
Messages postés
103
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
10 juin 2018
-
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
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
13
0
Merci
mais avez-vous désactivé l'espace de noms Microsoft ?
Commenter la réponse de Zermelo
Messages postés
12465
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 décembre 2018
737
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
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
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
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
13
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
Messages postés
103
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
10 juin 2018
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
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
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
Messages postés
103
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
10 juin 2018
-
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
Messages postés
103
Date d'inscription
mercredi 31 octobre 2007
Dernière intervention
10 juin 2018
-
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
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
13
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.