При написании моего собственного метода расширения 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 _);
}