J'essaie de convertir une décimale en un entier en toute sécurité.
quelque chose comme p> ceci reviendra false s'il ne peut pas convertir en un entier, et vrai w / Sortie réussie si elle peut. p> Ceci est pour éviter de saisir la surflulation à la méthode décimale.Toint32. Quel est le moyen le plus simple de faire cela? P> p>
5 Réponses :
comparer la décimale contre int.minvalue code> et
int.maxvalue code> avant la conversion. P>
ici:
Notez que vous devez toujours attribuer à intval code> dans le chemin
faux code>.
J'écrirais une méthode d'extension pour la décimale de classe comme ceci: Vous pouvez l'utiliser de cette manière: p>
Quel est le problème avec l'utilisation int32.tryparse (string)? p>
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.
Pourquoi essayez-vous d'éviter d'attraper le OverflowException code>? Il est là pour une raison et vous devriez totalement l'attraper là où vous appelez
décimal.toint32 () code>. 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 () code> dans ce cas) attraper
overflowException code> 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é). P>
Vous suggérez-vous que vous devriez toujours i> attrape des exceptions, que vous devriez jamais i> 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 i> 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]
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 code>?
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.