Поделиться через


Форматирование числовых данных для определенного языка и региональных параметров

Класс 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.

См. также

Другие ресурсы

Шифрование и локализация

Formatting Types

Formatting for Different Cultures