Работа с национальным форматом
В среде .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".