11
votes

C # convertir une décimale à un int en toute sécurité

J'essaie de convertir une décimale en un entier en toute sécurité.

quelque chose comme xxx

ceci reviendra false s'il ne peut pas convertir en un entier, et vrai w / Sortie réussie si elle peut.

Ceci est pour éviter de saisir la surflulation à la méthode décimale.Toint32. Quel est le moyen le plus simple de faire cela?


4 commentaires

Il n'y a que 2 cas dans lesquels cette overflowException est lancée, nommément x int.maxvalue, vous ne pouvez pas simplement utiliser un si ?


Que voulez-vous qu'il fasse s'il est donné, disons, 0.5?


Voulez-vous parler ou tronquer la décimale?


Je veux tronquer, tout comme le casting entier actuellement. Je sais que je peux vérifier contre.min et int.max, essayait d'éviter les contrôles supplémentaires depuis la fonction de conversion ces chèques aussi.


5 Réponses :


2
votes

comparer la décimale contre int.minvalue et int.maxvalue avant la conversion.


0 commentaires

11
votes

ici: xxx


1 commentaires

Notez que vous devez toujours attribuer à intval dans le chemin faux .



4
votes

J'écrirais une méthode d'extension pour la décimale de classe comme ceci: xxx

Vous pouvez l'utiliser de cette manière: xxx


0 commentaires

0
votes

Quel est le problème avec l'utilisation int32.tryparse (string)?


2 commentaires

Je ne suis pas intéressant dans la conversion de la décimale à une chaîne puis de retour à un entier. Cela coûterait beaucoup de performances et ne traiterait pas directement les décimales non entières.


Bien sûr que ce serait. Si vous faites int32.tryparse ("3.14", d) Vous obtiendriez un faux résultat.



0
votes

Pourquoi essayez-vous d'éviter d'attraper le OverflowException ? Il est là pour une raison et vous devriez totalement l'attraper là où vous appelez décimal.toint32 () . Des exceptions sont largement utilisées dans tout le cadre et les utilisateurs doivent les attraper. Les méthodes d'essai peuvent vous aider autour d'eux pour rendre le code plus serré et plus propre, mais où le framework n'a pas de méthode appropriée ( décimal.tryConvertToint32 () dans ce cas) attraper overflowException est la chose appropriée à faire. Il est effectivement plus clair que de faire une classe d'extension ou de rédiger votre propre méthode statique séparée (les deux impliquent la rédaction de votre propre code dans lequel le cadre vous donne déjà cette fonctionnalité).


3 commentaires

Vous suggérez-vous que vous devriez toujours attrape des exceptions, que vous devriez jamais essayer de les éviter? Si oui, c'est mauvais conseil. Évitez-les absolument lorsque cela est possible (en validant contre leurs causes connues, par exemple), et ne les attrapez que lorsque vous avez les moyens de les traiter réellement. Les exceptions sont chères et elles ne doivent pas être utilisées pour le flux de contrôle.


Vous avez raison et j'apprécie le commentaire. Il appartient au développeur de déterminer si cela se produira rarement ou fréquemment. Dans mon expérience, quelque chose comme OverflowException pour la conversion décimale.Toint32 ne se produirait que rarement et qu'un gestionnaire d'exception fonctionnerait bien pour définir le résultat de manière appropriée. Mais cela dépend du scénario et j'apprécie à nouveau que vous ajoutez cette note importante sur les performances des exceptions.


Jeter et attraper une exception est cher. La mise en place d'un bloc d'essai / attraper n'est pas, et si la condition qui provoque l'exception presque jamais se produit, il peut être moins cher en moyenne que la validation [validation qui sera répétée dans la conversion elle-même]