Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Преобразование информации






Платформа.NET и языки программирования, построенные на её основе, предлагают богатый набор средств для решения задачи преобразования информации в данные различных типов.

Язык C# поддерживает операции явного и неявного преобразования типов, причём эти операции могут быть перегружены в пользовательских типах. При этом желательно, чтобы перегружаемые операции преобразования имели простую семантику и работали на сходных множествах значений.

Для выполнения взаимных преобразований данных базовых типов (числовые типы, bool, string и DateTime) предназначен статический класс System.Convert. Этот класс содержит набор методов вида ToИмяТипа(), где ИмяТипа является именем CLR для базовых типов. Каждый такой метод перегружен и принимает аргумент любого базового типа. Выполнение метода может быть успешным или генерировать исключения InvalidCastException, FormatException, OverflowException.

byte x = Convert.ToByte(" 123"); // x = 123

bool y = Convert.ToBoolean(10.5); // y = true

int z = Convert.ToInt32(DateTime.Now); // InvalidCastException

Класс Convert также содержит методы для взаимных преобразований массива байтов в строку (или массив символов) в формате Base-64:

// конвертируем массив в Base64 и выполним обратное преобразование

byte[] data = {10, 20, 30, 40, 50};

Console.WriteLine(Convert.ToBase64String(data));

data = Convert.FromBase64String(" ChQeKDI=");

Отметим, что для унификации операций преобразования все базовые типы явным образом реализуют интерфейс System.IConvertible. Это интерфейс содержит набор методов вида ToИмяТипа(), где ИмяТипа – имя CLR для базовых типов. Каждый такой метод принимает аргумент типа IFormatProvider. Базовые типы при реализации IConvertible просто вызывают соответствующие методы класса Convert.

Статический класс System.BitConverter содержит набор методов для преобразования переменной числового или булевого типа в массив байтов, а также методы обратного преобразования. Подобные преобразования полезны при низкоуровневой работе с потоками данных.

byte[] data = BitConverter.GetBytes(10567);

int x = BitConverter.ToInt32(data, 0);

Важными видами преобразований являются получение строкового представления объекта и получение объекта из строки. Для получения строкового представления объекта можно использовать виртуальный метод ToString(), определённый в классе System.Object. Однако часто требуется дать возможность выбора формата представления и учесть региональные стандарты. Для этой цели предназначен интерфейс System.IFormattable, который реализуют числовые типы, структура DateTime, класс Enum и некоторые другие типы.

public interface IFormattable

{

string ToString(string format, IFormatProvider formatProvider);

}

Первый параметр метода IFormattable.ToString() – это строка, сообщающая способ форматирования объекта. Многие типы различают несколько строк форматирования. Например, структура DateTime поддерживает строку " d" для дат в кратком формате, " D" для дат в полном формате, " T" – для времени и т. д. Числа поддерживают строку " X" для шестнадцатеричного вывода, " C" – для валют, " E" – для научного формата. Числовые типы также различают шаблоны форматирования, чтобы отобразить нужное количество цифр и знаков в дробной части (полную информацию о строках форматирования смотрите в справке MSDN).

Второй параметр метода IFormattable.ToString() – это поставщик формата. Это объект, реализующий интерфейс IFormatProvider.

public interface IFormatProvider

{

object GetFormat(Type formatType);

}

Поставщик формата знает, как обеспечить учёт региональных стандартов, влияющих на форматирование чисел, дат и времени. Метод GetFormat() возвращает нужный объект для форматирования по его типу. Например, объект класса NumberFormatInfo описывает группу свойств NegativeSign, CurrencyDecimalSeparator, CurrencySymbol, NumberGroupSeporator и т. п. У объекта класса DateTimeFormatInfo имеются свойства Calendar, DayNames, DateSeparator, LongDatePattern, ShortTimePattern, TimeSeparator и т. п.

Платформа.NET содержит несколько поставщиков формата, в частности, класс CultureInfo[3]. Конструктор этого класса принимает числовой или строковый идентификатор культуры. Свойство CultureInfo.InvariantCulture описывает инвариантную культуру, не связанную с региональными стандартами.

// дата, которую будем форматировать

var dt = new DateTime(2012, 12, 21);

 

// создаём поставщик формата для русской культуры

// список кодов: https://msdn.microsoft.com/en-us/goglobal/bb896001

var culture = new CultureInfo(" ru-Ru");

 

// s1 = " 21 декабря 2012 г."

var s1 = dt.ToString(" D", culture);

 

// используем инвариантную культуру

var s2 = dt.ToString(" D", CultureInfo.InvariantCulture);

 

// используем культуру текущего потока выполнения

var s3 = dt.ToString(" D", null);

Чаще всего при получении строкового представления объекта нужно указать только формат, довольствуясь региональными стандартами, связанными с вызывающим потоком. Для упрощения работы во многие типы добавлены перегруженные версии метода ToString(), вызывающие IFormattable.ToString() с аргументами по умолчанию:

int x = 1024;

var s1 = x.ToString();

var s2 = x.ToString(" X");

var s3 = x.ToString(CultureInfo.InvariantCulture);

Любой тип может определять дополнительные методы для получения строкового представления данных. Например, в DateTime определены методы ToLongDateString(), ToShortDateString(), ToLongTimeString(), ToShortDateString().

Для получения данных типа по строке обычно используются статические методы, которые по соглашению об именовании называются Parse() и TryParse(). Если преобразование из строки невозможно, метод Parse() генерирует исключение, а TryParse() возвращает значение false. Методы Parse() и TryParse() есть во всех примитивных типах, классе Enum, в типах для работы со временем и во многих других типах. Обычно данные методы имеют перегруженные версии, принимающие в качестве аргумента поставщик формата. Некоторые типы дополнительно перегружают Parse() и TryParse() для более тонкой настройки преобразования:

int x = Int32.Parse(" 1024");

int z = Int32.Parse(" A03", NumberStyles.HexNumber);

int y;

if (Int32.TryParse(" 4201", out y))

{

Console.WriteLine(" Success");

}

DateTime dt = DateTime.Parse(" 13/01/2000 16: 45: 06");

Платформа.NET способна поддерживать различные текстовые кодировки и наборы символов. Для этого используется базовый класс System.Text.Encoding и наследники этого класса – конкретные кодировки. Чтобы получить объект-кодировку можно использовать статический метод Encoding.GetEncoding() или статические свойства для популярных кодировок:

// используется имя кодировки по стандарту IANA (www.iana.org)

Encoding utf8 = Encoding.GetEncoding(" utf-8");

 

// распространённую кодировку можно получить через свойство

Encoding ascii = Encoding.ASCII;

Основными методами каждого объекта-кодировки являются GetBytes() и GetString(). Первый метод нужен для перевода строки или массива символов в массив байтов (коды символов), второй метод делает обратное преобразование:

Encoding ascii = Encoding.ASCII;

byte[] asciiBytes = ascii.GetBytes(" Sample text");

string s = ascii.GetString(asciiBytes);






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.