Je voudrais en finir definitivement avec les soucis de conversion - une petite a

Résolu
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 15 nov. 2011 à 19:09
 us_30 - 17 nov. 2011 à 23:00
Bonsoir,

Je m’aperçois que 80% de mes requêtes ont trait a un souci de conversions que je n'arrive pas a comprendre malgré pas mal de lecture
alors je voudrais, par un exemple simple, régler le problème

voila
Un form
3 textbox A B C
J'entre a la main des valeurs disons comprises entre 100 et 200 dans A et B
C contiendra la valeur de A + B grâce a un button calcul

Moi je ferais pour ce qui est de la déclaration

Dim valA As Double
Dim valB As Double
Dim valB As Double


Ou je coince c'est pour le calcul
je ferais sur calcul.click

ValC = ValA + ValB

Mais après je me mélange complétement les pinceaux avec les Cstr, Tostring et autre Cdbl

Quelqu'un pourrait il de manière très simple me montrer comment utiliser a bon escient ces paramètres ???

Mille merci par avance

60 réponses

ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
16 nov. 2011 à 10:23
Attila,


un double, ne peut pas contenir une chaine (string), je dois convertir Mon textboxC (textboxC.Text) en chaine


Le texteBox est un chaîne !
En fait on utilise le mot conversion, qui signifie acceptation de l'un par l'autre en pratique.
dim A as double = cdbl(textbox1.text)

Option Explicit On
Public Class Form1
Public ValA, ValB, ValC, ValSE As double
.
Private Sub Form1.Load .....
TextBox1.text = "" ' fait ceci...
TextBox2.text = "" ' fait cela...
TextBox3.text = "" ' fait ça...
End Sub


' NE PAS DONNER DES NOMS AUX OBJETS TANT QUE LEUR CODE
' EST SUSCEPTIBLES D'ETRE UTILISE PAR D'AUTRES, SINON
' ÇA OBLIGE A RENOMME LES OBJETS DE CELUI QUI COPIE
' LE CODE !

sub buttoncalcul.clic ...... ' attribue des valeurs
valA = cdbl(TextBox1.text)
valB = cdbl(TextBox2.text)
valC = cdbl(TextBox3.text)
valSE = ???
calcul()
End Sub


' A CET ENDROIT C'EST PLU LOGIQUE
' ON ENLEVE "PRIVATE"
' ValSE (LE DECLARER) : N'A PAS DE VALEUR

sub calcul() ' calcule les valeurs...
valA = (valB / 2) + valC
TextBox1.text = format(valSE,"0.00")
End Sub

End Class


Cordialement, Joe.
3
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
16 nov. 2011 à 14:07
Code testé :

Option Explicit On
Public Class Form1
  Dim ValA As Double = 0
  Dim ValB As Double = 0
  Dim ValC As Double = 0
  Dim ValD As Double = 0

  Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    A.Text = Format(Form2.valZ, "0.00") ' textbox Z
    ValA = Form2.valZ
    B.Text = Format(Form2.valY, "0.00") ' textBox Y
    ValB = Form2.valY
    C.Text = ""
    D.Text = ""
  End Sub

  Sub buttoncalculate_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttoncalculate.Click
    Call Calcul()
  End Sub

  Sub Calcul()
    If ValA > 0 Then
      ValC = ValB - ValA
      C.Text = Format(ValC, "0.00")
      ValD = ValC / 2
      D.Text = Format(ValD, "0.00")
    Else
      ValC = 0
      C.Text = "0.00"
      D.Text = "0.00"
    End If
  End Sub
End Class


Option Explicit On
Public Class Form2
  Public valY As Double = 16
  Public valZ As Double = -10
End Class


Quand quelque chose ne va pas, affiche tes variables :

msgbox("valA " & valA & vblf & "valB " & valB & vblf & "valC = " & valC & vblf & "valD = " & valD & vblf & "Form2.valY = " & valY & vblf & "Form2.valZ = " & valZ, vbinformation)


C......... J.......
3
Utilisateur anonyme
15 nov. 2011 à 19:47
Salut Atilla,

    Private Sub A_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles A.KeyUp
        A.Text = Replace(A.Text, ",", ".")
        For Each Caractere In A.Text
            If IsNumeric(Caractere) = False And Caractere <> "." Then
                A.Text = A.Text.Remove(A.TextLength - 1)
            End If
        Next
        A.SelectionStart = A.TextLength
        C.Text = Val(A.Text) + Val(B.Text)
    End Sub

    Private Sub B_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles B.KeyUp
        B.Text = Replace(B.Text, ",", ".")
        For Each Caractere In B.Text
            If IsNumeric(Caractere) = False And Caractere <> "." Then
                B.Text = B.Text.Remove(B.TextLength - 1)
            End If
        Next
        B.SelectionStart = B.TextLength
        C.Text = Val(A.Text) + Val(B.Text)
    End Sub


