Форматирование числовых данных для определенного языка и региональных параметров
Класс NumberFormatInfo определяет, каким образом будут форматироваться и выводиться на экран валюта, десятичные разделители и другие числовые символы в зависимости от языка и региональных параметров. Например, десятичное число 10000.50 форматируется как 10,000.50 для языка и региональных параметров "en-US" и как 10.000,50 для "de-DE".
Объект NumberFormatInfo можно создать для определенного или инвариантного языка и региона, но не для нейтрального языка и региона. Нейтральный язык и регион не предоставляют достаточно сведений для отображения числовых данных в правильном формате. При попытке приложения создать объект NumberFormatInfo с использованием нейтрального языка и региона возникает исключение.
В следующем примере кода выводится целое число с использованием стандартного формата валюты NumberFormatInfo ("c") для текущего языка и региональных параметров.
Imports System
Imports System.Globalization
Public Class TestClass
Public Shared Sub Main()
Dim i As Integer = 100
' Creates a CultureInfo for English in Belize.
Dim bz As New CultureInfo("en-BZ")
' Displays i formatted as currency for the bz.
Console.WriteLine(i.ToString("c", bz))
' Creates a CultureInfo for English in the U.S.
Dim us As New CultureInfo("en-US")
' Displays i formatted as currency for us.
Console.WriteLine(i.ToString("c", us))
' Creates a CultureInfo for Danish in Denmark.
Dim dk As New CultureInfo("da-DK")
' Displays i formatted as currency for dk.
Console.WriteLine(i.ToString("c", dk))
End Sub
End Class
using System;
using System.Globalization;
public class TestClass
{
public static void Main()
{
int i = 100;
// Creates a CultureInfo for English in Belize.
CultureInfo bz = new CultureInfo("en-BZ");
// Displays i formatted as currency for the bz.
Console.WriteLine(i.ToString("c", bz));
// Creates a CultureInfo for English in the U.S.
CultureInfo us = new CultureInfo("en-US");
// Display i formatted as currency for us.
Console.WriteLine(i.ToString("c", us));
// Creates a CultureInfo for Danish in Denmark.
CultureInfo dk = new CultureInfo("da-DK");
// Displays i formatted as currency for dk.
Console.WriteLine(i.ToString("c", dk));
}
}
В результате получаются следующие выходные данные:
BZ$100.00
$100.00
kr100,00
Форматирование валют для стран зоны евро
Каждый из классов CultureInfo и RegionInfo содержит сведения о валюте. Для каждого языка и региона определена только одна валюта. Евро — официальная валюта для Бельгии, Германии, Испании, Франции, Ирландии, Италии, Люксембурга, Нидерландов, Австрии, Португалии, Финляндии и Греции. С 1 января 2002 года эти страны начали использовать банкноты и монеты евро. Поэтому для этих 12 стран в .NET Framework и Microsoft Windows XP по умолчанию установлен символ валюты евро. В более старых версиях Windows для этих стран по умолчанию установлены символы "старых" валют.
Необходимо помнить о различиях операционных систем в отображении символов валют. В Windows пользователи могут переопределить некоторые значения, связанные с используемым по умолчанию языком и региональными параметрами с помощью панели управления Windows. Например, пользователь может выбрать символ для отображения валюты, отличный от символа по умолчанию для текущего языка и региональных параметров. В приложениях Windows Forms и консольных приложениях используется символ валюты, заданный по умолчанию в операционной системе. Если на компьютере пользователя в одной из стран зоны евро используется устаревшая версия Windows и в качестве валюты не задана денежная единица "евро" (это можно сделать в диалоговом окне "Язык и региональные стандарты" панели управления Windows), то по умолчанию будет использоваться неверное значение для валюты. Приложения ASP.NET и приложения веб-служб XML, созданные в ASP.NET, запускаются как системные службы, а не для конкретных пользователей. Поэтому возвращаемые ими по умолчанию результаты могут отличаться от тех, которые возвращают приложения Windows Forms или консольные приложения.
Чтобы защитить приложение от системных различий и гарантировать непротиворечивость форматирования валюты, рекомендуется создавать код, в котором используются настройки валюты по умолчанию платформы .NET Framework. В приложении нужно создать объект CultureInfo с помощью перегрузки конструктора, который принимает параметр useUserOverride и устанавливает его значение равным false. Это приведет к замене параметров валюты по умолчанию для операционной системы пользователя правильными параметрами по умолчанию для платформы .NET Framework.
В следующем коде веб-службы XML метод UserLocalSetting этой службы задает для свойства CurrentCulture значение "Французский (Франция)", "fr-FR", и возвращает целое число в формате валюты. Из-за различий в операционных системах нельзя сказать точно, какой символ будет использован: евро или "F". Метод OverrideUserSetting веб-сервера XML устанавливает для свойства CurrentCulture значение "fr-FR" с помощью конструктора CultureInfo, который принимает параметр useUserOverride и устанавливает для него значение false. Этот метод возвращает целое число в формате валюты. В этом случае можно гарантировать, что будет использован символ евро, так как он является символом по умолчанию для платформы .NET Framework.
<%@ WebService Language="VB" Class="userOverrideSample" %>
Imports System
Imports System.Web.Services
Imports System.Globalization
Imports System.Threading
Public Class userOverrideSample
<WebMethod> _
Public Function UserLocalSetting() As String
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
' Displays i formatted as currency for the CurrentCulture.
' Due to operating system differences, you cannot be sure what currency
' symbol will be used.
return (i.ToString("c"))
End Function
<WebMethod> _
Public Function OverrideUserSetting() As String
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
' Uses the CultureInfo constructor that takes a
' useUserOverride parameter.
' Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _
false)
' Displays i formatted as currency for the CurrentCulture.
' This will override any user settings and display the euro symbol.
return (i.ToString("c"))
End Function
End Class
<%@ WebService Language="c#" Class="userOverrideSample" %>
using System;
using System.Web.Services;
using System.Globalization;
using System.Threading;
public class userOverrideSample
{
[WebMethod]
public String UserLocalSetting()
{
int i = 100;
// Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Displays i formatted as currency for the CurrentCulture.
// Due to operating system differences, you cannot be sure what currency
// symbol will be used.
return (i.ToString("c"));
}
[WebMethod]
public String OverrideUserSetting()
{
int i = 100;
// Sets the CurrentCulture to French in France.
// Uses the CultureInfo constructor that takes a
// useUserOverride parameter.
// Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", _
false);
// Displays i formatted as currency for the CurrentCulture.
// This will override any user settings and display the euro symbol.
return (i.ToString("c"));
}
}
В приложениях Windows Forms и консольных приложениях, работающих во всех версиях операционной системы Windows, символ валюты по умолчанию устанавливается в зависимости от параметров компьютера пользователя. Как упоминалось ранее, эти установки могут быть неверными. Чтобы в приложении обязательно использовались параметры по умолчанию платформы .NET Framework, необходимо создать объект CultureInfo, установив для параметра useUserOverride значение false.
В следующем примере используется код, подобный коду из предыдущего примера. Этот код устанавливает текущий язык и региональные параметры "fr-FR" и выводит на консоль целое число в формате валюты. Для форматирования используются параметры местной валюты пользователя. Далее для языка и региональных параметров задается значение "fr-FR" с помощью конструктора CultureInfo, принимающего параметр useUserOverride и задающего для него значение false. Затем число форматируется с использованием параметров .NET Framework по умолчанию, и на экран выводится символ евро.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class EuroSymbolSample
Public Shared Sub Main()
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
' Displays i formatted as currency for the CurrentCulture.
' On a version of Windows prior to Windows XP, where the user
' has not changed the default currency to euro through the
' Control Panel, this will default to "F".
Console.WriteLine(i.ToString("c"))
' Sets the CurrentCulture to French in France, using the
' CultureInfo constructor that takes a useUserOverride parameter.
' Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _
False)
' Displays i formatted as default currency for the CurrentCulture.
' On a version of Windows prior to Windows XP, this will override an
' incorrect default setting of "F" and display the euro symbol ().
Console.WriteLine(i.ToString("c"))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class EuroSymbolSample
{
public static void Main()
{
int i = 100;
// Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Displays i formatted as default currency for the CurrentCulture.
// On a version of Windows prior to Windows XP, where the user
// has not changed the default currency to euro through the
// Control Panel, this will default to "F".
Console.WriteLine(i.ToString("c"));
// Sets the CurrentCulture to French in France, using the
// CultureInfo constructor that takes a useUserOverride parameter.
// Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR",
false);
// Displays i formatted as default currency for the CurrentCulture.
// On a version of Windows prior to Windows XP, this will override an
// incorrect default setting of "F" and display the euro symbol ().
Console.WriteLine(i.ToString("c"));
}
}
Необходимо помнить, что в среде консоли отсутствует поддержка символа евро. Если выполнить этот код в приложении Windows Forms, будет получен результат:
100,00 F
100,00 €
Во многих европейских странах используются две валюты: евро и местная валюта. В некоторых ситуациях в приложении необходимо выводить на экран обе валюты. В следующем примере кода создается объект CultureInfo для языка и региональных параметров "fr-FR", где валютой по умолчанию является евро. Чтобы отобразить символ валюты для местной валюты, необходимо с помощью метода NumberFormatInfo.Clone создать копию свойства NumberFormatInfo для объекта CultureInfo и заменить символ валюты по умолчанию символом местной валюты.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class EuroLocalSample
Public Shared Sub Main()
' Creates a CultureInfo for French in France.
Dim FrCulture As New CultureInfo("fr-FR")
' Sets the CurrentCulture to fr-FR.
Thread.CurrentThread.CurrentCulture = FrCulture
' Clones the NumberFormatInfo and creates
' a new object for the local currency of France.
Dim LocalFormat As NumberFormatInfo =_
CType(NumberFormatInfo.CurrentInfo.Clone(), NumberFormatInfo)
' Replaces the default currency symbol
' with the local currency symbol.
LocalFormat.CurrencySymbol = "F"
Dim i As Integer = 100
' Displays i formatted as the local currency.
Console.WriteLine(i.ToString("c", LocalFormat))
' Displays i formatted as the default currency.
Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class EuroLocalSample
{
public static void Main()
{
// Creates a CultureInfo for French in France.
CultureInfo FrCulture = new CultureInfo("fr-FR");
// Sets the CurrentCulture to fr-FR.
Thread.CurrentThread.CurrentCulture = FrCulture;
// Clones the NumberFormatInfo and creates
// a new object for the local currency of France.
NumberFormatInfo LocalFormat =
(NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
// Replaces the default currency symbol with the
// local currency symbol.
LocalFormat.CurrencySymbol = "F";
int i = 100;
// Displays i formatted as the local currency.
Console.WriteLine(i.ToString("c", LocalFormat));
// Displays i formatted as the default currency.
Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo));
}
}
В качестве примера по этой теме см. пример "MultiCurrency" в разделе Common Tasks QuickStart.