Search code examples
c#.netserializationtypesxml-serialization

Checking if an object is a number


I'd like to check if an object is a number so that .ToString() would result in a string containing digits and +, -, .

Is it possible by simple type checking in .NET? Like:

if (p is Number)

Or should I convert to string, then try parsing to double?

Update: To clarify my object is int, uint, float, double, and so on, it isn't a string. I'm trying to make a function that would serialize any object to XML like this:

<string>content</string>

or

<numeric>123.3</numeric>

or raise an exception.


Solution

  • You will simply need to do a type check for each of the basic numeric types.

    Here's an extension method that should do the job:

    public static bool IsNumber(this object value)
    {
        return value is sbyte
                || value is byte
                || value is short
                || value is ushort
                || value is int
                || value is uint
                || value is long
                || value is ulong
                || value is float
                || value is double
                || value is decimal;
    }
    

    This should cover all numeric types.

    Update

    It seems you do actually want to parse the number from a string during deserialisation. In this case, it would probably just be best to use double.TryParse.

    string value = "123.3";
    double num;
    if (!double.TryParse(value, out num))
        throw new InvalidOperationException("Value is not a number.");
    

    Of course, this wouldn't handle very large integers/long decimals, but if that is the case you just need to add additional calls to long.TryParse / decimal.TryParse / whatever else.