Попытка разобрать строку на C# с помощью вспомогательного метода TryParse

Я пытаюсь разобрать введенный пользователем текст в число с плавающей запятой, чтобы я мог выполнить какую-то ужасную математику для результата. Результатом является переменная numberA в конце. Вот как я разбираю строку в число с плавающей запятой:

numberAString = GUI.TextField(new Rect(25, 100, 100, 25), numberAString.ToString());
bool ParsableCheckA = float.TryParse(numberAString, out numberA);

В конце концов я умножаю число A на другое число с плавающей запятой позже. Я обрабатываю текст, который не будет разобран позже с простым сообщением об ошибке. Пара вещей, которые меня беспокоят:

1) Почему мне нужно использовать numberAString в параметрах TryParse вместо его значения? Почему я не могу просто поместить GUI.Textfield и т. д. в этот слот? Зачем мне разбивать это на две строки кода?

2) Я получаю предупреждение, что никогда не использую ParsableCheckA (что правда). Но без него я не могу использовать этот помощник Tryparse, не так ли? Есть ли способ устранить необходимость в этом bool? Спасибо.


person user2448377    schedule 14.07.2014    source источник
comment
Для вашего второго вопроса вы можете использовать float.TryParse(numberAString, out numberA); и игнорировать возвращаемое значение. Что касается вашего первого вопроса, я не уверен, что вы спрашиваете   -  person Habib    schedule 14.07.2014
comment
1) нет, этого делать не нужно. 2) причина, по которой вы TryParse, заключается в том, что вы можете проверить успех, а не попробовать/поймать. Другими словами, вы хотите удостовериться, что это число и оно правильно проанализировано.   -  person crashmstr    schedule 14.07.2014
comment
Хабиб, ты прав. Должно быть, я пропустил, что мог просто использовать метод float.TryParse. Думал, что пробовал, но видимо не правильно настроил. Мой первый вопрос, нм. Я понял. Синтаксическая ошибка с моей стороны.   -  person user2448377    schedule 14.07.2014


Ответы (3)


TryParse() Метод и его использование довольно просты, как показано в следующем примере:

double _dblOriginal;
_dblOriginal=3.141592;

string _str;
_str = _dblOriginal.ToString();

double _dblParsed;
bool _parseOK= TryParse(_str, out dblParsed);

Дополнительные сведения см. по адресу: http://msdn.microsoft.com/en-us/library/system.double.tryparse%28v=vs.110%29.aspx

Примечание: убедитесь, что в вашем примере строка numberAString, которую вы передаете методу TryParse(), содержит допустимое число.

Кроме того, FYI: метод TryParse() имеет некоторые преимущества в производительности по сравнению с методом Parse(), потому что он не генерирует исключение в случае сбоя синтаксического анализа (вместо этого вы просто проверяете значение результата bool).

Надеюсь, это поможет. С уважением,

person Alexander Bell    schedule 14.07.2014

(1) numberAString (см. GUI.TextField) есть строка, поэтому вы можете использовать ее непосредственно в вызове TryParse(). (2) TryParse() предназначен для возврата логического значения, чтобы вы могли проверить наличие ошибок и принять меры. Однако вы не обязаны назначать возвращаемое значение. Вы можете использовать это так и просто принять значение по умолчанию (0.0), назначенное параметру out:

float.TryParse(numberAString, out numberA);

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

person Peter Gluck    schedule 14.07.2014
comment
Хорошо, я еще раз взглянул на то, что я пытался сделать, и теперь я вижу все это более четко. Спасибо. - person user2448377; 14.07.2014

Я лично создаю метод расширения, чтобы упростить разбор моего номера. Если производительность критична, то это может быть не очень хорошей идеей (потому что для действительных чисел с плавающей запятой вы, по сути, будете преобразовывать их дважды). Но я не думаю, что влияние на производительность намного больше, чем незначительное.

public static class NumberExtensions
{
    //Test if the text represents a valid float.
    public static bool IsFloat(this string text)
    {
        float dummy = 0;
        return Float.TryParse(text, out dummy);
    }
    //Convert the text to a float. Will throw exception if it's not a valid float.
    public static float ToFloat(this string text)
    {
        float number = Float.Parse(text);
        return number;
    }
}

Использование...

string text = "123";
if(text.IsFloat())
{
    //text must be a valid float
    float myfloat = text.ToFloat();
}
else
{
    //text isn't a valid float
}

Вы должны не забыть проверить, является ли это числом с плавающей запятой, вызвав метод расширения IsFloat(), но мне гораздо проще думать об этом концептуально, а не об использовании переменных out, которые некоторые думают, что это плохая идея.

person mason    schedule 14.07.2014