2008-11-26 7 views
4

J'ai une fonction qui, entre autres choses, prend un objet et un type, et convertit l'objet en ce type. Cependant, l'objet d'entrée est souvent un double, et le type une certaine variation de int (uint, long, etc.). Je veux que cela fonctionne si un nombre rond est passé en double (comme 4.0), mais pour lancer une exception si un nombre décimal est passé en (4.3). Existe-t-il un moyen plus élégant de vérifier si le Type est une sorte d'int?Vérifiez pour tout type int en C#?

if (inObject is double && (targetType == typeof (int) 
         || targetType == typeof (uint) 
         || targetType == typeof (long) 
         || targetType == typeof (ulong) 
         || targetType == typeof (short) 
         || targetType == typeof (ushort))) 
{ 
    double input = (double) inObject; 
    if (Math.Truncate(input) != input) 
     throw new ArgumentException("Input was not an integer."); 
} 

Merci.

+0

Juste un couple de commentaires - 1) ne pas oublier les flotteurs. 2) Vous pouvez utiliser Math.Round(), car 1.000000001 apparaît parfois au lieu de 1.0 en raison de problèmes de virgule flottante. –

+0

Semble aussi que vous dupliquez des fonctionnalités dans System.Convert ... –

+0

Bons points, Jon, je ferai en sorte de me souvenir des flotteurs. Dave, quand vous faites System.Convert.ChangeType de double à int, il fait silencieusement l'arrondi des banquiers. Ce code doit empêcher cela avant que l'appel System.Convert soit effectué. –

Répondre

6

Cela semble faire ce que vous demandez. Je l'ai seulement testé pour les doubles, les flotteurs et les ints.

public int GetInt(IConvertible x) 
    { 
     int y = Convert.ToInt32(x); 
     if (Convert.ToDouble(x) != Convert.ToDouble(y)) 
      throw new ArgumentException("Input was not an integer"); 
     return y; 
    } 
0

Vous devriez être en mesure d'utiliser une combinaison de Convert.ToDecimal et x% y, j'aurais pensé, y = 1 et vérifier le résultat == 0;

+0

Je pense que vous trouverez que ce n'est pas vrai ... ? 2,4% 1 0,39999999999999991 – PolyglotProgrammer

2
int intvalue; 
if(!Int32.TryParse(inObject.ToString(), out intvalue)) 
    throw InvalidArgumentException("Not rounded number or invalid int...etc"); 

return intvalue; //this now contains your value as an integer! 
Questions connexes