Проверка, является ли объект числом в C # - PullRequest
81 голосов
/ 15 июля 2009

Я хотел бы проверить, является ли объект числом, чтобы .ToString() приводил к строке, содержащей цифры и +, -, .

Возможно ли это путем простой проверки типа в .net (например: if (p is Number))?

Или я должен преобразовать в строку, а затем попытаться разобрать в удвоение?

Обновление: Чтобы пояснить, мой объект - это int, uint, float, double, и так далее, это не строка. Я пытаюсь сделать функцию, которая сериализует любой объект в XML, как это:

<string>content</string>

или

<numeric>123.3</numeric>

или поднять исключение.

Ответы [ 11 ]

0 голосов
/ 28 июня 2019

При написании моего собственного метода расширения object.IsNumeric(), основанного на ответе Сола Долгина на этот вопрос, я столкнулся с потенциальной проблемой, заключающейся в том, что вы получите OverflowException, если попробуете его с double.MaxValue или double.MinValue.

Мое "решение" состояло в том, чтобы объединить принятый ответ от Нолдорина с ответом от Сола Долгина и добавить переключатель сопоставления с образцом, прежде чем пытаться что-то анализировать (и использовать некоторую доброту C # 7, чтобы немного привести в порядок):

public static bool IsNumeric(this object obj)
{
    if (obj == null) return false;

    switch (obj)
    {
        case sbyte _: return true;
        case byte _: return true;
        case short _: return true;
        case ushort _: return true;
        case int _: return true;
        case uint _: return true;
        case long _: return true;
        case ulong _: return true;
        case float _: return true;
        case double _: return true;
        case decimal _: return true;
    }

    string s = Convert.ToString(obj, CultureInfo.InvariantCulture);

    return double.TryParse(s, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out double _);
}
...