Ça gère les décimales aussi.. avec une virgule ou un point...
Ça résout ton problème?




CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2011 à 19:56
Bonjour,

Voilà plusieurs discussions ouvertes autour de la chose.
Dès la toute première, il me semble t'avoir demandé (question restée sans réponse), où et comment tu attribuais une valeur à ces trois variables.
La chose peut durer longtemps, très longtemps, ainsi !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

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

Posez votre question
Utilisateur anonyme
15 nov. 2011 à 19:58
Bonsoir à vous 2.

Le premier réflexe qu'il faut avoir c'est d'activer Option Strict sur On dans les propriétés du projet.
Et de décocher la référence du nom Microsoft.VisualBasic.
Ainsi, tu n'auras plus affaire avec les fameux Cdbl Csng Cint et compagnie qui sont de toute façon complètement obsolète.
Mais surtout sers toi de msdn et lis aussi les cours de Mr Lasserre
Bon courage.
0
Utilisateur anonyme
15 nov. 2011 à 20:00
Bonsoir à vous 3 pardon,
ucfoutu vient de surgir de je ne sais où
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
15 nov. 2011 à 21:19
Bonjour Attila N°54


Mais après je me mélange complétement les pinceaux avec les Cstr, Tostring et autre Cdbl



C'est quoi "après", ça dépend ce que tu veux faire ?

Cordialement, Joe.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 nov. 2011 à 23:08
Bonjour à tous

bien suivre les instructions de Banana32
ce que j'ai fait avec tous mes projets
résultat te force à mettre de l'ordre
et te servir seulement des methode net
ex cint devient
System.Convert.ToInt32(dNumber)

toute une class de conversion
system.convert
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
15 nov. 2011 à 23:30
Bonsoir,

Dim A As Double
Dim B As Double
Dim C As Double

Le textBox est de type alphanumérique (string)
Donc :
A = cdbl(textboc1.text)
B = cdbl(textboc2.text)
C = A + B

Tu as une valeur ayant comme origine un type STRING, tu veux le mettre dans une variable de type numeric DOUBLE, donc (et sauf exception avec VAL entre autres), un type numérique spécialisé ne peut pas recevoir une chaine, logique puisqu'elle peut contenir des lettres, donc il faut utiliser une conversion permettant au double de convertir cette chaîne en double.

En gros
STRING
Peut recevoir n'importe quoi ou presque (int, long, single, duble, boolean).

A contrario, un NUMERIC ne peut pas recevoir une chaîne, alors dans ce sens il faut généralement convertir :
dim ch as string
dim x1 as double
x1 = cdbl(ch)
dim x2 as long
x2 = clng(ch)
dim x3 as integer
x3 = cint(ch)

Mais... la taille du NUMERIC compte aussi, par exemple un integer étaut (est ?) d'une contenance de -32000 à 32000 environ, donc tu ne pourra entre deux variables numériques, que recevoir des valeur d'autre variables dont le contenu ne dépasse pas celui de la variable receveuse.
exp :
dim i as integer = 65000
dim b as byte
Byte ne reçois que 256 maximum, alors il ne faut pas lui filer une autre variable numérique qui contiendrait 65000, par contre si i = 200, dans ce cas tu peut recevoir dans une variable byte le contenu d'une variable integer dont le contenu ne dépasse pas la taille dy type byte...

Ce n'est pa sdifficile, il faut que tu apprennes ce que reçoive les variables selon leur type, et ce que peuvent contenir les variables numériques (entiers, et décimaux)...

Ouf ! Cordialement, Joe.
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 09:35
Merci a tous pour l'explication
mon probleme est recurrent et je le sais
j'arrive en general a poser le probleme normalement mais des que je passe au calcul, j'ai toujours ou presque une erreur du style "option explicit on ne supporte pas les conversions de ... en ....

je vois souvent par exemple des choses du style
Public ValA As Double
Public ValB As Double
Public ValC As Double
.
.
valA = (valB / 2) + .valC
A.Text = valSE.ToString("0.00")

Savoir ce que veut dire string ou double ou autre ne pose pas de souci.
Ce que je ne comprends pas, c'est l'articulation du problème

En francais ca donnerait pour moi :
J'ai 3 textbox A B C
Les Valeurs contenues dans A B C seront des Doubles
La valeur contenue dans le textbox A sera = Valeur contenue dans le textboxB divisee par 2 + Valeur contenue dans le textboxC

Apres je ne comprends pas le pourquoi du
A.Text = valSE.ToString("0.00")

