2014-10-17 8 views
-5

Мне понадобился день, чтобы выяснить, что один из операторов if возвращает true для строкового значения.Почему double.TryParse ("6E02", out tempDouble) возвращает true?

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

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

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

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

+1

Я думаю, что синтаксический анализ для первого является, вероятно, вашим лучшим вариантом, поскольку 6E02 является действительным представлением двойника. –

+3

Знаете ли вы об экспоненциальной нотации? –

+1

Я предполагаю, что ваше название неверно. 'E02' не вернет true, но' 6E02' будет, согласно @ Andrew ответить – DavidG

ответ

10

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

  • NumberStyles.AllowThousands
  • NumberStyles.Float, который является псевдонимом для следующей комбинации:
    • NumberStyles.AllowLeadingWhite
    • NumberStyles.AllowTrailingWhite
    • NumberStyles.AllowLeadingSign
    • NumberStyles.AllowDecimalPoint
    • NumberStyles.AllowExponent

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

+0

большое спасибо. это то, что я искал – akd

13

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

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

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

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

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

+0

Как насчет того, есть ли точка в строке? пример 1.2 или запятая 1,2? – akd

+0

Используйте 'NumberStyles.AllowDecimalPoint'. Культура должна обрабатывать, является ли запятая точкой или запятой. –

3

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

прописной или символ нижнего регистра «е», что указывает на экспоненциальный (научный) нотации.

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

if(val.ToLower().Contains("e")) 
{ 
    //Remove the letter, or parse it in a different way. 
} 
+1

Простейший способ не использовать 'NumberStyles.AllowExponent'. : p –

+0

@SriramSakthivel Я согласен, однако это зависит от того, что он хочет делать. Если это научная нотация, он, возможно, не захочет разбирать ее вообще, и в этом случае «NumberStyles» не вступает в игру. –

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

  • Нет связанных вопросов^_^