При работе с какими-либо данными (не только в C#) иногда требуется преобразовать их из одного типа в другой. Например, преобразовать строку в целое число или строку в дату и так далее. В Delphi для этого имеется целый ряд методов, например, StrToInt, StrToDateTime и прочие, позволяющие преобразовать практически всё что угодно во всё,что угодно. Как дела обстоят с преобразованиями в C# — смотрим в этой статье.
Метод Parse()
Итак, у нас есть строка, которую надо преобразовать в какой-либо тип данных, например, int или float. Сделать это можно с помощью метода Parse(). Практически каждый встроенный тип данных C# имеет в своем распоряжении этот метода,а также различные его варианты. Рассмотрим эти методы применительно к различным типам данных в C#.
Как в C# преобразовать строку в целое число?
Если вы точно знаете (на 100% уверены), что ваша строка представляет собой целое число, то преобразовать такую строку, например, в int можно вот так:
string str = "1523"; int value = int.Parse(str);//преобразуем строку в число Console.WriteLine("Получено число: {0}", value);
У типа int метод Parse() имеет следующие перегруженные версии:
public static Int32 Parse(string s, NumberStyles style, IFormatProvider provider); public static Int32 Parse(string s, IFormatProvider provider); public static Int32 Parse(string s, NumberStyles style);
В представленных методах:
s— строка, содержащая преобразуемое числоstyle NumberStyles— побитовое сочетание значений перечисления, обозначающих элементы стиля, которые могут быть представлены в параметреs.provider IFormatProvider— объект, который предоставляет сведения о формате параметраsдля определенного языка и региональных параметров.
NumberStyles может принимать следующие значения:
| Значение | Целочисленное значение | Описание |
| NumberStyles.None | 0 | Указывает, что элементы стиля, такие как начальные или конечные пробелы, разделители тысяч или десятичные разделители, не могут присутствовать в анализируемой строке. Анализируемая строка должна состоять только из целых десятичных чисел. |
| NumberStyles.AllowDecimalPoint | 32 | Указывает, что строка может включать десятичный разделитель. Если значение NumberStyles включает флаг AllowCurrencySymbol и анализируемая строка включает обозначение денежной единицы, то символ десятичного разделителя определяется свойством CurrencyDecimalSeparator. В противном случае символ десятичного разделителя определяется свойством NumberDecimalSeparator. |
| NumberStyles.AllowExponent | 128 | Указывает, что числовая строка может быть в экспоненциальном представлении. Флаг AllowExponent позволяет включить в разбираемую строку экспоненту, начинающуюся с символа E или e, за которым следует необязательный положительный или отрицательный знак и целое число. Не допускается наличие десятичного разделителя или знака в значащей части числа, или мантиссе; чтобы разрешить эти элементы в анализируемой строке, используйте флаги AllowDecimalPoint и AllowLeadingSign или составной стиль, включающий эти отдельные флаги. |
| NumberStyles.AllowLeadingWhite | 1 | Указывает, что анализируемая строка может начинаться со знаков пробела. Допустимые знаки пробела имеют следующие значения в кодировке Юникод: U+0009, U+000A, U+000B, U+000C, U+000D и U+0020. |
| NumberStyles.AllowTrailingWhite | 2 | Указывает, что анализируемая строка может оканчиваться знаками пробела. Допустимые знаки пробела имеют следующие значения в кодировке Юникод: U+0009, U+000A, U+000B, U+000C, U+000D и U+0020. |
| NumberStyles.AllowLeadingSign | 4 | Указывает, что числовая строка может включать начальный знак. Допустимые начальные знаки определяются свойствами PositiveSign и NegativeSign. |
| NumberStyles.AllowTrailingSign | 8 | Указывает, что числовая строка может включать конечный знак. Допустимые конечные знаки определяются свойствами PositiveSign и NegativeSign. |
| NumberStyles.AllowParentheses | 16 | Указывает, что в числовой строке может находиться одна пара скобок, в которых заключено число. Скобки означают, что анализируемая строка представляет отрицательное число. |
| NumberStyles.AllowThousands | 64 | Указывает, что в числовой строке могут находиться разделители групп, например символы, отделяющие сотни от тысяч. Если значение NumberStyles включает флаг AllowCurrencySymbol и анализируемая строка содержит обозначение денежной единицы, допустимый разделитель группы определяется свойством CurrencyGroupSeparator, и количество цифр в каждой группе определяется свойством CurrencyGroupSizes. В противном случае допустимый разделитель групп определяется свойством NumberGroupSeparator, а количество цифр в каждой группе определяется свойством NumberGroupSizes. |
| NumberStyles.AllowCurrencySymbol | 256 | Указывает, что числовая строка может содержать символ денежной единицы. Допустимые символы денежных единиц определяются свойством CurrencySymbol. |
Что касается параметра provider IFormatProvider, то его можно использовать для настройки определенных региональных настроек, однако обычно используется значение CultureInfo.InvariantCulture, что означает, что будут использоваться настройки не зависящие от языка и прочих региональных настроек.
Преобразование строки в число с использованием перегруженных методов типа int может выглядеть, например, следующим образом:
//разрешаем, чтобы до числа и после него были пробелы, а также представление числа в экспоненциальной форме NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowExponent; //задаем настройки CultureInfo culture = CultureInfo.InvariantCulture; string str = " 523 "; int value = int.Parse(str, styles, culture); Console.WriteLine("Получено число: {0}", value); str = " 5e5 "; value = int.Parse(str, styles, culture); Console.WriteLine("Получено число: {0}", value);
результатом выполнения таких преобразований будут строки:
//Получено число: 523 //Получено число: 500000
Немногим сложнее будет преобразование строк в формат чисел с плавающей запятой.
Как в C# преобразовать строку в число с плавающей запятой?
Как ив случае с типом int, мы можем воспользоваться одним из методов Parse(), которые у double выглядят следующим образом:
public static Double Parse(string s); public static Double Parse(string s, NumberStyles style); public static Double Parse(string s, IFormatProvider provider); public static Double Parse(string s, NumberStyles style, IFormatProvider provider);
Что означает тот или иной параметр в методах — см. выше. Единственное отличие в преобразовании строки в тип с плавающей запятой заключается в том, что в различных странах могут применяться различные разделители целой и дробной части числа — в одних странах, например,у нас таким знаком является запятая, в других — точка. Так, например, если мы попытаемся произвести вот такое преобразование при текущих настройках:
double doubleValue; str = "123.5"; doubleValue = double.Parse(str);
то гарантировано получим исключение «Входная строка имела неверный формат«, потому что набор настроек для Российской Федерации содержит в качестве разделителя целой и дробной части запятую, а не точку, как в примере. При этом, чтобы исключительной ситуации не возникало, конкретно в этом случае мы бы могли воспользоваться перегруженным методом Parse() и преобразовать строку вот так:
str = "123.5"; doubleValue = double.Parse(str, CultureInfo.InvariantCulture); Console.WriteLine("Получено число: {0}", doubleValue);
Однако, не стоит сильно «заигрывать» с инвариантным набором настроек CultureInfo.InvariantCulture, так как его использование может иногда сыграть с вашей программой плохую шутку. Например, что будет, если попробовать сделать вот такое преобразование:
str = "123,5"; doubleValue = double.Parse(str, CultureInfo.InvariantCulture); Console.WriteLine("Получено число: {0}", doubleValue);
Судя по информации с сайта Microsoft, CultureInfo.InvariantCulture связан с английским языком, хотя как таковых настроек конкретно для английского языка и не содержит. То есть в качестве разделителя целой и дробной части у нас, по идее, должна быть точка, а преобразование строки должно привести к исключительной ситуации. Но этого не происходит и в результате на экране появится вот такая строка:
Получено число: 1235
Хорошо это или плохо, что при преобразовании разделитель просто не учитывался, но результат именно такой. Как один из вариантов, можно создать свой набор настроек CultureInfo и передавать его в качестве параметров метода Parse(), например, вот так:
string str = "123.5"; double doubleValue; //создаем свой набор настроек CultureInfo culture = new CultureInfo(""); //указываем разделитель целой и дробной части числа culture.NumberFormat.NumberDecimalSeparator = "."; doubleValue = double.Parse(str, NumberStyles.Float, culture); Console.WriteLine("Получено число: {0}", doubleValue);
В любом случае, перед тем как преобразовать строку в число с плавающей запятой,необходимо знать какой разделитель используется. Если же вы этого не знаете, то вам помогут следующие методы:
public static bool TryParse(string s, out Double result); public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out Double result);
Эти методы также преобразуют строку в число с плавающей запятой, однако в качестве результата возвращают bool (true — если преобразование произошло успешно и false — если при преобразовании произошла какая-либо ошибка). Воспользоваться этими методами можно, например, вот так:
string str = "123,5"; double doubleValue; CultureInfo culture; if (double.TryParse(str, out doubleValue)) { //преобразование произошло успешно Console.WriteLine("Получено число: {0}", doubleValue); } else { //преобразование не прошло - меняем разделитель на точку //создаем свой набор настроек culture = new CultureInfo(""); //указываем разделитель целой и дробной части числа culture.NumberFormat.NumberDecimalSeparator = "."; if (double.TryParse(str, NumberStyles.Float, culture, out doubleValue)) { Console.WriteLine("Получено число: {0}", doubleValue); } else { Console.WriteLine("Не получилось преобразовать строку в число"); } }
Следующий момент — это преобразование строки в тип DateTime.
Как в C# преобразовать строку в дату/время (DateTime)?
С датой/временем работать чуть сложнее, чем с простыми числами. Во-первых, формат представления даты/времени в виде строки может быть самый различный и, иногда, неожиданный. Вот только несколько вариантов представления даты/времени в виде строки:
- 02.05.1983
- 02.05.2008 13:52
- 31.12.2019 23:59:59
- 2008-12-12
- и так далее
Список можно продолжать и продолжать. Более того, дата/время могут быть представлены в UTC, а нам надо получить время местное или наоборот. Более того, наши региональные настройки могут сильно отличаться от того, как дата/время представлены в преобразуемой строке. Конечно, тип DateTime имеет также свои методы Parse(), которые выглядят следующим образом:
public static DateTime Parse(string s); public static DateTime Parse(string s, IFormatProvider provider); public static DateTime Parse(string s, IFormatProvider provider, DateTimeStyles styles);
и мы этими методами можем воспользоваться. При этом, DateTimeStyles может принимать следующие значения:
| Значение | Целочисленное значение | Описание |
| AdjustToUniversal | 16 | Дата и время возвращаются в формате UTC.
Если во входной строке указано местное время, то дата и время преобразуются из местного времени в UTC. Если во входной строке указано время в формате UTC, то преобразование не выполняется. Если во входной строке не указано местное время или время в формате UTC, преобразование не выполняется и результирующее свойство |
| AllowInnerWhite | 4 | При анализе не следует учитывать дополнительные пробелы в середине строки. Исключением является их появление в шаблонах формата DateTimeFormatInfo. |
| AllowLeadingWhite | 1 | При анализе не следует учитывать начальные пробелы. Исключением является их появление в шаблонах формата DateTimeFormatInfo. |
| AllowTrailingWhite | 2 | При анализе не следует учитывать конечные пробелы. Исключением является их появление в шаблонах формата DateTimeFormatInfo. |
| AllowWhiteSpaces | 7 | При анализе не следует учитывать дополнительные пробелы в любом месте строки. Исключением является их появление в шаблонах формата DateTimeFormatInfo. Это значение представляет собой сочетание значений AllowLeadingWhite, AllowTrailingWhite и AllowInnerWhite. |
| AssumeLocal | 32 | Если в анализируемой строке часовой пояс не указан, подразумевается, что используется местное время. Это значение невозможно использовать с AssumeUniversal или RoundtripKind. |
| AssumeUniversal | 64 | Если в анализируемой строке часовой пояс не указан, подразумевается, что используется время в формате UTC. Это значение невозможно использовать с AssumeLocal или RoundtripKind. |
| NoCurrentDateDefault | 8 | Если в анализируемой строке содержится только время и отсутствует дата, в методах анализа подразумевается дата по Григорианскому календарю, где год = 1, месяц = 1 и день = 1. Если это значение не используется, подразумевается текущая дата. |
| None | 0 | Необходимо использовать параметры форматирования по умолчанию. |
| RoundtripKind | 128 | Поле даты DateTimeKind сохраняется, когда объект DateTime преобразуется в строку с помощью описателя стандартного формата «o» или «r», а затем строка преобразуется обратно в объект DateTime. |
Суть преобразований строки в DateTime с использованием методов Parse() точно такая же, как и во всех предыдущих примерах, поэтому эти примеры мы пропустим, а лучше сосредоточимся на более интересных методах преобразования строки в тип DateTime.
Метод ParseExact() для DateTime
Этот метод представлен тремя версиями:
public static DateTime ParseExact(string s, string format, IFormatProvider provider); public static DateTime ParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style); public static DateTime ParseExact(string s, string[] formats, IFormatProvider provider, DateTimeStyles style);
В отличие от методов Parse(), ParseExact() позволяет задавать конкретный формат (или несколько форматов), которым должна соответствовать строка, содержащая дату/время. Например, попробуем преобразовать в DateTime вот такую строку:
- 2016-12-19T09:54:04Z
достаточно распространенный вариант представления даты/времени во всяких API онлайн-сервисов. С помощью метода ParseExact() преобразование может выглядеть следующим образом:
string str = "2016-12-19T09:54:04Z"; //преобразуемая строка string format = "yyyy-MM-ddThh:mm:ssZ"; //формат строки DateTime value = DateTime.ParseExact(str, format, CultureInfo.InvariantCulture); Console.WriteLine("Дата: {0}", value);
Все возможные строки настраиваемых форматов даты и времени можно посмотреть вот на этой странице сайта Microsoft. Настраивая формат мы имеем возможность преобразовать строки практически любой сложности и содержания в DateTime.
Метод ToString()
Этот метод противоположен методу ToParse(), то есть с помощью него мы можем преобразовывать какой-либо тип данных в строку.
Как в C# преобразовать целое число в строку?
Для преобразования целых чисел в строку в C# есть следующие версии метода ToString() для целочисленных типов данных:
public string ToString(IFormatProvider provider); public override string ToString(); public string ToString(string format, IFormatProvider provider); public string ToString(string format);
Про IFormatProvider уже рассказывалось выше, поэтому повторять, что это такое — не будем, а лучше сосредоточимся на последней версии метода ToString() — той, что принимает в качестве аргумента строку формата числа.
Так, например, чтобы определить способ форматирования числа, можно создать строку настраиваемого числового формата, состоящую из одного или нескольких описателей. Ознакомиться с этими описателями можно вот на этой странице справки Microsoft. Я же покажу лишь несколько примеров того, как можно представлять числа с использованием различных настраиваемых форматов:
//число будет дополнено ведущими нулями, если оно состоит менее, чем из четырех цифр int i = 123; Console.WriteLine(i.ToString("0000")); //разделяем число на группы i = 1230; Console.WriteLine(i.ToString("#,##")); //Представляем число в виде процентов i = 46; Console.WriteLine(i.ToString("%#")); //Экспоненциальная нотация i = 4600; Console.WriteLine(i.ToString("00e0")); /* Output: 0123 1 230 %4600 46e2 */
Аналогичные методы ToString() имеются и у типов данных, представляющих числа с плавающей запятой.
Как в C# преобразовать число с плавающей запятой в строку?
Для типов float, double и decimal мы также можем использовать один из четырех методов ToString():
public string ToString(string format); public string ToString(IFormatProvider provider); public string ToString(string format, IFormatProvider provider); public override string ToString();
Чтобы не повторяться, покажу лишь два примера преобразования числа с плавающей запятой в строку. В первом примере я использовал один стандартных числовых форматов, а во втором случае преобразование происходит с настройками по умолчанию:
double d = 12.563; Console.WriteLine(d.ToString("N")); Console.WriteLine(d.ToString()); /* OUTPUT: 12,56 12,563 */
Как видите, в первом случае число округлилось до второго знака после запятой, а во втором — осталось как есть. Если же вам необходимо, чтобы после запятой у числа было строго определенное количество цифр, то можно воспользоваться, опять же, настройками класс CultureInfo. Например, в следующем примере у числа будет пять знаков после запятой:
CultureInfo myCulture = new CultureInfo(""); myCulture.NumberFormat.NumberDecimalDigits = 5; double d = 12.563; Console.WriteLine(d.ToString("N", myCulture)); /* OUTPUT: 12.56300 */
Как в C# преобразовать дату/время в строку?
У DateTime имеются следующие версии метода ToString():
public string ToString(string format, IFormatProvider provider); public string ToString(IFormatProvider provider); public string ToString(string format); public override string ToString();
Опять же, как и в случае с другими типами данных в C# для преобразования даты/времени в строку мы можем настроить определенный формат. Например,
DateTime dateTime = DateTime.Now; Console.WriteLine(dateTime.ToString("yyyy-M-dd h:m:s")); /* OUTPUT: 2020-7-04 10:43:2 */
Кроме методов ToString() у DateTime также есть следующие методы преобразования в строку:
public string ToLongDateString(); public string ToLongTimeString(); public string ToShortDateString(); public string ToShortTimeString();
Работают эти методы следующим образом (см. пример):
DateTime dateTime = DateTime.Now; Console.WriteLine("ToLongDateString " + dateTime.ToLongDateString()); Console.WriteLine("ToLongTimeString " + dateTime.ToLongTimeString()); Console.WriteLine("ToShortDateString " + dateTime.ToShortDateString()); Console.WriteLine("ToShortTimeString " + dateTime.ToShortTimeString()); /* OUTPUT ToLongDateString 4 июля 2020 г. ToLongTimeString 22:47:47 ToShortDateString 04.07.2020 ToShortTimeString 22:47 */
Класс Convert
Раз уж сегодня говорим про преобразования форматов, то не правильно было бы упустить из вида такое класс как Convert. Этот класс преобразует значение одного базового типа данных в другой базовый тип данных. Перечислять все методы этого класса не имеет смысла, стоит только показать пример его использования. Например, вот такой:
double d = 12E-5; Console.WriteLine(Convert.ToString(d));
Класс Convert поддерживает работу со следующими базовыми типами данных: Boolean, Char, SByte, Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64 и Single, Double, Decimal, DateTime, String.
Кроме этого, можно также создавать свои классы которые могут преобразовываться с помощью класса Convert в другие форматы, но это уже совсем другая история.
Итог
Итак, сегодня мы рассмотрели различные способы преобразования строк в простые типы данных и обратно с использованием методов Parse() и ToString(). Научились использовать региональные настройки для преобразований и затронули тему работы с классом Convert. В целом можно сказать, что преобразования в C# из одного типа в другой организованы достаточно прозрачно для пользователей и, в принципе, не вызовут никаких серьезных затруднений даже для неподготовленных людей, если эти люди хотя бы немного работали с последними версиями Delphi.
Книжная полка
![]() |
Описание: практическое руководство познакомит вас с простыми рекомендациями, помогающими писать программное обеспечение, которое легко поддерживать и адаптировать. Написанная консультантами компании Software Improvement Group книга содержит ясные и краткие советы по применению рекомендаций на практике. Примеры для этого издания написаны на языке C#, но существует аналогичная книга с примерами на языке Java.
|
![]() |
![]() |
Название: C#. Советы программистам
Описание: Книга представляет собой сборник советов, алгоритмов и готовых примеров программ на языке C# в среде MS Visual Studio 2005/2008 из различных областей: работа с формами и элементами управления, папками и файлами, мышью и клавиатурой, мультимедиа и графикой, использование технологий WMI и WSH, взаимодействие с MS Office и другими приложениями, работа в локальной сети и Интернете, особенности использования функций Windows API и др.
|
![]() |



