2011-12-21 5 views
2

У меня есть значение, которое является либо числовым (любым) числовым типом, либо нумерованным числовым типом. Мне нужно проверить, равен ли это значение нулю или нет.Как определить, является ли значение равным нулю?

В принципе у меня есть это:

public bool IsZero(object value) 
{ 
    if (value == null) 
      return false; 

    //lifted from the mvc sources, so I guess it's exhaustive 
    HashSet<Type> numericTypes = new HashSet<Type>(new Type[] { 
     typeof(byte), typeof(sbyte), 
     typeof(short), typeof(ushort), 
     typeof(int), typeof(uint), 
     typeof(long), typeof(ulong), 
     typeof(float), typeof(double), 
     typeof(decimal) 
    }); 

    Type type = Nullable.GetUnderlyingType(value.GetType()) ?? value.GetType(); 

    if (!numericTypes.Contains(type)) 
     return false; 

    // how do I get the value here ? 
} 

Я не вижу простой способ сравнения целочисленного значения с Int нулем, и значение байта с нулевым байтом.

Обходной путь, который я вижу, - связать правильно введенное нулевое значение с каждым типом и проверить его, но я хотел бы повторно использовать решение, если мне в конечном итоге нужен метод «IsOne».

ответ

4

Вы можете объединить null проверку с помощью метода Convert.ToDouble.

+0

Хорошее предложение, недостатком является то, что 'null' также будет считаться нулевым. –

+0

@ShadowWizard. Нужно также иметь нулевую проверку - я пропустил это, потому что он уже присутствует в вопросе OPs. Ответ хороший ответ! –

8

Что в этом плохого?

return value != null && value.ToString().Equals("0"); 
+0

У меня было ощущение, что я не замечаю ничего очевидного. Тем не менее, это работает со всем, кроме десятичных знаков в форме «0.00», потому что они сохраняют точность, которую они указали с помощью :( – SWeko

+0

@SWeko странное поведение с десятичными знаками - рад, что у вас есть рабочее решение! :) –

0

Я бы посмотрел на то, чтобы присвоить значение чему-то вроде строки, а затем выполнить сравнение, поэтому вместо сравнения байта, байта, int с int и т. Д. Вы бросаете все в строку и сравниваете это. Если вам не нравится строка, вы можете наложить их на все, что угодно, если вы убедитесь, что значение не меняется и т. Д.

Другой (более длинный) способ сделать это, если вы хотите сравнить каждый тип с значением 0 его собственного типа будет делать оператор case для типа, но тогда вы получите намного больше кода.

Смежные вопросы