C#

Рекламный модуль
шарики Пузыри Bubbles, игры шарики.

Работа с национальным форматом

В среде .NET информация о национальном формате реализована с использованием двух идентификаторов — языка (language) и специализации (specialization). Как я уже упомянул, в Швейцарии четыре разговорных языка, что означает также четыре раз¬ных способа выражения дат, времени и валют. Это не означает, что дата у немецкоя¬зычных и франкоязычных людей разная. Формат даты будет одинаков, но слова Maerz и Mars в описании месяца марта будут различны. Слова для даты будут те же, что и для Австрии, Швейцарии и Германии, но формат будет другой~Это значит, что такие многоязычные страны, как Канада (французский и английский языки) и Люксембург (французский и немецкий языки) должны быть способны использовать несколько коди¬ровок, а следовательно, нуждаются в двух идентификаторах. Чтобы получить информацию о текущем национальном формате, используйте сле¬дующий код. Culturelnfo info = Thread.CurrentThread.CurrentCulture; Console.WriteLine ( "Culture (" + info.EnglishName + ")"); Метод Thread.CurrentThread.CurrentCulture () возвращает информацию о нацио¬нальном формате, связанную с потоком, выполняющимся в настоящий момент. Как по¬бочное явление, появляется возможность связать различные потоки с различной наци¬ональной информацией. Свойство EnglishName задает английскую версию информации о национальном формате. Это будет выглядеть следующим образом. Culture (English (Canada)) Рассмотрим следующее число. 1,234 В американском или канадском национальном формате это число — одна тысяча двести тридцать четыре, но в немецком национальном формате — это одна целая, две¬сти тридцать четыре тысячные (в Германии запятая используется как десятичный раз¬делитель, а точка — как разделитель тысяч). Один из способов смены национального формата возможен в диалоговом окне, приведенном на рис. 3.12. Второй способ воз¬можен на программном уровне, как в следующем коде. Thread.CurrentThread.CurrentCulture = new Culturelnfo("en-СА"); В этом примере создается новый экземпляр объекта Cultureinf о, содержащий ин¬формацию национального формата еп-СА. Следующий пример обрабатывает число типа double, используя кодировку немец¬кого формата. public void TestGermanParseNumber() { Thread.CurrentThread.CurrentCulture = new Cultureinfо("de-DE"); double value = Double.Parse("1,234") ; } В этом примере текущему потоку присваивается информация о национальном формате de-DE. Теперь, при использовании любой из функций анализа, будут при¬меняться правила немецкого форматирования для Германии. Изменение информа¬ции о национальном формате не повлияет на правила форматирования для языка программирования. Используя функции Parse () и TryParse (), можно также анализировать дату и вре¬мя, как показано в следующем примере. public void TestGermanParseDate () { DateTime datetime = DateTime.Parse("May 10, 2005"); Assert.AreEqual(5, datetime.Month); Thread.CurrentThread.CurrentCulture = new Culturelnfo("de-DE"); datetime = DateTime.Parse ("10 Mai, 2005"); Assert.AreEqual(5, sfctetime.Month); } Обратите внимание, как первый вызов метода DateTime. Parse () обрабатывает текст в английско-канадском формате и узнает, что идентификатор May эквивалентен пятому месяцу года. Перед вторым вызовом метода DateTime. Parse () национальный формат изменен на немецкий. В результате появилась возможность обработать строку 10 Mai, 2 0 05. В обоих случаях обработка буфера не создала никаких серьезных проблем, по¬скольку вы знали, что буфер содержал дату в немецком или английско-канадском фор¬мате. Но все может стать куда сложней, когда дата будет немецкой, а национальный формат — английским. Среда .NET 2.0 преобразует значение типа данных в содержимое буфера относитель¬но просто, поскольку это осуществляет метод ToString (). Рассмотрим следующий при¬мер, создающий буфер из целочисленного значения. public void TestGenerateString() { String buffer = 123.ToString (); Assert.AreEqual("123", buffer); } В этом примере значение 123 было неявно преобразовано в переменную и фактиче¬ски не представляет переменную 123. Затем для значения 123 можно применить метод ToString (), который создает буфер, содержащий строку " 123". Та же самое можно про¬делать с числом типа double, как в этом примере. double number = 123.5678; String buffer = number.ToString("0.00"); Здесь число 123.5 67 8 преобразовано в содержимое буфера с использованием метода ToString (), но у метода ToString () есть параметр, инструкция по форматированию, указывающая, как число типа double должно быть отображено в буфере. Желательный результат — буфер с двумя цифрами после запятой. Поскольку третья цифра после де¬сятичной запятой — 7, значение округляется до 123.57. Давайте рассмотрим пример, где информация о национальном формате применяет¬ся также к получаемому буферу. Здесь значение типа double создается в национальном формате. public void TestGenerateGermanNumber () { double number = 123.5678; Thread.CurrentThread.CurrentCulture = new Culturelnfо("de-DE"); String buffer = number.ToString("0.00"); Assert. AreEquaM" 123, 57", buffer) ; } Как и в предыдущих примерах, свойство CurrentCulture применяется для указания желаемого национального формата. Затем происходит вызов метода ToStringO для переменной number типа double, имеющей собственный метод ToString (), создающий буфер "123,57".