Почему double.TryParse(6E02, out tempDouble) возвращает true?

Мне потребовался день, чтобы понять проблему, заключающуюся в том, что один из операторов if возвращает true для строкового значения.

Мы разбираем, чтобы проверить, является ли значение числом или строкой. Я узнал, что используется этот оператор, и когда строковое значение приходит как 6E02, оператор возвращает true, что это двойное значение.

var double temp;
var val ="6E02"
result = double.TryParse(val, out temp)

Как я могу исправить эту проблему, чтобы возвращать результат false для таких строк, как (Number)E0(Number)

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


person akd    schedule 17.10.2014    source источник
comment
Я думаю, что синтаксический анализ для первого - это, вероятно, ваш лучший вариант, поскольку 6E02 является допустимым представлением двойника.   -  person Kevin DiTraglia    schedule 17.10.2014
comment
Знакомы ли вы с экспоненциальной записью?   -  person Sriram Sakthivel    schedule 17.10.2014
comment
Я предполагаю, что ваш заголовок неверен. E02 не вернет true, но 6E02 вернет, согласно ответу @Andrew   -  person DavidG    schedule 17.10.2014
comment
6 х 10 ^ 2 или 6Е2 — допустимый дубль.   -  person PJRobot    schedule 17.10.2014
comment
6E02 и любой Ex или E-x является допустимым представлением числа. Это называется научной записью или экспоненциальной записью. 6E02 = 6 х 10^2 = 600   -  person thorkia    schedule 17.10.2014
comment
Да, я полностью знаю эти цифры. но если вы посмотрите в Интернете с вопросом, как проверить, является ли текст числом или нет, вы столкнетесь с этим social.msdn.microsoft. com/Forums/windows/en-US/ и никто не упоминает исключение 6E02   -  person akd    schedule 17.10.2014
comment
@tnw, мета. stackexchange.com/questions/23628/   -  person Habib    schedule 17.10.2014


Ответы (3)


По умолчанию double.TryParse использует следующие флаги из NumberStyles:

  • NumberStyles.AllowThousands
  • NumberStyles.Float, which is an alias for the following combination:
    • NumberStyles.AllowLeadingWhite
    • NumberStyles.AllowTrailingWhite
    • NumberStyles.AllowLeadingSign
    • NumberStyles.AllowDecimalPoint
    • NumberStyles.AllowExponent

Вы можете использовать другую перегруженную версию TryParse, чтобы указать только их подмножество по своему вкусу. В частности, вы хотите удалить (как минимум) флаг AllowExponent.

person Sam Harwell    schedule 17.10.2014

6E02 — это научное обозначение 6*10^2 или 600, что, безусловно, является двойным. Это встроено в С#.

Если вы хотите исключить числа с экспоненциальной записью, существует перегрузка TryParse с несколькими параметрами, одна из которых — включать или нет экспоненциальную запись.

var double temp;
var val = "6E02";
result = double.TryParse(val, NumberStyles.None, CultureInfo.CurrentCulture, out temp);
....

В этом примере стили не используются, что означает, что будут проанализированы только строки с цифрами. Есть и другие варианты, которые вы можете включить, как указано в ответе Сэма.

Вы также должны указать культуру с этой перегрузкой; в моем примере используется текущая культура приложения, но вы можете явно дать ему все, что хотите.

person Andrew Arnold    schedule 17.10.2014
comment
А если в строке есть точка? пример 1.2 или запятая 1,2 ? - person akd; 17.10.2014
comment
Используйте 1_. Культура должна обрабатывать, является ли десятичная точка точкой или запятой. - person Andrew Arnold; 17.10.2014

Он возвращает значение true, поскольку считает его научной нотацией, как отмечено здесь:

Прописная или строчная буква «e», обозначающая экспоненциальную (научную) запись.

Самый простой способ, вероятно, просто проверить, содержит ли строка букву e:

if(val.ToLower().Contains("e"))
{
    //Remove the letter, or parse it in a different way.
}
person Dave Zych    schedule 17.10.2014
comment
Самый простой способ - не использовать NumberStyles.AllowExponent. :п - person Sriram Sakthivel; 17.10.2014
comment
@SriramSakthivel Я согласен, однако это зависит от того, что он хочет делать. Если это научная запись, он может вообще не захотеть ее анализировать, и в этом случае NumberStyles не вступает в игру. - person Dave Zych; 17.10.2014