2009-02-06 5 views
1

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.

Répondre

13

Utilisez Int32.TryParse et ignorez la valeur de retour - utilisez simplement la valeur du paramètre out.

+0

Int32.TryParse est parfait ici, merci -mika- – mika

+0

En fait, @Jon Int32.TryParse supprime automatiquement les espaces blancs pour vous. '" 32 "' aboutira à '32'. – David

+0

@David: Merci, retiré cette dernière phrase. Il est même documenté pour l'ajuster :) –

7

Vous ne précisaient pas pourquoi vous ne pouviez pas utiliser ".NET/VB.Net analyse syntaxique des fonctions" donc je propose ceci: -

Public Function ToInteger(ByVal s As String) As Integer 
    Dim i as Integer 
    Integer.TryParse(s, i) 
    Return i 
End Function 
1

Un doubleur est-il suffisant? Ce qui suit est le code C#, mais je suis sûr que vous pouvez le porter à VB.NET sans trop problème:

int i; 
if(!Int32.TryParse(MyString, out i)) i=0; 

En fait, parce que TryParse vais-je mis à zéro en cas d'échec l'analyse syntaxique, vous ne besoin de l'instruction if:

int i; 
Int32.TryParse(MyString, out i); 
+0

La raison pour laquelle vous n'avez pas besoin de l'initialiser n'est pas parce que la valeur par défaut est 0, mais parce que c'est un paramètre out - sa valeur précédente est non pertinente. –

+0

Vrai - Je me suis accroché à la question stipulant qu'il devrait retourner 0 si l'analyse se passe mal, pensant que le comportement n'était pas défini s'il échouait (out = il doit définir/something/mais pas nécessairement zéro). Bien sûr, vérifier la documentation de TryParse révèle en effet que je serais mis à zéro. –

0

Si vous faites beaucoup de l'analyse des chaînes et ne savent pas ce qui pourrait être dans la chaîne que vous pouvez essayer d'utiliser regular expressions.Deux ou trois expressions régulières bien choisies devraient vider tout ce que vous cherchez.

Un outil comme regexbuddy est inestimable dans une situation comme celle-ci. Cela vous permettrait de concevoir des expressions régulières pour vos chaînes dans un environnement GUI où vous pourriez les tester sur vos différentes alternatives. Par exemple, les éléments suivants correspondent à un nombre quelconque dans une chaîne et correspondent à plusieurs nombres séparés par des espaces.

(\d*) 

Les expressions régulières sont parfois considérées comme un peu effrayantes, mais elles n'ont pas besoin d'être.

Questions connexes