Все базовые классы .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", т.е. количество дней.
Итак, пусть у нас имеется исходная строка, из которой нужно извлечь значение для целевой переменной типа 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", т.е. количество дней.
Комментариев нет:
Отправить комментарий