C'est juste ce point qui me gene
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 09:39
Après que les valeurs soient calculées ou entrées au clavier, je ne vois pas du tout ce que cela change,au cas cite plus haut, je rentre au clavier valB et valC en tapant un point pour la virgule
ValC est elle calculée
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 nov. 2011 à 09:43
Et on continue !
Où donc et comment, dans ton code, initialises-tu (donnes-tu une valeur) à ValA, ValB et ValC ?
et voilà que maintenant apparaît même une valSE ( sortie d'où ?)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 09:47
Don si je te suis bien EhJoe, compte tenu que ValC qui est un double, ne peut pas contenir une chaine (string), je dois convertir Mon textboxC (textboxC.Text) en chaine d'ou A.Text = valA.ToString("0.00")

dailleur dans le code precedant, il faut lire A.Text = valA.ToString("0.00")
a la place de A.Text = valSE.ToString("0.00") J'avais repris un ancien exemple et mon copier coller a raté.
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 09:58
Je ne vois pas ce que tu demandes ucfoutu surtout si tu me rales dessus
pour SE voir post juste avant

pour le reste
Public Class Form1
Public ValA, ValB, ValC As double
.
Private Sub Form1.Load .....
A.Text = ""
B.Text = ""
C.Text = ""
End Sub

Private sub calcul()
valA = (valB / 2) + .valC
A.Text = valSE.ToString("0.00")
End Sub

Private sub buttoncalcul.clic ......
calcul()
End Sub
End Class
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 09:59
si je pouvais editer pour SE se serait plus simple
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 10:49
Bon ben voila, c'est clair maintenant les commentaires sont plus explicites pour moi qu'un gros bloc de code que je ne maitrise encore pas assez
Mais je travaille avec le cours "lasserre" de vb.net mais le "pavé de 1500 pages est rude pour mon gosier ...)

Merci a tous
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 nov. 2011 à 11:08
Je ne vois pas ce que tu demandes ucfoutu surtout si tu me rales dessus


Je ne te "râle pas dessus", Attila54, mais :

Tout ce temps perdu ! et pourquoi donc ?

tu ne m'as pas répondu, dans Cette discussion vielle d'environ deux semaines déjà
à la question que je te posais pourtant à propos d'où et de la manière dont du donnais une valeur à tes variables. Pour mémoire :
1) où et comment sont mises à jour les variables ValA et ValB ?

et c'était un message du ... 31 octobre
tu as depuis ouvert deux autres discussions, dont la présente, mais toujours en ne "pipant pas le moindre mot" sur l'initialisation de tes variables !
Et voilà ===>> deux bonnes semaines de perdues alors qu'une réponse auraitr clarifié la situation.
Voilà tout (et cherche le responsable).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
16 nov. 2011 à 11:15

J'ai 3 textbox A B C
Les Valeurs contenues dans A B C seront des Doubles


A, B et C étant trois textBox, les valeurs "contenues" dans ces derniers ne peuvent être des doubles, mais des string (alphanumériques), c'est quand elle en sortiront qu'on les taitera selon ce que l'on peut et veut faire...


La valeur contenue dans le textbox A sera = Valeur contenue dans le textboxB divisee par 2 + Valeur contenue dans le textboxC


dim aa as double = 0
dim bb, cc as double
bb = cdbl(B.text)
cc = cdbl(C.text)
if bb <> 0 then aa = bb / cc
A.text = aa


Cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
16 nov. 2011 à 11:27

La valeur contenue dans le textbox A sera = Valeur contenue dans le textboxB divisee par 2 + Valeur contenue dans le textboxC


Il ne fait pas considérer qu'il y a des valeurs dans les textBox, il il a des chaîne alphanumérique dans les texteBox et c'est tout, c'est quand on le sortira (le texte) dans des variable numériques définies qu'on pourra aborder ça sous une forme numérique et parler de valeur.

valA = (valB / 2) + .valC


Je doute que ça marche, ceci .valC à cause du point devant (valC).


A.Text = valSE.ToString("0.00")


- ValSE est indéfini, on ne sait pas ce que c'est ni ce que ça contient ?

A.text = format(valSE,"0.00")


C.... J.....
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
16 nov. 2011 à 11:46
et, juste pour finir
si je veux forcer selon un cas l'affichage d'un resultat a une textbox vide

exemple :
If ValA =< 0 Then 
ValX = ValA + ValB
X.Text = ValX.ToString("0.00")
End If

If ValA > 0 Then 
ValX = ' la je veux que ValX ne soit rien du tout c'est a dire que la textbox contenant la valeur soit vide
X.Text = ValX.ToString("0.00")
End If


quelle est la syntaxe pour ValX ??? Cdbl("") ??
0
Rejoignez-nous