Есть ли лучший способ проверить целое число в C #, чем Double.TryParse? - PullRequest
1 голос
/ 31 декабря 2008

Double.TryParse возвращает значение, и мне не нужно значение. Мне нужно знать, является ли строка числовой, и просто возвращать значение bool.

есть ли способ сделать это?

Ответы [ 6 ]

13 голосов
/ 31 декабря 2008

Я бы посчитал точно , что вам нужно определить. «Численно» поначалу более неопределенно, чем кажется. Рассмотрите следующие строки, и хотите ли вы считать их числовыми:

  • "NaN"
  • "Нан"
  • "Бесконечность"
  • "0,000000000000000000000000000000000000000000000000001"
  • "1e5"
  • "1e500"
  • "1000"
  • "+ 1"

Использование Double.TryParse (с культурой en-GB - не забывайте о культурных проблемах!) Даст вам True, False, True, True (несмотря на то, что он не представлен), True, False True, True.

Если вы хотите сказать, будет ли более поздний вызов Double.TryParse успешным, вызов здесь будет наиболее точным решением. Если вы используете некоторые другие критерии, регулярное выражение вполне может быть более подходящим. Пример критерия, который вы можете использовать:

  • Может быть + или -, но только в первом символе
  • У любого персонажа может быть один период. Вы можете избежать одного в конце - если "1" быть действительным?
  • За исключением вышеприведенного, все символы должны быть цифрами

Это запретило бы все, кроме четвертого и последнего приведенных выше примеров.

РЕДАКТИРОВАТЬ: я заметил, что название вопроса включает в себя "целое число". Это в значительной степени уменьшает проверку спецификации до:

  • Вы хотите разрешить начальные нули (например, -00012)?
  • Какой диапазон?
  • Вам нужны только десятичные дроби (вместо шестнадцатеричных и т.д.)?
  • Вам нужно принять тысячи разделителей?
  • Какова ваша политика в отношении пробелов в начале / конце?
8 голосов
/ 31 декабря 2008

Ну, вы могли бы использовать регулярное выражение, но почему бы просто не отбросить значение из Double.TryParse и двигаться дальше? Я не думаю, что попытка дублирования этого кода будет стоить усилий.

5 голосов
/ 31 декабря 2008

Один из способов - добавить ссылку на Microsoft.VisualBasic, а затем использовать Information.IsNumeric().

using Microsoft.VisualBasic;

...

if (Information.IsNumeric("1233434.0"))
{
    Console.WriteLine("Yes");
}
1 голос
/ 31 декабря 2008

Я только что запустил Visual Studio Express (и 2005, и 2008). Intellisense говорит, что возвращаемое значение Double.TryParse () является логическим значением. Следующее сработало для меня при ограниченном тестировании ...

double res; // you must be under very resource-constrained 
            // conditions if you can't just declare a double
            // and forget about it

if (Double.TryParse(textBox1.Text, out res)) {
    label1.Text = "it's a number";
} else {
    label1.Text = "not a number";
}
1 голос
/ 31 декабря 2008

Как насчет регулярного выражения?

string s = "13.2";
bool bIsDecimal = Regex.IsMatch("^-?\d+(\.\d+)?$");

должен проверить, является ли это десятичным значением. То, что он не скажет вам, является ли это действительным десятичным числом, так как число будет соответствовать десятичному числу.

0 голосов
/ 27 января 2009

попробуйте это числовой:

public static bool IsNumeric(object Expression)

{

  bool isNum;

  double retNum;

  isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any,System.Globalization.NumberFormatInfo.InvariantInfo, out retNum );

  return isNum;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...