Un souci bizarre dans ma boucle

Résolu
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 9 oct. 2012 à 10:30
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 10 oct. 2012 à 10:29
Bonjour,
voila, je rencontre un souci dans le traitement d'une donnée, ceci dans une boucle pourtant simplissime :
' la valeur affichee par QILEFT.Text est chargée via une feuille excel et pas de souci de ce coté
'Dans mes declarations initiales
Public ValQILEFT As Double
Public ValQI As Double
'pour l'oeil gauche
          If TextBoxosod.Text = "OS" Then
                If valQILEFT <= -0.3 Then
                ValQI = 1
                End If
                If valQILEFT > -0.3 Or valQILEFT < 0.3 Then
                ValQI = 2
                End If
                If valQILEFT >= 0.3 Then
                ValQI = 3
                End If
 QI.Text = VALQI.ToString("0.00")
          End If

Comme ceci, quelle que soit la valeur affichée par QILEFT ma valeur affichée par la textbox QI est toujours de 2.00

si maintenant je teste comme cela :
'Dans mes declarations initiales
Public ValQILEFT As Double
Public ValQI As Double
'pour l'oeil gauche
If TextBoxosod.Text = "OS" Then
      If QILEFT.Text <= "-0.3" Then
      QI.Text = "1"
      End If
      If QILEFT.Text > "-0.3" Or QILEFT.Text < "0.3" Then
      QI.Text = "2"
      End If
      If QILEFT.Text >= "0.3" Then
      QI.Text = "3"
      End If
End If

j'ai les bonnes valeurs affichées pour les cas 2 et 3 mais pour le cas 1 (donc valeurs <= -0.3 du style -0.36), j'ai le 2 affiché au lieu du 1

Que peut il se passer ?
Merci bien

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 oct. 2012 à 11:44
Allons !
Clique sur le tag "réponse acceptée", que l'on en finisse maintenant avec ce "sujet"


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
Utilisateur anonyme
10 oct. 2012 à 08:01
Bonjour,

Convert.ToDouble est risqué. Utilise plutôt Double.TryParse pour garantir un résultat sans risque d'erreur de conversion.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 oct. 2012 à 10:36
Bonjour,
La chaîne de caractères "-0.36" est certes plus grande que la chaîne de caractères "-0.3" !
Ce qui n'est pas le cas du nombre -0.36, qui, lui, est plus petit que le nombre -0.3
C'est clair !
Il est très maladroit de faire des comparaisons de nombres à partir des strings qui les re^présenterait !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 10:45
Bonjour ucfoutu
Je crois comprendre ce que tu veix dire, mais dans ce cas, pourquoi alors mon premier code me renvoie toujours 2.00 ?? et si le mets ma chaine de caractere a "-0.30" au lieu de "-0.36" j'obtiens la même erreur
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 oct. 2012 à 10:52
parce que ta 2ème condition vient écraser la 1ère, pardi !
Car si VALQLEFT est <= -3, il l'est également inférieur à 0.3.
Non ? Tu n'en as pas conscience ? Ce n'est pas évident ?
Tu devrais plutôt passer à des conditions Else ou à un Select Case. Cela t'embrouillerait moins !



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 11:08
alors j'ai essayé ca aussi mais idem, rien ne fonctionne ..
If TextBoxosod.Text = "OS" Then
                      Select Case VALQILEFT
                        Case Is <= -0.3
                            ValQI = 1
                        Case Is > 0.3
                            ValQI = 2
                        Case Else
                            ValQI = 3
                      End Select
                      QI.Text = ValQI.ToString("0.00")
End If


et pour etre tout a fait franc, non ca ne me saute absolument pas aux yeux immediatement
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 oct. 2012 à 11:16
et pour etre tout a fait franc, non ca ne me saute absolument pas aux yeux immediatement

en réponse à :
Car si VALQLEFT est <= -3, il l'est également inférieur à 0.3.
Non ? Tu n'en as pas conscience ? Ce n'est pas évident ?

Alors prends ton temps ...
Quand-même
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 11:27
ah oui non mais ca c'est sur que tu as raison, c'est le fait que le condition 2 ecrase la condition 1 qui ma echappé en fait je veux repartir les conditions comme cela :
- Pour tout QILEFT =< "-0.30" (par exemple -0.36) alors j'affiche 1
-Pour tout QILEFT compris entre -2.99 et 2.99(par exemple -1.36) alors j'affiche 2
-Pour tout QILEFT > "0.30" (par exemple 1.36) alors j'affiche 3
je dois me planter quelque part mais c'est bizarre je ne vois rien du tout hormis peut etre le Or qui devrait etre un And ???
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 11:38
euh je crois que j'ai reussi comme cela :
If TextBoxosod.Text = "OS" Then
Dim VALQILEFT As Double = Convert.ToDouble(QILEFT.Text)                      
                     Select Case VALQILEFT
                        Case Is <= -0.3
                            ValQI = 1
                        Case Is > 0.3
                            ValQI = 2
                        Case Else
                            ValQI = 3
                      End Select
                      QI.Text = ValQI.ToString("0.00")
End If


je ne suis pas certain que ce soit tres elegant car y'a des conversions un peu partout mais ca fonctionne en tout cas.
Pourrais je avoir un avis avisé sur ce bout de code et une optimisation eventuelle ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 oct. 2012 à 11:38
1) Utilise un point d'arrêt et regarde, avec ton dernier code, ce que contient VALQILEFT
2)
je veux repartir les conditions comme cela :
- Pour tout QILEFT =< "-0.30" (par exemple -0.36) alors j'affiche 1
-Pour tout QILEFT compris entre -2.99 et 2.99(par exemple -1.36) alors j'affiche 2
-Pour tout QILEFT > "0.30" (par exemple 1.36) alors j'affiche 3

s'exprime bêtement ainsi :
Select Case VALQILEFT
                        Case Is <= -0.3
                            ValQI = 1
                        Case Is > 0.3
                            ValQI = 3
                        Case Else
                            ValQI = 2
                      End Select


Non ? (question de logique pure et non de développement) !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 11:43
Ah oui c'est ce que j'avais essayé de faire juste avant mais j'avais laissé tomber car j'avais "oublié" de comprendre que je devais absolument mettre Dim VALQILEFT As Double = Convert.ToDouble(QILEFT.Text)si je voulais que cela fonctionne
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
9 oct. 2012 à 11:53
merci bien pour ton aide
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
10 oct. 2012 à 10:29
c'est parti pour double.tryparse
merci beaucoup
0
Rejoignez-nous