Je dois maintenir une ancienne application Web VB.NET. Le typage des données est, je dirais, incohérent. En particulier, il y a des données qui sont stockées parfois sous forme d'entiers et parfois de chaînes, et je dois analyser les chaînes de façon fiable. Si l'analyse échoue, elle doit toujours renvoyer 0.Analyser la chaîne en entier (en enfer ou en haute mer)
Le problème est que je ne peux utiliser aucune des fonctions d'analyse .NET/VB.NET pour cela, mais je dois me fier à une fonction self-made. Puis-je utiliser un appel de structure standard à un seul interligne pour effectuer toutes les tâches d'analyse de type String-to-Integer? Disons qu'il existe une chaîne qui peut être nulle, vide, contenir une représentation entière comme "10" ou contenir autre chose.
J'ai essayé ces derniers avec une chaîne d'entrée vide "":
CType(string, Integer) -> Conversion from string "" to type 'Integer' is not valid.
Convert.ToInt32(string) -> Input string was not in a correct format.
Integer.Parse(string) -> Input string was not in a correct format.
CInt(string) -> Conversion from string "" to type 'Integer' is not valid.
Val(string) -> Success!
Mais Val peut échouer. Le moyen infaillible est d'appeler une fonction self-made:
Public Function ToInteger(ByVal s As String) As Integer
s = Trim(s)
Dim i As Integer
Try
i = Val(s)
Catch ex As Exception
i = 0
End Try
Return i
End Function
Je pense que ça craint. C'est mauvais parce que:
- J'essaye d'analyser des chaînes en entiers! Ce n'est pas une science de fusée, même si la sémantique est impliquée.
- Les normes auto-élaborées ne collent pas très bien. Quelque part dans le code, vous trouverez toujours des solutions de cadre standard brisées
Il en résulte des bogues inutiles dans le logiciel. Et j'accuse le cadre standard pour cela. Sauf, bien sûr, une meilleure solution est trouvée :)
Merci pour toutes les réponses. Int32.TryParse est parfait ici. Mais si vous devez d'abord convertir l'entrée en chaîne, la distribution peut échouer. Comme lors de la lecture d'un objet de base de données avec une valeur DBNull possible.
Int32.TryParse est parfait ici, merci -mika- – mika
En fait, @Jon Int32.TryParse supprime automatiquement les espaces blancs pour vous. '" 32 "' aboutira à '32'. – David
@David: Merci, retiré cette dernière phrase. Il est même documenté pour l'ajuster :) –