уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

При работе с какими-либо данными (не только в 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, преобразование не выполняется и результирующее свойство Kind имеет значение Unspecified. Это значение невозможно использовать с RoundtripKind.

AllowInnerWhite 4 При анализе не следует учитывать дополнительные пробелы в середине строки. Исключением является их появление в шаблонах формата DateTimeFormatInfo.
AllowLeadingWhite 1 При анализе не следует учитывать начальные пробелы. Исключением является их появление в шаблонах формата DateTimeFormatInfo.
AllowTrailingWhite 2 При анализе не следует учитывать конечные пробелы. Исключением является их появление в шаблонах формата DateTimeFormatInfo.
AllowWhiteSpaces 7 При анализе не следует учитывать дополнительные пробелы в любом месте строки. Исключением является их появление в шаблонах формата DateTimeFormatInfo. Это значение представляет собой сочетание значений AllowLeadingWhiteAllowTrailingWhite и 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.
купить книгу delphi на ЛитРес
Описание: Книга представляет собой сборник советов, алгоритмов и готовых примеров программ на языке C# в среде MS Visual Studio 2005/2008 из различных областей: работа с формами и элементами управления, папками и файлами, мышью и клавиатурой, мультимедиа и графикой, использование технологий WMI и WSH, взаимодействие с MS Office и другими приложениями, работа в локальной сети и Интернете, особенности использования функций Windows API и др.
купить книгу delphi на ЛитРес
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии