Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using .Net, how can I determine if a type is a Numeric ValueType?

But here's an example:

Dim desiredType as Type if IsNumeric(desiredType) then ... 

EDIT: I only know the Type, not the Value as a string.

Ok, so unfortunately I have to cycle through the TypeCode.

But this is a nice way to do it:

 if ((desiredType.IsArray))       return 0;   switch (Type.GetTypeCode(desiredType))  {       case 3:       case 6:       case 7:       case 9:       case 11:       case 13:       case 14:       case 15:           return 1;  }  ;return 0; 
like image 589
Nescio Avatar asked Sep 23 '08 22:09

Nescio


People also ask

What is typeof () in C#?

The typeof is an operator keyword which is used to get a type at the compile-time. Or in other words, this operator is used to get the System. Type object for a type. This operator takes the Type itself as an argument and returns the marked type of the argument.

How do you check if a number is a double in C#?

IsNaN() Method in C# In C#, Double. IsNaN() is a Double struct method. This method is used to check whether the specified value is not a number (NaN).


2 Answers

A few years late here, but here's my solution (you can choose whether to include boolean). Solves for the Nullable case. XUnit test included

/// <summary> /// Determines if a type is numeric.  Nullable numeric types are considered numeric. /// </summary> /// <remarks> /// Boolean is not considered numeric. /// </remarks> public static bool IsNumericType( Type type ) {     if (type == null)     {         return false;     }      switch (Type.GetTypeCode(type))     {         case TypeCode.Byte:         case TypeCode.Decimal:         case TypeCode.Double:         case TypeCode.Int16:         case TypeCode.Int32:         case TypeCode.Int64:         case TypeCode.SByte:         case TypeCode.Single:         case TypeCode.UInt16:         case TypeCode.UInt32:         case TypeCode.UInt64:             return true;         case TypeCode.Object:             if ( type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))             {                return IsNumericType(Nullable.GetUnderlyingType(type));             }             return false;     }     return false; }    /// <summary> /// Tests the IsNumericType method. /// </summary> [Fact] public void IsNumericTypeTest() {     // Non-numeric types     Assert.False(TypeHelper.IsNumericType(null));     Assert.False(TypeHelper.IsNumericType(typeof(object)));     Assert.False(TypeHelper.IsNumericType(typeof(DBNull)));     Assert.False(TypeHelper.IsNumericType(typeof(bool)));     Assert.False(TypeHelper.IsNumericType(typeof(char)));     Assert.False(TypeHelper.IsNumericType(typeof(DateTime)));     Assert.False(TypeHelper.IsNumericType(typeof(string)));      // Arrays of numeric and non-numeric types     Assert.False(TypeHelper.IsNumericType(typeof(object[])));     Assert.False(TypeHelper.IsNumericType(typeof(DBNull[])));     Assert.False(TypeHelper.IsNumericType(typeof(bool[])));     Assert.False(TypeHelper.IsNumericType(typeof(char[])));     Assert.False(TypeHelper.IsNumericType(typeof(DateTime[])));     Assert.False(TypeHelper.IsNumericType(typeof(string[])));     Assert.False(TypeHelper.IsNumericType(typeof(byte[])));     Assert.False(TypeHelper.IsNumericType(typeof(decimal[])));     Assert.False(TypeHelper.IsNumericType(typeof(double[])));     Assert.False(TypeHelper.IsNumericType(typeof(short[])));     Assert.False(TypeHelper.IsNumericType(typeof(int[])));     Assert.False(TypeHelper.IsNumericType(typeof(long[])));     Assert.False(TypeHelper.IsNumericType(typeof(sbyte[])));     Assert.False(TypeHelper.IsNumericType(typeof(float[])));     Assert.False(TypeHelper.IsNumericType(typeof(ushort[])));     Assert.False(TypeHelper.IsNumericType(typeof(uint[])));     Assert.False(TypeHelper.IsNumericType(typeof(ulong[])));      // numeric types     Assert.True(TypeHelper.IsNumericType(typeof(byte)));     Assert.True(TypeHelper.IsNumericType(typeof(decimal)));     Assert.True(TypeHelper.IsNumericType(typeof(double)));     Assert.True(TypeHelper.IsNumericType(typeof(short)));     Assert.True(TypeHelper.IsNumericType(typeof(int)));     Assert.True(TypeHelper.IsNumericType(typeof(long)));     Assert.True(TypeHelper.IsNumericType(typeof(sbyte)));     Assert.True(TypeHelper.IsNumericType(typeof(float)));     Assert.True(TypeHelper.IsNumericType(typeof(ushort)));     Assert.True(TypeHelper.IsNumericType(typeof(uint)));     Assert.True(TypeHelper.IsNumericType(typeof(ulong)));      // Nullable non-numeric types     Assert.False(TypeHelper.IsNumericType(typeof(bool?)));     Assert.False(TypeHelper.IsNumericType(typeof(char?)));     Assert.False(TypeHelper.IsNumericType(typeof(DateTime?)));      // Nullable numeric types     Assert.True(TypeHelper.IsNumericType(typeof(byte?)));     Assert.True(TypeHelper.IsNumericType(typeof(decimal?)));     Assert.True(TypeHelper.IsNumericType(typeof(double?)));     Assert.True(TypeHelper.IsNumericType(typeof(short?)));     Assert.True(TypeHelper.IsNumericType(typeof(int?)));     Assert.True(TypeHelper.IsNumericType(typeof(long?)));     Assert.True(TypeHelper.IsNumericType(typeof(sbyte?)));     Assert.True(TypeHelper.IsNumericType(typeof(float?)));     Assert.True(TypeHelper.IsNumericType(typeof(ushort?)));     Assert.True(TypeHelper.IsNumericType(typeof(uint?)));     Assert.True(TypeHelper.IsNumericType(typeof(ulong?)));      // Testing with GetType because of handling with non-numerics. See:     // http://msdn.microsoft.com/en-us/library/ms366789.aspx      // Using GetType - non-numeric     Assert.False(TypeHelper.IsNumericType((new object()).GetType()));     Assert.False(TypeHelper.IsNumericType(DBNull.Value.GetType()));     Assert.False(TypeHelper.IsNumericType(true.GetType()));     Assert.False(TypeHelper.IsNumericType('a'.GetType()));     Assert.False(TypeHelper.IsNumericType((new DateTime(2009, 1, 1)).GetType()));     Assert.False(TypeHelper.IsNumericType(string.Empty.GetType()));      // Using GetType - numeric types     // ReSharper disable RedundantCast     Assert.True(TypeHelper.IsNumericType((new byte()).GetType()));     Assert.True(TypeHelper.IsNumericType(43.2m.GetType()));     Assert.True(TypeHelper.IsNumericType(43.2d.GetType()));     Assert.True(TypeHelper.IsNumericType(((short)2).GetType()));     Assert.True(TypeHelper.IsNumericType(((int)2).GetType()));     Assert.True(TypeHelper.IsNumericType(((long)2).GetType()));     Assert.True(TypeHelper.IsNumericType(((sbyte)2).GetType()));     Assert.True(TypeHelper.IsNumericType(2f.GetType()));     Assert.True(TypeHelper.IsNumericType(((ushort)2).GetType()));     Assert.True(TypeHelper.IsNumericType(((uint)2).GetType()));     Assert.True(TypeHelper.IsNumericType(((ulong)2).GetType()));     // ReSharper restore RedundantCast      // Using GetType - nullable non-numeric types     bool? nullableBool = true;     Assert.False(TypeHelper.IsNumericType(nullableBool.GetType()));     char? nullableChar = ' ';     Assert.False(TypeHelper.IsNumericType(nullableChar.GetType()));     DateTime? nullableDateTime = new DateTime(2009, 1, 1);     Assert.False(TypeHelper.IsNumericType(nullableDateTime.GetType()));      // Using GetType - nullable numeric types     byte? nullableByte = 12;     Assert.True(TypeHelper.IsNumericType(nullableByte.GetType()));     decimal? nullableDecimal = 12.2m;     Assert.True(TypeHelper.IsNumericType(nullableDecimal.GetType()));     double? nullableDouble = 12.32;     Assert.True(TypeHelper.IsNumericType(nullableDouble.GetType()));     short? nullableInt16 = 12;     Assert.True(TypeHelper.IsNumericType(nullableInt16.GetType()));     short? nullableInt32 = 12;     Assert.True(TypeHelper.IsNumericType(nullableInt32.GetType()));     short? nullableInt64 = 12;     Assert.True(TypeHelper.IsNumericType(nullableInt64.GetType()));     sbyte? nullableSByte = 12;     Assert.True(TypeHelper.IsNumericType(nullableSByte.GetType()));     float? nullableSingle = 3.2f;     Assert.True(TypeHelper.IsNumericType(nullableSingle.GetType()));     ushort? nullableUInt16 = 12;     Assert.True(TypeHelper.IsNumericType(nullableUInt16.GetType()));     ushort? nullableUInt32 = 12;     Assert.True(TypeHelper.IsNumericType(nullableUInt32.GetType()));     ushort? nullableUInt64 = 12;     Assert.True(TypeHelper.IsNumericType(nullableUInt64.GetType())); } 
like image 109
SFun28 Avatar answered Sep 29 '22 16:09

SFun28


You can find out if a variable is numeric using the Type.GetTypeCode() method:

TypeCode typeCode = Type.GetTypeCode(desiredType);  if (typeCode == TypeCode.Double || typeCode == TypeCode.Integer || ...)      return true; 

You'll need to complete all the available numeric types in the "..." part ;)

More details here: TypeCode Enumeration

like image 42
Jon Limjap Avatar answered Sep 29 '22 17:09

Jon Limjap