Dans Visual Basic, les données sont souvent saisies par l'utilisateur sous forme de chaînes (par exemple, via TextBox ou InputBox), mais pour des traitements ultérieurs, il est nécessaire de les convertir en types numériques. Dans les anciennes versions de VB, une conversion laxiste était appliquée via Val ou CInt, ce qui entraînait des erreurs explicites et implicites en cas de données incorrectes. Il était présumé que la chaîne contenait toujours une valeur correcte, mais en pratique, les utilisateurs saisissent des caractères incorrects, ce qui provoque des erreurs ou des conversions incorrectes.
Le problème — la vulnérabilité de la conversion, entraînant un plantage de l'application ou des calculs erronés. Par exemple, Val("1a") renverra 1, ce qui peut être inattendu. L'utilisation de TryParse et une vérification stricte du format de saisie permettent d'éviter de telles erreurs et de traiter correctement les entrées.
La solution consiste à utiliser la méthode Integer.TryParse (ou Double.TryParse, etc.), qui ne renvoie True qu'en cas de conversion réussie.
Exemple de code :
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Un nombre correct a été saisi, la variable value contient la valeur Else MessageBox.Show("Veuillez saisir un entier") End If
Caractéristiques clés :
Pourquoi la fonction Val est-elle dangereuse lors du traitement des entrées utilisateur ?
Val renvoie une valeur numérique jusqu'au premier caractère non valide et ne lance pas d'erreur, ce qui peut entraîner une logique incorrecte.
Dim n = Val("12abc") ' Renverra 12, bien que la chaîne soit incorrecte
Quelle est la différence entre CInt et Integer.Parse ?
CInt effectue un arrondi à la banque, tandis qu'Integer.Parse exige une correspondance exacte de la chaîne avec le nombre et lance une exception en cas d'erreur.
Pourquoi TryParse ne renverra-t-il pas toujours True pour la chaîne "1,234" ?
Le résultat dépend des paramètres régionaux de Windows : parfois, le séparateur décimal est une virgule, d'autres fois, c'est un point. Il est important de spécifier clairement le format :
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
Le module financier recevait des données via InputBox, convertissait via Val, la somme de 10,5 devenait 10 dans certains cas (la virgule n'était pas reconnue et le point n'avait pas été saisi).
Avantages :
Inconvénients :
Passage à TryParse en tenant compte des paramètres culturels et de la validation du champ de saisie.
Avantages :
Inconvénients :