6
votes

Bonne façon de tester si une valeur est numérique dans c #

J'ai juste besoin de savoir si la valeur est numérique. Je n'ai rien à faire avec la valeur. Est-ce le meilleur moyen? Se sentir sale créer une variable que je n'utiliserai jamais au-delà de cela: xxx


4 commentaires

123.45 est numérique, mais échouera ce chèque. Testez-vous uniquement pour les entiers?


Il y a une fonction Char.Snumérique, si je me souviens bien


@Winston Smith - c'est hors de la question de cette question, comme 123.45 ne s'appliquerait jamais à un INT. Si c'était le cas, ils utiliseraient un flotteur et faire flotter.tryparse.


@thedixon - c'était mon point.


8 Réponses :


0
votes

C'est la meilleure façon de le faire à ma connaissance - c'est ce que les normes de notre société adhèrent toute façon en raison de la manipulation des erreurs étant effectuée dans l'analyse.

Ce détail Les avantages: https://web.archive.org/web/20150510214425/http://www.dotnetperls.com:80/int-trypsarse


1 commentaires

Lien mis à jour via la machine arrière; Original Tryparse n'est plus là.



2
votes

Ce n'est pas aussi flexible que int.tryparse , mais vous pouvez vérifier si chaque personnage est un nombre: xxx

en général, cependant, je voudrais Recommander coller avec int.tryparse . Vous pouvez même appeler le paramètre inutilisé "ignoré" pour être explicite sur votre intention, par exemple: xxx


2 commentaires

Vous devez ajouter une manipulation pour '+' , '' - ', ' ',' ". '" >, 'E' et 'e' , et peut-être d'autres que je suis négligeant, car ce sont des caractères non numériques pouvant apparaître dans une chaîne numérique.


@Phoog: Absolument accepté, c'est pourquoi j'ai recommandé int.tryparse à la fin. Je voudrais simplement offrir une autre façon de regarder le problème dans des conditions plus contraignantes.



3
votes

Oui, en utilisant la méthode Tryparse et Ignorer le paramètre out> est le meilleur moyen de le faire.

Vous voudrez peut-être envelopper cela dans votre propre ensemble de méthodes d'assistance (qui pourraient spécifier la culture appropriée, etc., si la valeur par défaut ne vous convient pas) et de retourner un bool sans le out paramètre pour les rendre plus faciles à appeler.

Bien sûr, vous devez déterminer quel type d'analyse est le plus approprié - même pour les entiers, vous devez déterminer si la plage de int32 suffit à votre cas d'utilisation. Dans mon expérience, la plupart des entrées numériques ont sa propre gamme «naturelle» de valeurs valides, ce qui est peu susceptible d'être exactement la plage de tout type prédéfini. Vous pouvez donc souhaiter développer vos méthodes d'assistance pour inclure la plage de valeurs valides à accepter.


4 commentaires

Si INT32 n'est pas assez grand et qu'il a .net 4, il pourrait utiliser system.numerics.biginteger.tryparse ()


@C. Lawrence Wenham: N'oubliez pas que les pauvres, négligés int64 !


@Lukeh: Ouais, mais BigInteger "va à 11".


@C. Lawrence Wenham: J'adore ça. Ce ne serait-il pas fabuleux d'avoir une langue où les types d'entier normaux ne sont-ils portés que [-10, 10], mais BigInteger est allé à 11?



0
votes

Vous pouvez essayer d'utiliser RegEX analysant pour déterminer qu'il n'y a pas de caractères non numériques dans une chaîne ou vous pouvez utiliser int.tryparse (), double.tryparse (), float.tryparse () en fonction de l'entrée. < / p>


0 commentaires

1
votes

C'est la façon recommandée de le faire en C #. Cependant, vous pouvez également ajouter microsoft.visalbasic.dll comme référence à votre projet, puis utiliser microsoft.visualbasic.information.isnumérique ()


0 commentaires

1
votes

Vous pouvez utiliser des expressions régulières

Regex _isNumber = new Regex(@"^\d+$");
_isNumber.IsMatch(txtFoo.Text);


0 commentaires

2
votes

"est numérique" est un terme ambigu.

  • CULTURE CAXE-CAXE?
  • Autorise des milliers et / ou des séparateurs décimaux?
  • Autoriser la notation scientifique?
  • Autoriser un signe (avant? Après? ...)
  • Quelle gamme de valeurs permettez-vous? Entier 32 bits signé (int32.tryparse), entier non signé 32 bits (uint32.tryparse), décimal, double, ...

    Il n'y a donc pas de "meilleure" voie, et le cadre fournit une multitude de façons différentes d'analyser les numéros.


0 commentaires

0
votes
bool test (string teststring) 
 { for (i=0;i==teststring.length;i++){
   if instr("0123456789.,-+Ee",teststring.substring(i,1) <0){return false;}
   // some additional tests below here if you like
   return true;
 }
however  E1001E12e.12e  would be noted as a number a little bit more magic is needed to do a  clean check, but then you might be able to determine if its a int or a float too..

0 commentaires