13 марта 2011 г.

Парсинг основных типов данных из строки

Все базовые классы .NET Framework имеют метод TryParse, который парсит строку и преобразует её в соответствующий тип данных. Если же строка имеет недопустимый формат, исключения не возникает, а целевая переменная инициализируется значением по умолчанию. Такое поведение очень удобно использовать при парсинге текстовых данных (например, пользовательского ввода на странице сайта).

Итак, пусть у нас имеется исходная строка, из которой нужно извлечь значение для целевой переменной типа int:

string Input = "  777  ";

Я предлагаю использовать такую конструкцию:

int Output;
if (Input != null && int.TryParse(Input, out Output))
{
        // здесь выполняем необходимое действие, например, вывод на экран
        Console.WriteLine(Output);
}

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

Далее вызывается, собственно, сам метод TryParse. Первым параметром передаём ему исходную строку, вторым параметром передаём целевую переменную, в которую надо занести значение из строки. Она передаётся с параметром out, т.е. она будет проинициализирована внутри этого метода. Метод возвращает true - если преобразование прошло успешно. В противном случае - false. Именно поэтому TryParse я предлагаю вызывать в условии, ведь если строка будет в неправильном формате, никаких действий выполняться не будет.

Обратите внимание, что строка может содержать помимо самого числа ещё и пробелы с обоих сторон.

Теперь более сложный пример. А конструкция та же.


string Input = "  777,05  ";
double Output;
if (Input != null && double.TryParse(Input, out Output))
{
Console.WriteLine(Output);
}

Здесь мы преобразуем десятичное число. Его формат должен соответствовать региональным настройкам. В России разделителем между целой и дробной частями является запятая. В США - точка. Это надо учитывать, т.к. если формат не будет соответствовать региональным настройкам, метод вернёт false.

То же самое с DateTime.


string Input = "13 марта 2011, 15:08";
DateTime Output;
if (Input != null && DateTime.TryParse(Input, out Output))
{
Console.WriteLine(Output);
}

Дата соответствует российскому формату и строка будет преобразована корректно в значением "13.03.2011 15:08:00". А теперь представьте, насколько сложно разобрать эту строку самописным методом?) Так что не будем изобретать очередной велосипед.

Ну и наконец, интервал времени TimeSpan. Перед точкой указано количество дней, после неё идут часы, минуты и секунды.


string Input = "  12.2:04:05  ";
TimeSpan Output;
if (Input != null && TimeSpan.TryParse(Input, out Output))
{
Console.WriteLine(Output.Days);
}


На экран будет выведено "12", т.е. количество дней.

Комментариев нет:

Отправить комментарий