Проверка, имеет ли переменная тип данных double - PullRequest
8 голосов
/ 22 марта 2012

Мне нужно проверить, имеет ли моя переменная тип данных double.Вот что я попробовал:

try
{
    double price = Convert.ToDouble(txtPrice.Text);
}
catch (FormatException)
{
    MessageBox.Show("Product price is not a valid price", "Product price error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return false;
}

Я думал, что это сработает, но, очевидно, я не смог понять, если в txtPrice.Text есть что-то кроме числа, класс Convert просто проанализирует егоout.

Как я могу реально проверить, является ли переменная двойной?

Ответы [ 10 ]

28 голосов
/ 22 марта 2012

Используйте это:

double price;
bool isDouble = Double.TryParse(txtPrice.Text, out price);
if(isDouble) {
  // double here
}
10 голосов
/ 22 марта 2012

Как я могу достоверно проверить, является ли переменная двойной?

Вы должны быть более ясными о том, что вы действительно пытаетесь сделать здесь. Я не думаю, что вы спрашиваете, о чем вы думаете, и вам стоит знать о различиях в терминологии.

Если у вас есть переменная , объявленная типа double, то это определенно double. Если у вас есть переменная, объявленная как тип object, ValueType или один из поддерживаемых интерфейсов, вы можете использовать

if (value is double)

Но звучит так, что вы действительно хотите знать, является ли строка значением для разбора как double. Для этого вы должны использовать double.TryParse - но вам также нужно подумать о том, какая культура вас интересует. Например, вы бы увидели «15,5» как действительный double? Европейские пользователи могли бы, но американские пользователи вероятно не будут. Хотите разрешить разделители тысяч?

Я бы настоятельно рекомендовал вам использовать перегрузку, которая занимает IFormatProvider, и использовать соответствующую культуру. Даже если интересующая вас культура является по умолчанию, об этом стоит сказать прямо.

Вы, вероятно, хотите:

double result;
// For suitable values of text, style and culture...
bool valid = double.TryParse(text, style, culture, out result);

Затем используйте переменную valid, чтобы определить, правильно ли она была проанализирована. Если valid равно true, то значение result является проанализированным значением. Если valid ложно, result будет 0.

4 голосов
/ 22 марта 2012

Используйте метод Double.TryParse :

double price;
if (Double.TryParse(txtPrice.Text, out price))
{
    Console.WriteLine(price);
}
else
{
    Console.WriteLine("Not a double!");
}
2 голосов
/ 22 марта 2012

Вы также можете использовать .GetType (), чтобы вернуть тип переменной, если вы не уверены, что возвращается, если вызывается метод для генерации числа.См. http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx для примера.

2 голосов
/ 22 марта 2012

Почему бы вам не попробовать что-то подобное -

  double doubleVar;
    if( typeof(doubleVar) == double ) {
        printf("doubleVar is of type double!");
    }

Это может легко проверить, имеет ли переменная тип double.

1 голос
/ 22 марта 2012

Не могли бы вы просто использовать:

double.Parse(txtPrice.Text);

С этим вы получите исключение FormatException, говорящее «Введенная строка была в неправильном формате». если строковое значение не является двойным, это похоже на то, что вы делали вручную в любом случае.

1 голос
/ 22 марта 2012

Вы можете использовать double.TryParse(), он вернет false, если не может создать двойник.

1 голос
/ 22 марта 2012

Так что, если я правильно понял ваш вопрос, вы имеете в виду, что хотите разрешить только цифры, верно?Если это правда, то, возможно, это вам поможет.

string Str = textBox1.Text.Trim();
double Num;
bool isNum = double.TryParse(Str, out Num);
if (isNum)
MessageBox.Show(Num.ToString());
else
MessageBox.Show("Invalid number");
1 голос
/ 22 марта 2012

Double.TryParse - это то, что вы хотите.

1 голос
/ 22 марта 2012

Вы можете использовать

  • double.ParseExact или
  • используйте Regex, чтобы проверить, действительно ли это.
...