2012-03-21 4 views

ответ

7

Метод TryParse, который возвращает bool, указывающий, была ли конверсия успешной.

+0

Похоже, что это, вероятно, будет лучшим вариантом, там, спасибо .... – user1202606

+0

'TryParse 'метод не даст те же результаты, что и' IsNumeric'. – phoog

70

Вы могли бы написать метод расширения:

public static class Extension 
{ 
    public static bool IsNumeric(this string s) 
    { 
     float output; 
     return float.TryParse(s, out output); 
    } 
} 
+8

Я бы назвал этот метод 'IsInteger'. Числовое является довольно неоднозначным. – CodesInChaos

+3

@CodeInChaos - конечно, почему бы и нет. Я бы тоже не назвал расширение класса, меня больше интересовала эта идея. –

+0

Этот метод возвращает 'false' для нескольких классов строк, для которых' IsNumeric' возвращает 'true'. – phoog

14

Вы должны использовать TryParse - Parse бросает исключение, если строка не является допустимым числом - например, если вы хотите проверить действительное целое:

int v; 
if (Int32.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Если вы хотите проверить действительное число с плавающей точкой:

double v; 
if (Double.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Отметим также, что Double.TryParse имеет перегруженную версию с дополнительными параметрами, определяющими различные правила и опции, контролирующие процесс разбора - например локализация ('.' или ',') - см. http://msdn.microsoft.com/en-us/library/3s27fasw.aspx.

+0

'Int32.TryParse' возвращает' false' для '1E2', например, в то время как' IsNumeric' возвращает 'true'. – phoog

+0

Тогда есть «Double.TryParse» - я обновляю свой ответ – MiMo

+0

Согласно документации Parse и TryParse игнорируют пробелы. Это делает ненужным Trim(). https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-a-string-to-a-number – Asimov

14

Я думаю, вам нужно что-то более общее. Попробуйте следующее:

public static System.Boolean IsNumeric (System.Object Expression) 
{ 
    if(Expression == null || Expression is DateTime) 
     return false; 

    if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean) 
     return true; 

    try 
    { 
     if(Expression is string) 
      Double.Parse(Expression as string); 
     else 
      Double.Parse(Expression.ToString()); 
      return true; 
     } catch {} // just dismiss errors but return false 
     return false; 
    } 
} 

Надеюсь, это поможет!

+0

Это гораздо лучший ответ, чем все остальные , но он по-прежнему не соответствует функциональности 'IsNumeric'. – phoog

+3

Мне нравится подход к первому типу данных, но я предлагаю изменить вторую часть кода с помощью 'Double tmp; var isSuccess = Double.TryParse (выражение как строка, out tmp); return isSuccess; 'вместо окружающего блока try-catch. – Matt

1

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

int intParsed; 
    if(int.TryParse(txtMyText.Text.Trim(),out intParsed)) 
    { 
     // perform your code 
    } 
+0

'int.TryParse' возвращает false для' '$ 100' 'и' "1E2" ', а' IsNumeric' возвращает true. – phoog

+0

Вы можете использовать перегруженный метод Int32.TryParse (String, NumberStyles, IFormatProvider, Int32%), чтобы указать валюту или экспонента. http://msdn.microsoft.com/en-us/library/zf50za27(v=vs.90).aspx – DotNetUser

1

Там есть немного лучший способ:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), out valueParsed)) 
{ ... } 

При попытке разобрать текст, и он не может быть разобрано, метод Int32.Parse сгенерирует исключение. Я думаю, вам лучше использовать метод TryParse, который будет захватывать исключение и сообщить вам как логическое, если бы возникло какое-либо исключение.

Существует множество осложнений при анализе текста, который принимает Int32.Parse. Глупо дублировать усилия. Таким образом, это, скорее всего, подход, сделанный VN's IsNumeric. Вы также можете настроить правила синтаксического анализа через перечисление NumberStyles, чтобы разрешить шестнадцатеричный, десятичный, валютный и несколько других стилей.

Другим распространенным подходом для приложений, не относящихся к веб-интерфейсу, является ограничение ввода текстового поля, чтобы принимать только символы, которые будут обрабатываться в виде целого числа.

EDIT: Вы можете принять большее разнообразие входных форматов, таких как денежные ценности ("$ 100") и показателей ("1E4"), указав конкретные NumberStyles:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 

... или позволяя любой вид поддерживаемого форматирования:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.Any, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 
+0

'IsNumeric' возвращает' true' для строк типа '" 1E2 "' и '' $ 100 '', тогда как 'Int32.TryParse' возвращает false для этих строк. – phoog

+0

@phoog поведение по умолчанию заключается в том, чтобы не поддерживать научные извещения или денежные значения. вы можете настроить поведение, передав комбинацию параметров NumberStyles, таких как: Int32.TryParse («1E2», NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, outParsed). Вы также можете указать NumberStyles.Any, что вполне вероятно, что VN IsNumeric делает за кулисами. – Scott

+1

, конечно, но если бы у меня было требование дублировать функциональность 'IsNumeric' в проекте C#, я бы просто назвал' IsNumeric' вместо написания нового кода на C# и попытался убедиться, что я рассмотрел все угловые случаи правильно. – phoog

8

Другие ответы предложил использовать TryParse, которые могли бы соответствовать вашим потребностям, но и самый безопасный способ обеспечить функциональность функции IsNumeric является ссылка на библиотеку VB и использовать IsNumeric функция.

IsNumeric более гибкий, чем TryParse. Например, IsNumeric возвращает true для строки "$100", тогда как методы TryParse все возвращают false.

Чтобы использовать IsNumeric в C#, добавьте ссылку на Microsoft.VisualBasic.dll. Функция представляет собой статический метод Microsoft.VisualBasic.Information класса, поэтому если у вас есть using Microsoft.VisualBasic;, вы можете сделать это:

if (Information.IsNumeric(txtMyText.Text.Trim())) //... 
+5

Я не уверен, что мне нужен результат «true» для '' $ 100'', являющийся числовым ?! – cederlof

+4

@cederlof Я тоже не уверен, что вы бы, если вы не пытаетесь реплицировать функцию IsNumeric Visual Basic, о которой упоминается в вопросе. Эта функция возвращает true для «$ 100». Если вы пытались воспроизвести поведение процедуры Excel VBA, например, вы хотели бы, чтобы функция возвращала значение true для «100 долларов США», и вам, скорее всего, будет лучше использовать Microsoft.VisualBasic.dll, чем пытаться написать собственную замену функция. – phoog

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