NumberFormatInfo Класс

Определение

Предоставляет сведения для конкретного языка и региональных параметров для числовых значений форматирования и анализа.Provides culture-specific information for formatting and parsing numeric values.

public ref class NumberFormatInfo sealed : ICloneable, IFormatProvider
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements ICloneable, IFormatProvider
Наследование
NumberFormatInfo
Атрибуты
Реализации

Примеры

В следующем примере показано, как получить NumberFormatInfo объект для соответствующего CultureInfo объекта и использовать полученный объект для запроса сведений о форматировании номеров для определенного языка и региональных параметров.The following example shows how to retrieve a NumberFormatInfo object for a corresponding CultureInfo object, and use the retrieved object to query number formatting information for the particular culture.

using namespace System;
using namespace System::Globalization;
using namespace System::Text;

int main()
{
    StringBuilder^ builder = gcnew StringBuilder();

    // Loop through all the specific cultures known to the CLR.
    for each(CultureInfo^ culture in 
        CultureInfo::GetCultures (CultureTypes::SpecificCultures)) 
    {
        // Only show the currency symbols for cultures 
        // that speak English.
        if (culture->TwoLetterISOLanguageName == "en")
        {
            // Display the culture name and currency symbol.
            NumberFormatInfo^ numberFormat = culture->NumberFormat;
            builder->AppendFormat("The currency symbol for '{0}'"+
                "is '{1}'",culture->DisplayName,
                numberFormat->CurrencySymbol);
            builder->AppendLine();
        }
    }
    Console::WriteLine(builder);
}

// This code produces the following output.
//
// The currency symbol for 'English (United States)' is '$'
// The currency symbol for 'English (United Kingdom)' is 'Ј'
// The currency symbol for 'English (Australia)' is '$'
// The currency symbol for 'English (Canada)' is '$'
// The currency symbol for 'English (New Zealand)' is '$'
// The currency symbol for 'English (Ireland)' is '?'
// The currency symbol for 'English (South Africa)' is 'R'
// The currency symbol for 'English (Jamaica)' is 'J$'
// The currency symbol for 'English (Caribbean)' is '$'
// The currency symbol for 'English (Belize)' is 'BZ$'
// The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
// The currency symbol for 'English (Zimbabwe)' is 'Z$'
// The currency symbol for 'English (Republic of the Philippines)' is 'Php'
using System;
using System.Globalization;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        StringBuilder sb = new StringBuilder();

        // Loop through all the specific cultures known to the CLR.
        foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
        {
            // Only show the currency symbols for cultures that speak English.
            if (ci.TwoLetterISOLanguageName != "en") continue;
             
            // Display the culture name and currency symbol.
            NumberFormatInfo nfi = ci.NumberFormat;
            sb.AppendFormat("The currency symbol for '{0}' is '{1}'",
                ci.DisplayName, nfi.CurrencySymbol);
            sb.AppendLine();
        }
        Console.WriteLine(sb.ToString());
    }
}

// This code produces the following output.
//
// The currency symbol for 'English (United States)' is '$'
// The currency symbol for 'English (United Kingdom)' is '£'
// The currency symbol for 'English (Australia)' is '$'
// The currency symbol for 'English (Canada)' is '$'
// The currency symbol for 'English (New Zealand)' is '$'
// The currency symbol for 'English (Ireland)' is '?'
// The currency symbol for 'English (South Africa)' is 'R'
// The currency symbol for 'English (Jamaica)' is 'J$'
// The currency symbol for 'English (Caribbean)' is '$'
// The currency symbol for 'English (Belize)' is 'BZ$'
// The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
// The currency symbol for 'English (Zimbabwe)' is 'Z$'
// The currency symbol for 'English (Republic of the Philippines)' is 'Php'
Imports System.Globalization
Imports System.Text

Public Module Example
   Public Sub Main() 
      Dim sb As New StringBuilder()

      ' Loop through all the specific cultures known to the CLR.
      For Each ci In CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
         ' Only show the currency symbols for cultures that speak English.
         If ci.TwoLetterISOLanguageName <> "en" Then Continue For

         ' Display the culture name and currency symbol.
         Dim nfi As NumberFormatInfo = ci.NumberFormat
         sb.AppendFormat("The currency symbol for '{0}' is '{1}'",
                         ci.DisplayName, nfi.CurrencySymbol)
         sb.AppendLine()
      Next
      Console.WriteLine(sb.ToString())
   End Sub
End Module
' The example displays output like the following:
'       The currency symbol for 'English (United States)' is '$'
'       The currency symbol for 'English (United Kingdom)' is '£'
'       The currency symbol for 'English (Australia)' is '$'
'       The currency symbol for 'English (Canada)' is '$'
'       The currency symbol for 'English (New Zealand)' is '$'
'       The currency symbol for 'English (Ireland)' is '?'
'       The currency symbol for 'English (South Africa)' is 'R'
'       The currency symbol for 'English (Jamaica)' is 'J$'
'       The currency symbol for 'English (Caribbean)' is '$'
'       The currency symbol for 'English (Belize)' is 'BZ$'
'       The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
'       The currency symbol for 'English (Zimbabwe)' is 'Z$'
'       The currency symbol for 'English (Republic of the Philippines)' is 'Php'
'       The currency symbol for 'English (India)' is 'Rs.'
'       The currency symbol for 'English (Malaysia)' is 'RM'
'       The currency symbol for 'English (Singapore)' is '$'

Комментарии

Класс NumberFormatInfo содержит сведения, относящиеся к языку и региональным параметрам, которые используются при форматировании и анализе числовых значений.The NumberFormatInfo class contains culture-specific information that is used when you format and parse numeric values. Эти сведения включают символ валюты, десятичный символ, символ разделителя групп и символы для положительных и отрицательных знаков.This information includes the currency symbol, the decimal symbol, the group separator symbol, and the symbols for positive and negative signs.

Создание экземпляра объекта NumberFormatInfoInstantiating a NumberFormatInfo object

Можно создать экземпляр NumberFormatInfo объекта, который представляет соглашения о форматировании для текущего языка и региональных параметров, инвариантный язык и региональные параметры, а также нейтральный язык и региональные параметры.You can instantiate a NumberFormatInfo object that represents the formatting conventions of the current culture, the invariant culture, a specific culture, or a neutral culture.

Создание экземпляра объекта NumberFormatInfo для текущего языка и региональных параметровInstantiating a NumberFormatInfo object for the current culture

Вы можете создать экземпляр NumberFormatInfo объекта для языка и региональных параметров текущего потока одним из следующих способов.You can instantiate a NumberFormatInfo object for the current thread culture in any of the following ways. В каждом случае возвращаемый NumberFormatInfo объект доступен только для чтения.In each case, the returned NumberFormatInfo object is read-only.

В следующем примере используются три способа создания NumberFormatInfo объектов, представляющих соглашения о форматировании для текущего языка и региональных параметров.The following example uses these three ways to create NumberFormatInfo objects that represent the formatting conventions of the current culture. Он также получает значение IsReadOnly свойства, чтобы проиллюстрировать, что каждый объект доступен только для чтения.It also retrieves the value of the IsReadOnly property to illustrate that each object is read-only.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      NumberFormatInfo current1 = CultureInfo.CurrentCulture.NumberFormat;
      Console.WriteLine(current1.IsReadOnly);
      
      NumberFormatInfo current2 = NumberFormatInfo.CurrentInfo;
      Console.WriteLine(current2.IsReadOnly);
      
      NumberFormatInfo current3 = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
      Console.WriteLine(current3.IsReadOnly);
   }
}
// The example displays the following output:
//       True
//       True
//       True
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current1 As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
      Console.WriteLine(current1.IsReadOnly)
      
      Dim current2 As NumberFormatInfo = NumberFormatInfo.CurrentInfo
      Console.WriteLine(current2.IsReadOnly)
      
      Dim current3 As NumberFormatInfo = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture)
      Console.WriteLine(current3.IsReadOnly)
   End Sub
End Module
' The example displays the following output:
'       True
'       True
'       True

Можно создать доступный для записи NumberFormatInfo объект, представляющий соглашения о текущем языке и региональных параметрах текущего потока, одним из следующих способов:You can create a writable NumberFormatInfo object that represents the conventions of the current thread culture in any of the following ways:

В следующем примере показаны два способа создания экземпляра NumberFormatInfo объекта и показано значение его IsReadOnly свойства, чтобы показать, что объект не доступен только для чтения.The following example illustrates these two ways of instantiating a NumberFormatInfo object, and displays the value of its IsReadOnly property to illustrate that the object is not read-only.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      NumberFormatInfo current1 = NumberFormatInfo.CurrentInfo;
      current1 = (NumberFormatInfo) current1.Clone();
      Console.WriteLine(current1.IsReadOnly);

      CultureInfo culture2 = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
      NumberFormatInfo current2 = culture2.NumberFormat;
      Console.WriteLine(current2.IsReadOnly);
   }
}
// The example displays the following output:
//       False
//       False
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current1 As NumberFormatInfo = NumberFormatInfo.CurrentInfo
      current1 = CType(current1.Clone(), NumberFormatInfo)
      Console.WriteLine(current1.IsReadOnly)

      Dim culture2 As CultureInfo = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name)
      Dim current2 As NumberFormatInfo = culture2.NumberFormat
      Console.WriteLine(current2.IsReadOnly)
   End Sub
End Module
' The example displays the following output:
'       False
'       False

Обратите внимание, что операционная система Windows позволяет пользователю переопределить некоторые NumberFormatInfo значения свойств, используемые в операциях числового форматирования и синтаксического анализа, с помощью элемента регион и язык на панели управления.Note that the Windows operating system allows the user to override some of the NumberFormatInfo property values used in numeric formatting and parsing operations through the Region and Language item in Control Panel. Например, пользователь, чья культура которого имеет значение Английский (США), может выбрать отображение денежных значений как 1,1 долларов США вместо значения по умолчанию $1,1.For example, a user whose culture is English (United States) might choose to display currency values as 1.1 USD instead of the default of $1.1. Объекты NumberFormatInfo , полученные в описанных выше способах, соответствуют этим переопределениям пользователя.The NumberFormatInfo objects retrieved in the ways discussed previously all reflect these user overrides. Если это нежелательно, NumberFormatInfo можно создать объект, который не отражает переопределяемые пользователем переопределения (а также false для чтения и записи, а не только для чтения), CultureInfo.CultureInfo(String, Boolean) вызвав конструктор и указав значение для useUserOverride элемента параметр.If this is undesirable, you can create a NumberFormatInfo object that does not reflect user overrides (and that is also read/write rather than read-only) by calling the CultureInfo.CultureInfo(String, Boolean) constructor and supplying a value of false for the useUserOverride argument. В следующем примере показана схема для системы, текущей культурной средой которой является английский (США), а символ валюты изменился со значения по умолчанию $ до USD.The following example provides an illustration for a system whose current culture is English (United States) and whose currency symbol has been changed from the default of $ to USD.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo culture;
      NumberFormatInfo nfi;
      
      culture = CultureInfo.CurrentCulture;
      nfi = culture.NumberFormat;
      Console.WriteLine("Culture Name:    {0}", culture.Name);
      Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride);
      Console.WriteLine("Currency Symbol: {0}\n", culture.NumberFormat.CurrencySymbol);
            
      culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
      Console.WriteLine("Culture Name:    {0}", culture.Name);
      Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride);
      Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol);
   }
}
// The example displays the following output:
//       Culture Name:    en-US
//       User Overrides:  True
//       Currency Symbol: USD
//       
//       Culture Name:    en-US
//       User Overrides:  False
//       Currency Symbol: $
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim culture As CultureInfo
      Dim nfi As NumberFormatInfo
      
      culture = CultureInfo.CurrentCulture
      nfi = culture.NumberFormat
      Console.WriteLine("Culture Name:    {0}", culture.Name)
      Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride)
      Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol)
      Console.WriteLine()
            
      culture = New CultureInfo(CultureInfo.CurrentCulture.Name, False)
      Console.WriteLine("Culture Name:    {0}", culture.Name)
      Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride)
      Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol)
   End Sub
End Module
' The example displays the following output:
'       Culture Name:    en-US
'       User Overrides:  True
'       Currency Symbol: USD
'       
'       Culture Name:    en-US
'       User Overrides:  False
'       Currency Symbol: $

true CultureInfo.DateTimeFormatЕсли свойство имеет значение, свойстваCultureInfo.NumberFormat, иCultureInfo.TextInfo также извлекаются из параметров пользователя. CultureInfo.UseUserOverrideIf the CultureInfo.UseUserOverride property is set to true, the properties CultureInfo.DateTimeFormat, CultureInfo.NumberFormat, and CultureInfo.TextInfo are also retrieved from the user settings. Если параметры пользователя несовместимы с культурой, связанной с CultureInfo объектом (например, если выбранный календарь не является одним из календарей, перечисленных OptionalCalendars в свойстве), то результаты методов и значений свойств будут определено.If the user settings are incompatible with the culture associated with the CultureInfo object (for example, if the selected calendar is not one of the calendars listed by the OptionalCalendars property), the results of the methods and the values of the properties are undefined.

Создание экземпляра объекта NumberFormatInfo для инвариантного языка и региональных параметровInstantiating a NumberFormatInfo object for the invariant culture

Инвариантная культура представляет язык и региональные параметры, не учитывающие язык и региональные параметры.The invariant culture represents a culture that is culture-insensitive. Он основан на английском языке, но не в конкретной стране или регионе, говорящей на английском языке.It is based on the English language but not on any specific English-speaking country/region. Хотя данные определенных языков и региональных параметров могут быть динамическими и могут меняться в соответствии с новыми региональными соглашениями или предпочтениями пользователя, данные инвариантного языка и региональных параметров не меняются.Although the data of specific cultures can be dynamic and can change to reflect new cultural conventions or user preferences, the data of the invariant culture does not change. NumberFormatInfo Объект, представляющий соглашения о форматировании инвариантного языка и региональных параметров, можно использовать для операций форматирования, в которых результирующие строки не должны отличаться от языка и региональных параметров.A NumberFormatInfo object that represents the formatting conventions of the invariant culture can be used for formatting operations in which result strings should not vary by culture.

Создать экземпляр NumberFormatInfo объекта, который представляет соглашения о форматировании инвариантного языка и региональных параметров, можно следующими способами.You can instantiate a NumberFormatInfo object that represents the formatting conventions of the invariant culture in the following ways:

В следующем примере каждый из этих методов используется для создания экземпляра NumberFormatInfo объекта, представляющего инвариантный язык и региональные параметры.The following example uses each of these methods to instantiate a NumberFormatInfo object that represents the invariant culture. Затем он указывает, доступен ли объект только для чтения,It then indicates whether the object is read-only,

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      NumberFormatInfo nfi;
      
      nfi = System.Globalization.NumberFormatInfo.InvariantInfo;
      Console.WriteLine(nfi.IsReadOnly);               
      
      nfi = CultureInfo.InvariantCulture.NumberFormat;
      Console.WriteLine(nfi.IsReadOnly);               
      
      nfi = New NumberFormatInfo();
      Console.WriteLine(nfi.IsReadOnly);               
   }
}
// The example displays the following output:
//       True
//       True
//       False
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim nfi As NumberFormatInfo
      
      nfi = System.Globalization.NumberFormatInfo.InvariantInfo
      Console.WriteLine(nfi.IsReadOnly)               
      
      nfi = CultureInfo.InvariantCulture.NumberFormat
      Console.WriteLine(nfi.IsReadOnly)               
      
      nfi = New NumberFormatInfo()
      Console.WriteLine(nfi.IsReadOnly)               
   End Sub
End Module
' The example displays the following output:
'       True
'       True
'       False

Создание экземпляра объекта NumberFormatInfo для определенного языка и региональных параметровInstantiating a NumberFormatInfo object for a specific culture

Конкретный язык и региональные параметры представляют язык, который говорят в определенной стране или регионе.A specific culture represents a language that is spoken in a particular country/region. Например, EN-US — это конкретная культура, представляющая английский язык, произнесенный в США, а en-CA — это конкретная культура, представляющая английский язык, произнесенный в Канаде.For example, en-US is a specific culture that represents the English language spoken in the United States, and en-CA is a specific culture that represents the English language spoken in Canada. Создать экземпляр NumberFormatInfo объекта, который представляет соглашения о форматировании для определенного языка и региональных параметров, можно следующими способами.You can instantiate a NumberFormatInfo object that represents the formatting conventions of a specific culture in the following ways:

В следующем примере используются четыре способа создания NumberFormatInfo объекта, который отражает соглашения о форматировании для языка и региональных параметров Индонезийский (Индонезия).The following example uses these four ways to create a NumberFormatInfo object that reflects the formatting conventions of the Indonesian (Indonesia) culture. Он также указывает, доступен ли каждый объект только для чтения.It also indicates whether each object is read-only.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo culture;
      NumberFormatInfo nfi;
      
      nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat;
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
      
      culture = new CultureInfo("id-ID");
      nfi = NumberFormatInfo.GetInstance(culture);
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
      
      culture = CultureInfo.CreateSpecificCulture("id-ID");
      nfi = culture.NumberFormat;
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
      
      culture = new CultureInfo("id-ID");
      nfi = culture.NumberFormat;
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
   }
}
// The example displays the following output:
//       Read-only: True
//       Read-only: False
//       Read-only: False
//       Read-only: False
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim culture As CultureInfo
      Dim nfi As NumberFormatInfo
      
      nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
      
      culture = New CultureInfo("id-ID")
      nfi = NumberFormatInfo.GetInstance(culture)
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
      
      culture = CultureInfo.CreateSpecificCulture("id-ID")
      nfi = culture.NumberFormat
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
      
      culture = New CultureInfo("id-ID")
      nfi = culture.NumberFormat
      Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
   End Sub
End Module
' The example displays the following output:
'       Read-only: True
'       Read-only: False
'       Read-only: False
'       Read-only: False

Создание экземпляра объекта NumberFormatInfo для нейтрального языка и региональных параметровInstantiating a NumberFormatInfo object for a neutral culture

Нейтральный язык и региональные параметры представляют язык и региональные параметры, независимые от страны или региона.A neutral culture represents a culture or language that is independent of a country/region. Обычно это родительский элемент для одного или нескольких конкретных языков и региональных параметров.It is typically the parent of one or more specific cultures. Например, fr — это нейтральный язык и региональные параметры для французского языка и родителя языка и региональных параметров fr-FR.For example, fr is a neutral culture for the French language and the parent of the fr-FR culture. Вы создаете NumberFormatInfo объект, представляющий соглашения о форматировании нейтрального языка и региональных параметров, точно так же, NumberFormatInfo как при создании объекта, представляющего соглашения о форматировании для конкретного языка и региональных параметров.You create a NumberFormatInfo object that represents the formatting conventions of a neutral culture in the same way that you create a NumberFormatInfo object that represents the formatting conventions of a specific culture.

Примечание

В и более ранних версиях попытка NumberFormatInfo получить объект, отражающий соглашения о форматировании нейтрального языка и региональных NotSupportedException параметров, вызывает исключение. .NET Framework 3,5.NET Framework 3.5In the .NET Framework 3,5.NET Framework 3.5 and earlier versions, trying to retrieve a NumberFormatInfo object that reflects the formatting conventions of a neutral culture throws a NotSupportedException exception.

Однако, поскольку он не зависит от конкретной страны или региона, нейтральная культура не имеет сведений об особенностях форматирования, связанных с языком и региональными параметрами.However, because it is independent of a specific country/region, a neutral culture lacks culture-specific formatting information. Вместо того чтобы заполнять NumberFormatInfo объект универсальными значениями, .NET Framework NumberFormatInfo возвращает объект, отражающий соглашения о форматировании для конкретного языка и региональных параметров, которые являются дочерними для нейтрального языка и региональных параметров.Rather than populating the NumberFormatInfo object with generic values, the .NET Framework returns a NumberFormatInfo object that reflects the formatting conventions of a specific culture that is a child of the neutral culture. Например, NumberFormatInfo объект нейтрального языка и региональных параметров en отражает соглашения о форматировании языка и региональных параметров en-US, NumberFormatInfo а объект для языка и региональных параметров fr отражает соглашения о форматировании языка и региональных параметров fr-FR.For example, the NumberFormatInfo object for the neutral en culture reflects the formatting conventions of the en-US culture, and the NumberFormatInfo object for the fr culture reflects the formatting conventions of the fr-FR culture.

Вы можете использовать следующий код, чтобы определить, какие соглашения о форматировании для конкретного языка и региональных параметров представляют каждый нейтральный язык и региональные параметры.You can use code like the following to determine which specific culture's formatting conventions each neutral culture represents.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;

public class Example
{
   public static void Main()
   {
      // Get all the neutral cultures
      List<String> names = new List<String>();
      Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
                    culture => names.Add(culture.Name));
      names.Sort();
      foreach (var name in names) {
         // Ignore the invariant culture.
         if (name == "") continue;
         
         ListSimilarChildCultures(name);        
      }
   }

   private static void ListSimilarChildCultures(string name)
   { 
      // Create the neutral NumberFormatInfo object.
      NumberFormatInfo nfi = CultureInfo.GetCultureInfo(name).NumberFormat;
      // Retrieve all specific cultures of the neutral culture.
      CultureInfo[] cultures = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures), 
                               culture => culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase));
      // Create an array of NumberFormatInfo properties
      PropertyInfo[] properties = typeof(NumberFormatInfo).GetProperties(BindingFlags.Instance | BindingFlags.Public);
      bool hasOneMatch = false;

      foreach (var ci in cultures) {
         bool match = true;     
         // Get the NumberFormatInfo for a specific culture.
         NumberFormatInfo specificNfi = ci.NumberFormat;
         // Compare the property values of the two.
         foreach (var prop in properties) {
            // We're not interested in the value of IsReadOnly.     
            if (prop.Name == "IsReadOnly") continue;
            
            // For arrays, iterate the individual elements to see if they are the same.
            if (prop.PropertyType.IsArray) { 
               IList nList = (IList) prop.GetValue(nfi, null);
               IList sList = (IList) prop.GetValue(specificNfi, null);
               if (nList.Count != sList.Count) {
                  match = false;
                  break;
               } 

               for (int ctr = 0; ctr < nList.Count; ctr++) {
                  if (! nList[ctr].Equals(sList[ctr])) {
                     match = false;
                     break;
                  }     
               }
            }   
            else if (! prop.GetValue(specificNfi).Equals(prop.GetValue(nfi))) {
               match = false;
               break;   
            }        
         }
         if (match) {
            Console.WriteLine("NumberFormatInfo object for '{0}' matches '{1}'", 
                                      name, ci.Name);
            hasOneMatch = true;
         }                                       
      }
      if (! hasOneMatch)
         Console.WriteLine("NumberFormatInfo object for '{0}' --> No Match", name);            

      Console.WriteLine();
   }
}
Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection

Module Example
   Public Sub Main()
      ' Get all the neutral cultures
      Dim names As New List(Of String)
      Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
                    Sub(culture) names.Add(culture.Name))
      names.Sort()
      For Each name In names
         ' Ignore the invariant culture.
         If name = "" Then Continue For
         
         ListSimilarChildCultures(name)        
      Next
   End Sub

   Private Sub ListSimilarChildCultures(name As String)
      ' Create the neutral NumberFormatInfo object.
      Dim nfi As NumberFormatInfo = CultureInfo.GetCultureInfo(name).NumberFormat
      ' Retrieve all specific cultures of the neutral culture.
      Dim cultures() As CultureInfo = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures), 
                               Function(culture) culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase))
      ' Create an array of NumberFormatInfo properties
      Dim properties() As PropertyInfo = GetType(NumberFormatInfo).GetProperties(BindingFlags.Instance Or BindingFlags.Public)
      Dim hasOneMatch As Boolean = False

      For Each ci In cultures
         Dim match As Boolean = True     
         ' Get the NumberFormatInfo for a specific culture.
         Dim specificNfi As NumberFormatInfo = ci.NumberFormat
         ' Compare the property values of the two.
         For Each prop In properties
            ' We're not interested in the value of IsReadOnly.     
            If prop.Name = "IsReadOnly" Then Continue For
            
            ' For arrays, iterate the individual elements to see if they are the same.
            If prop.PropertyType.IsArray Then 
               Dim nList As IList = CType(prop.GetValue(nfi, Nothing), IList)
               Dim sList As IList = CType(prop.GetValue(specificNfi, Nothing), IList)
               If nList.Count <> sList.Count Then
                  match = false
                  Exit For
               End If 

               For ctr As Integer = 0 To nList.Count - 1
                  If Not nList(ctr).Equals(sList(ctr)) 
                     match = false
                     Exit For
                  End If     
               Next
            Else If Not prop.GetValue(specificNfi).Equals(prop.GetValue(nfi))
               match = false
               Exit For   
            End If        
         Next
         If match Then
            Console.WriteLine("NumberFormatInfo object for '{0}' matches '{1}'", 
                                      name, ci.Name)
            hasOneMatch = true
         End If                                       
      Next
      If Not hasOneMatch Then
         Console.WriteLine("NumberFormatInfo object for '{0}' --> No Match", name)            
      End If
      
      Console.WriteLine()
   End Sub
End Module

NumberFormatInfo и динамические данныеNumberFormatInfo and dynamic data

Данные, зависящие от языка и региональных параметров, для форматирования NumberFormatInfo числовых значений, предоставляемых классом, являются динамическими, CultureInfo как и региональные данные, предоставляемые классом.The culture-specific data for formatting numeric values provided by the NumberFormatInfo class is dynamic, just like the cultural data provided by the CultureInfo class. Не следует делать никаких предположений о стабильности значений для NumberFormatInfo объектов, связанных с определенными CultureInfo объектами.You should not make any assumptions about the stability of values for NumberFormatInfo objects that are associated with particular CultureInfo objects. Стабильными являются только данные, предоставленные инвариантным и связанным NumberFormatInfo с ним объектом.Only the data provided by the invariant culture and its associated NumberFormatInfo object is stable. Другие данные могут изменяться между сеансами приложения или даже в рамках одного сеанса по следующим причинам.Other data can change between application sessions, or even within a single session, for the following reasons:

  • Обновления системы.System updates. Параметры культуры, такие как обозначение денежной единицы или денежные форматы, меняются со временем.Cultural preferences such as the currency symbol or currency formats change over time. В этом случае центр обновления Windows включает изменения NumberFormatInfo значения свойства для определенного языка и региональных параметров.When this happens, Windows Update includes changes to the NumberFormatInfo property value for a particular culture.

  • Языки и региональные параметры замены.Replacement cultures. CultureAndRegionInfoBuilder Класс можно использовать для замены данных существующего языка и региональных параметров.The CultureAndRegionInfoBuilder class can be used to replace the data of an existing culture.

  • Каскадные изменения в значениях свойств.Cascading changes to property values. Некоторые свойства, связанные с культурой, могут изменяться во время выполнения, что, в NumberFormatInfo свою очередь, приводит к изменению данных.A number of culture-related properties can change at run time, which, in turn, causes NumberFormatInfo data to change. Например, текущий язык и региональные параметры можно изменить программно или с помощью действия пользователя.For example, the current culture can be changed either programmatically or through user action. В NumberFormatInfo этом случае объект, возвращаемый CurrentInfo свойством, изменяется на объект, связанный с текущим языком и региональными параметрами.When this happens, the NumberFormatInfo object returned by the CurrentInfo property changes to an object associated with the current culture.

  • Предпочтения пользователя.User preferences. Пользователи приложения могут переопределить некоторые значения, связанные с текущей культурой системы, с помощью параметров язык и региональные параметры панели управления.Users of your application might override some of the values associated with the current system culture through the region and language options in Control Panel. Например, пользователи могут выбрать другой символ валюты или другой символ десятичного разделителя.For example, users might choose a different currency symbol or a different decimal separator symbol. Если свойство имеет true значение (по умолчанию) NumberFormatInfo , свойства объекта также извлекаются из параметров пользователя. CultureInfo.UseUserOverrideIf the CultureInfo.UseUserOverride property is set to true (its default value), the properties of the NumberFormatInfo object are also retrieved from the user settings.

Начиная с .NET Framework 2,0, все свойства NumberFormatInfo объекта, допускающие переопределяемые пользователем объекты, инициализируются при создании объекта.Starting with the .NET Framework 2.0, all user-overridable properties of a NumberFormatInfo object are initialized when the object is created. Существует вероятность несогласованности, так как ни создание объекта, ни процесс переопределения пользователем не являются атомарными, и при создании объекта соответствующие значения могут измениться.There is still a possibility of inconsistency, because neither object creation nor the user override process is atomic, and the relevant values may change during object creation. Однако эти несоответствия должны быть чрезвычайно редкими.However, these inconsistencies should be extremely rare.

Вы можете управлять тем, отображаются ли пользовательские переопределения NumberFormatInfo в объектах, представляющих ту же культуру, что и язык и региональные параметры текущего потока.You can control whether user overrides are reflected in NumberFormatInfo objects that represent the same culture as the current thread culture. В следующей таблице перечислены способы NumberFormatInfo извлечения объекта и указано, отражают ли результирующий объект переопределения пользователя.The following table lists the ways in which a NumberFormatInfo object can be retrieved and indicates whether the resulting object reflects user overrides.

Источник объекта CultureInfo и NumberFormatInfoSource of CultureInfo and NumberFormatInfo object Отражает переопределения, переопределяемые пользователемReflects user overrides
СвойствоCultureInfo.CurrentCulture.NumberFormatCultureInfo.CurrentCulture.NumberFormat property ДаYes
СвойствоNumberFormatInfo.CurrentInfoNumberFormatInfo.CurrentInfo property ДаYes
Метод CultureInfo.CreateSpecificCultureCultureInfo.CreateSpecificCulture method ДаYes
Метод CultureInfo.GetCultureInfoCultureInfo.GetCultureInfo method НетNo
Конструктор CultureInfo(String)CultureInfo(String) constructor ДаYes
Конструктор CultureInfo.CultureInfo(String, Boolean)CultureInfo.CultureInfo(String, Boolean) constructor Зависит от значения useUserOverride параметраDepends on value of useUserOverride parameter

Если нет убедительной причины для этого, следует учитывать переопределения пользователей при использовании NumberFormatInfo объекта в клиентских приложениях для форматирования и анализа вводимых пользователем данных или для вывода числовых данных.Unless there is a compelling reason to do otherwise, you should respect user overrides when you use the NumberFormatInfo object in client applications to format and parse user input or to display numeric data. Для серверных приложений или приложений без участия пользователя не следует учитывать переопределения.For server applications or unattended applications, you should not respect user overrides. Однако при использовании NumberFormatInfo объекта явно или неявно для сохранения числовых данных в строковом формате следует NumberFormatInfo использовать объект, отражающий соглашения о форматировании инвариантного языка и региональных параметров, или указать Строка настраиваемого числового формата, используемая независимо от языка и региональных параметров.However, if you are using the NumberFormatInfo object either explicitly or implicitly to persist numeric data in string form, you should either use a NumberFormatInfo object that reflects the formatting conventions of the invariant culture, or you should specify a custom numeric format string that you use regardless of culture.

Форматирование IFormatProvider, NumberFormatInfo и numericIFormatProvider, NumberFormatInfo, and numeric formatting

NumberFormatInfo Объект используется неявно или явно во всех операциях числового форматирования.A NumberFormatInfo object is used implicitly or explicitly in all numeric formatting operations. К ним относятся вызовы следующих методов:These include calls to the following methods:

Все операции форматирования чисел используют IFormatProvider реализацию.All numeric formatting operations make use of an IFormatProvider implementation. Интерфейс включает один метод, GetFormat(Type). IFormatProviderThe IFormatProvider interface includes a single method, GetFormat(Type). Это метод обратного вызова, которому передается Type объект, представляющий тип, необходимый для предоставления сведений о форматировании.This is a callback method that is passed a Type object that represents the type needed to provide formatting information. Метод отвечает за возврат либо экземпляра этого типа, либо null, если он не может предоставить экземпляр типа.The method is responsible for returning either an instance of that type or null, if it cannot provide an instance of the type. .NET Framework предоставляет две IFormatProvider реализации для форматирования чисел:The .NET Framework provides two IFormatProvider implementations for formatting numbers:

  • CultureInfo Класс, представляющий конкретный язык и региональные параметры (или конкретный язык в определенной стране или регионе).The CultureInfo class, which represents a specific culture (or a specific language in a specific country/region). В операции CultureInfo.GetFormat числового форматирования метод возвращает объект, NumberFormatInfo связанный со CultureInfo.NumberFormat свойством.In a numeric formatting operation, the CultureInfo.GetFormat method returns the NumberFormatInfo object associated with its CultureInfo.NumberFormat property.

  • NumberFormatInfo Класс, предоставляющий сведения о соглашениях о форматировании соответствующего языка и региональных параметров.The NumberFormatInfo class, which provides information about the formatting conventions of its associated culture. NumberFormatInfo.GetFormat Метод возвращает экземпляр самого себя.The NumberFormatInfo.GetFormat method returns an instance of itself.

Если реализация не предоставляется явно для метода форматирования CultureInfo , используется объект, возвращаемый CultureInfo.CurrentCulture свойством, представляющим язык и региональные параметры текущего потока. IFormatProviderIf an IFormatProvider implementation is not provided to a formatting method explicitly, a CultureInfo object returned by the CultureInfo.CurrentCulture property that represents the current thread culture is used.

В следующем примере показана связь между IFormatProvider интерфейсом NumberFormatInfo и классом в операциях форматирования путем определения пользовательской IFormatProvider реализации.The following example illustrates the relationship between the IFormatProvider interface and the NumberFormatInfo class in formatting operations by defining a custom IFormatProvider implementation. Его GetFormat метод отображает имя типа объекта, запрошенного операцией форматирования.Its GetFormat method displays the type name of the object requested by the formatting operation. Если интерфейс запрашивает NumberFormatInfo объект, этот метод NumberFormatInfo предоставляет объект для языка и региональных параметров текущего потока.If the interface is requesting a NumberFormatInfo object, this method provides the NumberFormatInfo object for the current thread culture. Как видно из выходных данных в примере, Decimal.ToString(IFormatProvider) метод NumberFormatInfo запрашивает объект для предоставления String.Format(IFormatProvider, String, Object[]) сведений о форматировании, в то время как NumberFormatInfo запросы DateTimeFormatInfo и объекты ICustomFormatter методов, а также реализации.As the output from the example shows, the Decimal.ToString(IFormatProvider) method requests a NumberFormatInfo object to provide formatting information, whereas the String.Format(IFormatProvider, String, Object[]) method requests NumberFormatInfo and DateTimeFormatInfo objects as well as an ICustomFormatter implementation.

using System;
using System.Globalization;

public class CurrentCultureFormatProvider : IFormatProvider
{
   public Object GetFormat(Type formatType) 
   {
      Console.WriteLine("Requesting an object of type {0}", 
                        formatType.Name);
      if (formatType == typeof(NumberFormatInfo))
         return NumberFormatInfo.CurrentInfo;
      else if (formatType == typeof(DateTimeFormatInfo))
         return DateTimeFormatInfo.CurrentInfo;
      else
         return null;
   }
}

public class Example
{
   public static void Main()
   {
      Decimal amount = 1203.541m;
      string value = amount.ToString("C2", new CurrentCultureFormatProvider());
      Console.WriteLine(value);
      Console.WriteLine();
      string composite = String.Format(new CurrentCultureFormatProvider(), 
                                       "Date: {0}   Amount: {1}   Description: {2}",
                                       DateTime.Now, 1264.03m, "Service Charge");
      Console.WriteLine(composite);
      Console.WriteLine();
   }
}
// The example displays output like the following:
//    Requesting an object of type NumberFormatInfo
//    $1,203.54
//    
//    Requesting an object of type ICustomFormatter
//    Requesting an object of type DateTimeFormatInfo
//    Requesting an object of type NumberFormatInfo
//    Date: 11/15/2012 2:00:01 PM   Amount: 1264.03   Description: Service Charge
Imports System.Globalization

Public Class CurrentCultureFormatProvider : Implements IFormatProvider
   Public Function GetFormat(formatType As Type) As Object _
                   Implements IFormatProvider.GetFormat
      Console.WriteLine("Requesting an object of type {0}", 
                        formatType.Name)
      If formatType Is GetType(NumberFormatInfo) Then
         Return NumberFormatInfo.CurrentInfo
      Else If formatType Is GetType(DateTimeFormatInfo) Then
         Return DateTimeFormatInfo.CurrentInfo
      Else
         Return Nothing
      End If
   End Function
End Class

Module Example
   Public Sub Main()
      Dim amount As Decimal = 1203.541d
      Dim value As String = amount.ToString("C2", New CurrentCultureFormatProvider())
      Console.WriteLine(value)
      Console.WriteLine()
      Dim composite As String = String.Format(New CurrentCultureFormatProvider, 
                                              "Date: {0}   Amount: {1}   Description: {2}",
                                              Date.Now, 1264.03d, "Service Charge")
      Console.WriteLine(composite)
      Console.WriteLine()
   End Sub
End Module
' The example displays output like the following:
'    Requesting an object of type NumberFormatInfo
'    $1,203.54
'    
'    Requesting an object of type ICustomFormatter
'    Requesting an object of type DateTimeFormatInfo
'    Requesting an object of type NumberFormatInfo
'    Date: 11/15/2012 2:00:01 PM   Amount: 1264.03   Description: Service Charge

Если реализация явно не предоставляется в вызове метода форматирования чисел, метод CultureInfo.CurrentCulture.GetFormat вызывает NumberFormatInfo метод, который возвращает объект, соответствующий культуре текущего потока. IFormatProviderIf an IFormatProvider implementation is not explicitly provided in a numeric formatting method call, the method calls the CultureInfo.CurrentCulture.GetFormat method, which returns the NumberFormatInfo object that corresponds to the current thread culture.

Форматирование строк и свойств NumberFormatInfoFormat strings and NumberFormatInfo properties

Каждая операция форматирования использует стандартную или настраиваемую строку числового формата для получения результирующей строки из числа.Every formatting operation uses either a standard or a custom numeric format string to produce a result string from a number. В некоторых случаях использование строки форматирования для создания результирующей строки является явной, как показано в следующем примере.In some cases, the use of a format string to produce a result string is explicit, as in the following example. Этот код вызывает Decimal.ToString(IFormatProvider) метод для Decimal преобразования значения в число различных строковых представлений с помощью соглашений о форматировании языка и региональных параметров en-US.This code calls the Decimal.ToString(IFormatProvider) method to convert a Decimal value to a number of different string representations by using the formatting conventions of the en-US culture.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] formatStrings = { "C2", "E1", "F", "G3", "N", 
                                 "#,##0.000", "0,000,000,000.0##" };
      CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
      Decimal[] values = { 1345.6538m, 1921651.16m };
      
      foreach (var value in values) {
         foreach (var formatString in formatStrings) {
            string resultString = value.ToString(formatString, culture);
            Console.WriteLine("{0,-18} -->  {1}", formatString, resultString);
         }
         Console.WriteLine();      
      }   
   }
}
// The example displays the following output:
//       C2                 -->  $1,345.65
//       E1                 -->  1.3E+003
//       F                  -->  1345.65
//       G3                 -->  1.35E+03
//       N                  -->  1,345.65
//       #,##0.000          -->  1,345.654
//       0,000,000,000.0##  -->  0,000,001,345.654
//       
//       C2                 -->  $1,921,651.16
//       E1                 -->  1.9E+006
//       F                  -->  1921651.16
//       G3                 -->  1.92E+06
//       N                  -->  1,921,651.16
//       #,##0.000          -->  1,921,651.160
//       0,000,000,000.0##  -->  0,001,921,651.16
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim formatStrings() As String = { "C2", "E1", "F", "G3", "N", 
                                        "#,##0.000", "0,000,000,000.0##" }
      Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim values() As Decimal = { 1345.6538d, 1921651.16d }
      
      For Each value In values
         For Each formatString In formatStrings
            Dim resultString As String = value.ToString(formatString, culture)
            Console.WriteLine("{0,-18} -->  {1}", formatString, resultString)
         Next
         Console.WriteLine()      
      Next   
   End Sub
End Module
' The example displays the following output:
'       C2                 -->  $1,345.65
'       E1                 -->  1.3E+003
'       F                  -->  1345.65
'       G3                 -->  1.35E+03
'       N                  -->  1,345.65
'       #,##0.000          -->  1,345.654
'       0,000,000,000.0##  -->  0,000,001,345.654
'       
'       C2                 -->  $1,921,651.16
'       E1                 -->  1.9E+006
'       F                  -->  1921651.16
'       G3                 -->  1.92E+06
'       N                  -->  1,921,651.16
'       #,##0.000          -->  1,921,651.160
'       0,000,000,000.0##  -->  0,001,921,651.16

В других случаях использование строки формата является неявным.In other cases, the use of a format string is implicit. Например, в следующем методе вызовы Decimal.ToString() метода, используемого по умолчанию или без параметров, значение Decimal экземпляра форматируется с помощью описателя общего формата ("G") и правил текущего языка и региональных параметров, которые в данном случае являются Культура en-US.For example, in the following method calls to the default or parameterless Decimal.ToString() method, the value of the Decimal instance is formatted by using the general ("G") format specifier and the conventions of the current culture, which in this case is the en-US culture.

using System;

public class Example
{
   public static void Main()
   {
      Decimal[] values = { 1345.6538m, 1921651.16m };
      
      foreach (var value in values) {
         string resultString = value.ToString();
         Console.WriteLine(resultString);
         Console.WriteLine();      
      }   
   }
}
// The example displays the following output:
//       1345.6538
//       
//       1921651.16
Module Example
   Public Sub Main()
      Dim values() As Decimal = { 1345.6538d, 1921651.16d }
      
      For Each value In values
         Dim resultString As String = value.ToString()
         Console.WriteLine(resultString)
         Console.WriteLine()      
      Next   
   End Sub
End Module
' The example displays the following output:
'       1345.6538
'       
'       1921651.16

Каждая строка стандартного числового формата использует одно или NumberFormatInfo несколько свойств для определения шаблона или символов, используемых в результирующей строке.Each standard numeric format string uses one or more NumberFormatInfo properties to determine the pattern or the symbols used in the result string. Аналогичным образом, каждый описатель настраиваемого числового формата, за исключением "0" и "#", вставляет символы в NumberFormatInfo результирующую строку, определяемую свойствами.Similarly, each custom numeric format specifier except "0" and "#" insert symbols in the result string that are defined by NumberFormatInfo properties. В следующей таблице перечислены описатели стандартных и пользовательских числовых форматов, а также связанные NumberFormatInfo с ними свойства.The following table lists the standard and custom numeric format specifiers and their associated NumberFormatInfo properties. Чтобы изменить внешний вид результирующей строки для конкретного языка и региональных параметров, см. раздел изменение свойств NumberFormatInfo .To change the appearance of the result string for a particular culture, see the Modifying NumberFormatInfo properties section. Дополнительные сведения об использовании этих описателей формата см. в разделе строки стандартных числовых форматов и строки настраиваемых числовых форматов.For details about the use of these format specifiers, see Standard Numeric Format Strings and Custom Numeric Format Strings.

Описатель форматаFormat specifier Связанные свойстваAssociated properties
"C" или "c" (описатель формата валюты)"C" or "c" (currency format specifier) CurrencyDecimalDigits, чтобы определить количество цифр дробной части по умолчанию.CurrencyDecimalDigits, to define the default number of fractional digits.

CurrencyDecimalSeparator, для определения символа десятичного разделителя.CurrencyDecimalSeparator, to define the decimal separator symbol.

CurrencyGroupSeparator, чтобы определить группу или разделитель групп разрядов.CurrencyGroupSeparator, to define the group or thousands separator.

CurrencyGroupSizes, чтобы определить размеры групп целой группы.CurrencyGroupSizes, to define the sizes of integral groups.

CurrencyNegativePattern, чтобы определить шаблон с отрицательными денежными значениями.CurrencyNegativePattern, to define the pattern of negative currency values.

CurrencyPositivePattern, чтобы определить шаблон положительных денежных значений.CurrencyPositivePattern, to define the pattern of positive currency values.

CurrencySymbol, чтобы определить символ валюты.CurrencySymbol, to define the currency symbol.

NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.
"D" или "d" (Описатель десятичного формата)"D" or "d" (decimal format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.
"E" или "e" (Описатель экспоненциального или экспоненциального формата)"E" or "e" (exponential or scientific format specifier) NegativeSign, чтобы определить символ отрицательного знака в мантиссае и экспоненте.NegativeSign, to define the negative sign symbol in the mantissa and exponent.

NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.

PositiveSign, чтобы определить символ знака плюс в экспоненте.PositiveSign, to define the positive sign symbol in the exponent.
"F" или "f" (описатель формата с фиксированной запятой)"F" or "f" (fixed-point format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.

NumberDecimalDigits, чтобы определить количество цифр дробной части по умолчанию.NumberDecimalDigits, to define the default number of fractional digits.

NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.
"G" или "g" (Общий описатель формата)"G" or "g" (general format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.

NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.

PositiveSign, чтобы определить символ знака плюс для строк результатов в экспоненциальном формате.PositiveSign, to define the positive sign symbol for result strings in exponential format.
"N" или "n" (описатель числового формата)"N" or "n" (number format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.

NumberDecimalDigits, чтобы определить количество цифр дробной части по умолчанию.NumberDecimalDigits, to define the default number of fractional digits.

NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.

NumberGroupSeparator, чтобы определить символ разделителя групп (тысяч).NumberGroupSeparator, to define the group separator (thousands) symbol.

NumberGroupSizes, чтобы определить количество целочисленных цифр в группе.NumberGroupSizes, to define the number of integral digits in a group.

NumberNegativePattern, чтобы определить формат отрицательных значений.NumberNegativePattern, to define the format of negative values.
"P" или "p" (описатель формата процентов)"P" or "p" (percent format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.

PercentDecimalDigits, чтобы определить количество цифр дробной части по умолчанию.PercentDecimalDigits, to define the default number of fractional digits.

PercentDecimalSeparator, для определения символа десятичного разделителя.PercentDecimalSeparator, to define the decimal separator symbol.

PercentGroupSeparator, чтобы определить символ разделителя групп.PercentGroupSeparator, to define the group separator symbol.

PercentGroupSizes, чтобы определить количество целочисленных цифр в группе.PercentGroupSizes, to define the number of integral digits in a group.

PercentNegativePattern, чтобы определить размещение символа процента и отрицательного символа для отрицательных значений.PercentNegativePattern, to define the placement of the percent symbol and the negative symbol for negative values.

PercentPositivePattern, чтобы определить размещение символа процента для положительных значений.PercentPositivePattern, to define the placement of the percent symbol for positive values.

PercentSymbol, чтобы определить символ процента.PercentSymbol, to define the percent symbol.
"R" или "r" (описатель формата приема-передачи)"R" or "r" (round-trip format specifier) NegativeSign, для определения знака минус.NegativeSign, to define the negative sign symbol.

NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.

PositiveSign, чтобы определить символ знака плюс в экспоненте.PositiveSign, to define the positive sign symbol in an exponent.
"X" или "x" (Описатель шестнадцатеричного формата)"X" or "x" (hexadecimal format specifier) Отсутствует.None.
"." (описатель настраиваемого формата десятичной запятой)"." (decimal point custom format specifier) NumberDecimalSeparator, для определения символа десятичного разделителя.NumberDecimalSeparator, to define the decimal separator symbol.
"," (настраиваемый описатель формата разделителя групп)"," (group separator custom format specifier) NumberGroupSeparator, чтобы определить символ разделителя группы (тысяч).NumberGroupSeparator, to define the group (thousands) separator symbol.
"%" (описатель настраиваемого формата заполнителя в процентах)"%" (percentage placeholder custom format specifier) PercentSymbol, чтобы определить символ процента.PercentSymbol, to define the percent symbol.
"‰" (для каждого описателя настраиваемого формата заполнитель промилле)"‰" (per mille placeholder custom format specifier) PerMilleSymbol, чтобы определить символ на промилле.PerMilleSymbol, to define the per mille symbol.
"E" (описатель настраиваемого формата нотации)"E" (exponential notation custom format specifier) NegativeSign, чтобы определить символ отрицательного знака в мантиссае и экспоненте.NegativeSign, to define the negative sign symbol in the mantissa and exponent.

PositiveSign, чтобы определить символ знака плюс в экспоненте.PositiveSign, to define the positive sign symbol in the exponent.

Обратите внимание NumberFormatInfo , что класс NativeDigits включает свойство, которое указывает базовые 10 цифр, используемых конкретным языком и региональными параметрами.Note that the NumberFormatInfo class includes a NativeDigits property that specifies the base 10 digits used by a specific culture. Однако это свойство не используется в операциях форматирования. в результирующей строке используются только базовые латинские цифры от 0 (U + 0030) до 9 (U + 0039).However, the property is not used in formatting operations; only the Basic Latin digits 0 (U+0030) through 9 (U+0039) are used in the result string. Кроме того, для Single NaN PositiveInfinitySymbol NegativeInfinitySymbol NaNSymbolзначений Double и,и,результирующаястрокасостоитисключительноизсимволов,определенныхсвойствами,и.PositiveInfinity NegativeInfinity содержани.In addition, for Single and Double values of NaN, PositiveInfinity, and NegativeInfinity, the result string consists exclusively of the symbols defined by the NaNSymbol, PositiveInfinitySymbol, and NegativeInfinitySymbol properties, respectively.

Изменение свойств NumberFormatInfoModifying NumberFormatInfo properties

Можно изменить свойства NumberFormatInfo объекта, чтобы настроить результирующую строку, полученную при выполнении операции форматирования чисел.You can modify the properties of a NumberFormatInfo object to customize the result string produced in a numeric formatting operation. Для этого выполните следующие действия.To do this:

  1. Создайте копию NumberFormatInfo объекта, предназначенного для чтения и записи, соглашения о форматировании которого необходимо изменить.Create a read/write copy of a NumberFormatInfo object whose formatting conventions you want to modify. Дополнительные сведения см. в разделе Создание экземпляра объекта NumberFormatInfo .For more information, see the Instantiating a NumberFormatInfo object section.

  2. Измените свойство или свойства, которые используются для получения требуемой результирующей строки.Modify the property or properties that are used to produce the desired result string. Сведения о том, как методы форматирования NumberFormatInfo используют свойства для определения результирующих строк, см. в разделе Формат строк и свойства NumberFormatInfo .For information about how formatting methods use NumberFormatInfo properties to define result strings, see the Format strings and NumberFormatInfo properties section.

  3. Используйте пользовательский NumberFormatInfo объект в IFormatProvider качестве аргумента в вызовах методов форматирования.Use the custom NumberFormatInfo object as the IFormatProvider argument in calls to formatting methods.

Примечание

Вместо динамического изменения значений свойств языка и региональных параметров при каждом запуске приложения можно использовать CultureAndRegionInfoBuilder класс для определения пользовательского языка и региональных параметров (язык и региональные параметры с уникальным именем, дополняющие существующие языки и т. д.) или замены. Культура (используемая вместо конкретного языка и региональных параметров).Instead of dynamically modifying a culture's property values each time an application is started, you can use the CultureAndRegionInfoBuilder class to define either a custom culture (a culture that has a unique name and that supplements existing cultures) or a replacement culture (one that is used instead of a specific culture).

В следующих разделах приводятся некоторые примеры.The following sections provide some examples.

Изменение символа валюты и шаблонаModifying the currency symbol and pattern

В следующем примере изменяется NumberFormatInfo объект, представляющий соглашения о форматировании для языка и региональных параметров en-US.The following example modifies a NumberFormatInfo object that represents the formatting conventions of the en-US culture. Он присваивает CurrencySymbol свойству символ валюты ISO-4217 и определяет шаблон для денежных значений, состоящий из символа валюты, за которым следует пробел и числовое значение.It assigns the ISO-4217 currency symbol to the CurrencySymbol property and defines a pattern for currency values that consists of the currency symbol followed by a space and a numeric value.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Retrieve a writable NumberFormatInfo object.
      CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
      NumberFormatInfo nfi = enUS.NumberFormat;

      // Use the ISO currency symbol instead of the native currency symbol.
      nfi.CurrencySymbol =  (new RegionInfo(enUS.Name)).ISOCurrencySymbol;
      // Change the positive currency pattern to <code><space><value>.
      nfi.CurrencyPositivePattern = 2;
      // Change the negative currency pattern to <code><space><sign><value>.     
      nfi.CurrencyNegativePattern = 12;
      
      // Produce the result strings by calling ToString.
      Decimal[] values = { 1065.23m, 19.89m, -.03m, -175902.32m };
      foreach (var value in values)
         Console.WriteLine(value.ToString("C", enUS));

      Console.WriteLine();
      
      // Produce the result strings by calling a composite formatting method.
      foreach (var value in values)
         Console.WriteLine(String.Format(enUS, "{0:C}", value));      
   }
}
// The example displays the following output:
//       USD 1,065.23
//       USD 19.89
//       USD -0.03
//       USD -175,902.32
//       
//       USD 1,065.23
//       USD 19.89
//       USD -0.03
//       USD -175,902.32
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Retrieve a writable NumberFormatInfo object.
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim nfi As NumberFormatInfo = enUS.NumberFormat

      ' Use the ISO currency symbol instead of the native currency symbol.
      nfi.CurrencySymbol =  (New RegionInfo(enUS.Name)).ISOCurrencySymbol
      ' Change the positive currency pattern to <code><space><value>.
      nfi.CurrencyPositivePattern = 2
      ' Change the negative currency pattern to <code><space><sign><value>.     
      nfi.CurrencyNegativePattern = 12
      
      ' Produce the result strings by calling ToString.
      Dim values() As Decimal = { 1065.23d, 19.89d, -.03d, -175902.32d }
      For Each value In values
         Console.WriteLine(value.ToString("C", enUS))
      Next      
      Console.WriteLine()
      
      ' Produce the result strings by calling a composite formatting method.
      For Each value In values
         Console.WriteLine(String.Format(enUS, "{0:C}", value))      
      Next
   End Sub
End Module
' The example displays the following output:
'       USD 1,065.23
'       USD 19.89
'       USD -0.03
'       USD -175,902.32
'       
'       USD 1,065.23
'       USD 19.89
'       USD -0.03
'       USD -175,902.32

Форматирование национального идентификационного номераFormatting a national identification number

Многие местные идентификационные номера состоят исключительно из цифр, поэтому их можно легко отформатировать, изменив NumberFormatInfo свойства объекта.Many national identification numbers consist exclusively of digits and so can easily be formatted by modifying the properties of a NumberFormatInfo object. Например, номер социального страхования в США состоит из 9 цифр, упорядоченных следующим образом: XXX-XX-XXXX.For example, a social security number in the United States consists of 9 digits arranged as follows: XXX-XX-XXXX. В следующем примере предполагается, что номера социального страхования хранятся в виде целочисленных значений и соответствующим образом форматируются.The following example assumes that social security numbers are stored as integer values and formats them appropriately.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Instantiate a read-only NumberFormatInfo object.
      CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
      NumberFormatInfo nfi = enUS.NumberFormat;

      // Modify the relevant properties.
      nfi.NumberGroupSeparator = "-";
      nfi.NumberGroupSizes = new int[] { 3, 2, 4};
      nfi.NumberDecimalDigits = 0;
      
      int[] ids = { 111223333, 999776666 };
      
      // Produce the result string by calling ToString.
      foreach (var id in ids)
         Console.WriteLine(id.ToString("N", enUS));

      Console.WriteLine();
      
      // Produce the result string using composite formatting.
      foreach (var id in ids)
         Console.WriteLine(String.Format(enUS, "{0:N}", id));
   }
}
// The example displays the following output:
//       1112-23-333
//       9997-76-666
//       
//       1112-23-333
//       9997-76-666
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Instantiate a read-only NumberFormatInfo object.
      Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
      Dim nfi As NumberFormatInfo = enUS.NumberFormat

      ' Modify the relevant properties.
      nfi.NumberGroupSeparator = "-"
      nfi.NumberGroupSizes = { 3, 2, 4}
      nfi.NumberDecimalDigits = 0
      
      Dim ids() As Integer = { 111223333, 999776666 }
      
      ' Produce the result string by calling ToString.
      For Each id In ids
         Console.WriteLine(id.ToString("N", enUS))
      Next 
      Console.WriteLine()
      
      ' Produce the result string using composite formatting.
      For Each id In ids
         Console.WriteLine(String.Format(enUS, "{0:N}", id))
      Next
   End Sub
End Module
' The example displays the following output:
'       1112-23-333
'       9997-76-666
'       
'       1112-23-333
'       9997-76-666

Анализ числовых строкParsing numeric strings

Анализ предполагает преобразование строкового представления числа в число.Parsing involves converting the string representation of a number to a number. Каждый числовой тип в .NET Framework включает два перегруженных метода анализа: Parse и. TryParseEach numeric type in the .NET Framework includes two overloaded parsing methods: Parse and TryParse. Parse Метод преобразует строку в число и создает исключение, если преобразование завершается неудачей.The Parse method converts a string to a number and throws an exception if the conversion fails. Метод преобразует строку в число, присваивает число out Boolean аргументу и возвращает значение, указывающее, было ли преобразование выполнено. TryParseThe TryParse method converts a string to a number, assigns the number to an out argument, and returns a Boolean value that indicates whether the conversion succeeded.

Методы синтаксического анализа неявно или явно используют NumberStyles значение перечисления для определения того, какие элементы стиля (такие как разделители групп, десятичный разделитель или символ валюты) могут присутствовать в строке, если операция синтаксического анализа завершена.The parsing methods implicitly or explicitly use a NumberStyles enumeration value to determine what style elements (such as group separators, a decimal separator, or a currency symbol) can be present in a string if the parsing operation is to succeed. Если значение не указано в вызове метода, по умолчанию NumberStyles используется значение, которое включает Float флаги и AllowThousands , указывающие, что анализируемая строка может включать символы группы, десятичный разделитель, знак минуса, NumberStyles и пробелов или могут представлять собой строковое представление числа в экспоненциальной нотации.If a NumberStyles value is not provided in the method call, the default is a NumberStyles value that includes the Float and AllowThousands flags, which specifies that the parsed string can include group symbols, a decimal separator, a negative sign, and white-space characters, or it can be the string representation of a number in exponential notation.

Методы анализа также неявно или явно используют NumberFormatInfo объект, который определяет конкретные символы и шаблоны, которые могут возникать в анализируемой строке.The parsing methods also implicitly or explicitly use a NumberFormatInfo object that defines the specific symbols and patterns that can occur in the string to be parsed. Если объект не предоставлен, по умолчанию NumberFormatInfo используется язык и региональные параметры текущего потока. NumberFormatInfoIf a NumberFormatInfo object is not provided, the default is the NumberFormatInfo for the current thread culture. Дополнительные сведения об анализе см. в описании отдельных методов синтаксического анализа, таких Int16.Parse(String)как Int32.Parse(String, NumberStyles) Int64.Parse(String, IFormatProvider),, Decimal.Parse(String, NumberStyles, IFormatProvider), Double.TryParse(String, Double), и BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger).For more information about parsing, see the individual parsing methods, such as Int16.Parse(String), Int32.Parse(String, NumberStyles), Int64.Parse(String, IFormatProvider), Decimal.Parse(String, NumberStyles, IFormatProvider), Double.TryParse(String, Double), and BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger).

В следующем примере показана структура строк синтаксического анализа с учетом языка и региональных параметров.The following example illustrates the culture-sensitive nature of parsing strings. Он пытается проанализировать строку, включающую разделители тысяч, с помощью соглашений из EN-US, fr-FR и инвариантных языков и региональных параметров.It tries to parse a string that include thousands separators by using the conventions of the en-US, fr-FR, and invariant cultures. Строка, включающая запятую в качестве разделителя групп и точку в виде десятичного разделителя, не проходит синтаксический анализ в культуре fr-FR, а строка с пробелами в качестве разделителя групп и запятая в качестве десятичного разделителя не проходит синтаксический анализ в EN-US и инвариантные языки и региональные параметры.A string that includes the comma as a group separator and the period as a decimal separator fails to parse in the fr-FR culture, and a string with white space as a group separator and a comma as a decimal separator fails to parse in the en-US and invariant cultures.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      String[] values = { "1,034,562.91", "9 532 978,07" };
      String[] cultureNames = { "en-US", "fr-FR", "" };
      
      foreach (var value in values) {
         foreach (var cultureName in cultureNames) {
            CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
            String name = culture.Name == "" ? "Invariant" : culture.Name;
            try {
               Decimal amount = Decimal.Parse(value, culture);
               Console.WriteLine("'{0}' --> {1} ({2})", value, amount, name);
            }
            catch (FormatException) {
               Console.WriteLine("'{0}': FormatException ({1})",
                                 value, name);
            }   
         }
         Console.WriteLine();
      }
   }
}
// The example displays the following output:
//       '1,034,562.91' --> 1034562.91 (en-US)
//       '1,034,562.91': FormatException (fr-FR)
//       '1,034,562.91' --> 1034562.91 (Invariant)
//       
//       '9 532 978,07': FormatException (en-US)
//       '9 532 978,07' --> 9532978.07 (fr-FR)
//       '9 532 978,07': FormatException (Invariant)
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim values() As String = { "1,034,562.91", "9 532 978,07" }
      Dim cultureNames() As String = { "en-US", "fr-FR", "" }
      
      For Each value In values
         For Each cultureName In cultureNames
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Dim name As String = If(culture.Name = "", "Invariant", culture.Name)
            Try
               Dim amount As Decimal = Decimal.Parse(value, culture)
               Console.WriteLine("'{0}' --> {1} ({2})", value, amount, name)
            Catch e As FormatException
               Console.WriteLine("'{0}': FormatException ({1})",
                                 value, name)
            End Try   
         Next
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'       '1,034,562.91' --> 1034562.91 (en-US)
'       '1,034,562.91': FormatException (fr-FR)
'       '1,034,562.91' --> 1034562.91 (Invariant)
'       
'       '9 532 978,07': FormatException (en-US)
'       '9 532 978,07' --> 9532978.07 (fr-FR)
'       '9 532 978,07': FormatException (Invariant)

Синтаксический анализ обычно происходит в двух контекстах:Parsing generally occurs in two contexts:

  • В качестве операции, предназначенной для преобразования вводимых пользователем данных в числовое значение.As an operation that is designed to convert user input into a numeric value.

  • В качестве операции, предназначенной для обработки числовых значений в цикле, то есть для десериализации числового значения, которое ранее было сериализовано в виде строки.As an operation that is designed to round-trip a numeric value; that is, to deserialize a numeric value that was previously serialized as a string.

В следующих разделах эти две операции рассматриваются более подробно.The following sections discuss these two operations in greater detail.

Анализ пользовательских строкParsing user strings

При синтаксическом анализе числовых строк, вводимых пользователем, всегда следует создавать экземпляр NumberFormatInfo объекта, отражающий региональные параметры пользователя.When you are parsing numeric strings input by the user, you should always instantiate a NumberFormatInfo object that reflects the user's cultural settings. Сведения о том, как создать экземпляр NumberFormatInfo объекта, отражающего пользовательские настройки, см. в разделе NumberFormatInfo и Dynamic Data .For information about how to instantiate a NumberFormatInfo object that reflects user customizations, see the NumberFormatInfo and dynamic data section.

В следующем примере показана разница между операцией синтаксического анализа, которая отражает региональные параметры пользователя, а другая — нет.The following example illustrates the difference between a parsing operation that reflects user cultural settings and one that does not. В этом случае языком по умолчанию является en-US, но пользователь определил "," как десятичный символ и "." в качестве разделителя групп в панели управления, области и языке.In this case, the default system culture is en-US, but the user has defined "," as the decimal symbol and "." as the group separator in Control Panel, Region and Language. Обычно эти символы реверсируются в культуре en-US по умолчанию.Ordinarily, these symbols are reversed in the default en-US culture. Когда пользователь вводит строку, отражающую пользовательские параметры, и строка анализируется NumberFormatInfo объектом, который также отражает пользовательские параметры (переопределения), операция анализа возвращает правильный результат.When the user enters a string that reflects user settings, and the string is parsed by a NumberFormatInfo object that also reflects user settings (overrides), the parsing operation returns a correct result. Однако если строка анализируется NumberFormatInfo объектом, который отражает стандартные региональные параметры en-US, он выдает символ запятой для разделителя групп и возвращает неверный результат.However, when the string is parsed by a NumberFormatInfo object that reflects standard en-US cultural settings, it mistakes the comma symbol for a group separator and returns an incorrect result.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo stdCulture = CultureInfo.GetCultureInfo("en-US");
      CultureInfo custCulture = CultureInfo.CreateSpecificCulture("en-US"); 
            
      String value = "310,16";
      try {
         Console.WriteLine("{0} culture reflects user overrides: {1}", 
                           stdCulture.Name, stdCulture.UseUserOverride);
         Decimal amount = Decimal.Parse(value, stdCulture);
         Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));                                                                                        
      }
      catch (FormatException) {
         Console.WriteLine("Unable to parse '{0}'", value);
      }    
      Console.WriteLine();
                                            
      try {
         Console.WriteLine("{0} culture reflects user overrides: {1}", 
                           custCulture.Name, custCulture.UseUserOverride);
         Decimal amount = Decimal.Parse(value, custCulture);
         Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));                                                                                        
      }
      catch (FormatException) {
         Console.WriteLine("Unable to parse '{0}'", value);
      }   
   }
}
// The example displays the following output:
//       en-US culture reflects user overrides: False
//       '310,16' --> 31016
//       
//       en-US culture reflects user overrides: True
//       '310,16' --> 310.16
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim stdCulture As CultureInfo = CultureInfo.GetCultureInfo("en-US")
      Dim custCulture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US") 
            
      Dim value As String = "310,16"
      Try
         Console.WriteLine("{0} culture reflects user overrides: {1}", 
                           stdCulture.Name, stdCulture.UseUserOverride)
         Dim amount As Decimal = Decimal.Parse(value, stdCulture)
         Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture))                                                                                        
      Catch e As FormatException
         Console.WriteLine("Unable to parse '{0}'", value)
      End Try   
      Console.WriteLine()
                                            
      Try
         Console.WriteLine("{0} culture reflects user overrides: {1}", 
                           custCulture.Name, custCulture.UseUserOverride)
         Dim amount As Decimal = Decimal.Parse(value, custCulture)
         Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture))                                                                                        
      Catch e As FormatException
         Console.WriteLine("Unable to parse '{0}'", value)
      End Try   
   End Sub
End Module
' The example displays the following output:
'       en-US culture reflects user overrides: False
'       '310,16' --> 31016
'       
'       en-US culture reflects user overrides: True
'       '310,16' --> 310.16

Сериализация и десериализация числовых данныхSerializing and deserializing numeric data

При сериализации числовых данных в строковом формате и последующем десериализации и синтаксического анализа строки должны формироваться и анализироваться с помощью соглашений инвариантного языка и региональных параметров.When numeric data is serialized in string format and later deserialized and parsed, the strings should be generated and parsed by using the conventions of the invariant culture. Операции форматирования и анализа никогда не должны отражать соглашения определенного языка и региональных параметров.The formatting and parsing operations should never reflect the conventions of a specific culture. Если используются параметры, зависящие от языка и региональных параметров, переносимость данных строго ограничена; его можно успешно десериализовать только в потоке, параметры языка и региональных параметров которых идентичны параметрам потока, в котором он был сериализован.If culture-specific settings are used, the portability of the data is strictly limited; it can be successfully deserialized only on a thread whose culture-specific settings are identical to those of the thread on which it was serialized. В некоторых случаях это означает, что данные нельзя даже успешно десериализовать в той же системе, в которой они были сериализованы.In some cases, this means that the data cannot even be successfully deserialized on the same system on which it was serialized.

В следующем примере показано, что может произойти при нарушении этого принципа.The following example illustrates what can happen when this principle is violated. Значения с плавающей запятой в массиве преобразуются в строки, если текущий поток использует параметры языка и региональных параметров en-US, зависящие от языка и региональных параметров.Floating-point values in an array are converted to strings when the current thread uses the culture-specific settings of the en-US culture. Затем данные анализируются потоком, который использует параметры языка и региональных параметров en-GB, зависящие от языка и региональных параметров.The data is then parsed by a thread that uses the culture-specific settings of the en-GB culture. В этом случае, несмотря на то, что каждая операция синтаксического анализа выполняется успешно, данные не проходят успешно и происходит повреждение данных.In this case, although each parsing operation succeeds, the data does not round-trip successfully and data corruption occurs. В других случаях операция синтаксического анализа может завершиться ошибкой, FormatException и может возникнуть исключение.In other cases, a parsing operation could fail and a FormatException exception could be thrown.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;

public class Example
{
   public static void Main()
   {
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
      PersistData();
      
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
      RestoreData();
   }

   private static void PersistData()
   {
      // Define an array of floating-point values.
      Double[] values = { 160325.972, 8631.16, 1.304e5, 98017554.385, 
                          8.5938287084321676e94 };
      Console.WriteLine("Original values: ");
      foreach (var value in values) 
         Console.WriteLine(value.ToString("R", CultureInfo.InvariantCulture));
         
      // Serialize an array of doubles to a file 
      StreamWriter sw = new StreamWriter(@".\NumericData.bin");
      for (int ctr = 0; ctr < values.Length; ctr++) {
         sw.Write(values[ctr].ToString("R"));
         if (ctr < values.Length - 1) sw.Write("|");
      }
      sw.Close();
      Console.WriteLine();
   }
   
   private static void RestoreData()
   {   
      // Deserialize the data
      StreamReader sr = new StreamReader(@".\NumericData.bin");
      String data = sr.ReadToEnd();
      sr.Close();
      
      String[] stringValues = data.Split('|');
      List<Double> newValueList = new List<Double>();
      
      foreach (var stringValue in stringValues) {
         try {
            newValueList.Add(Double.Parse(stringValue));
         }
         catch (FormatException) {
            newValueList.Add(Double.NaN);
         }   
      }                                   

      Console.WriteLine("Restored values:");
      foreach (var newValue in newValueList) 
         Console.WriteLine(newValue.ToString("R", NumberFormatInfo.InvariantInfo));
   }
}
// The example displays the following output:
//       Original values:
//       160325.972
//       8631.16
//       130400
//       98017554.385
//       8.5938287084321671E+94
//       
//       Restored values:
//       160325972
//       863116
//       130400
//       98017554385
//       8.5938287084321666E+110
Imports System.Collections.Generic
Imports System.Globalization
Imports System.IO
Imports System.Threading

Module Example
   Public Sub Main()
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
      PersistData()
      
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB")
      RestoreData()
   End Sub
   
   Private Sub PersistData()
      ' Define an array of floating-point values.
      Dim values() As Double = { 160325.972, 8631.16, 1.304e5, 98017554.385, 
                                 8.5938287084321676e94 }
      Console.WriteLine("Original values: ")
      For Each value In values
         Console.WriteLine(value.ToString("R", CultureInfo.InvariantCulture))
      Next
         
      ' Serialize an array of doubles to a file 
      Dim sw As New StreamWriter(".\NumericData.bin")
      For ctr As Integer = 0 To values.Length - 1
         sw.Write(values(ctr).ToString("R"))
         If ctr < values.Length - 1 Then sw.Write("|")
      Next
      sw.Close()
      Console.WriteLine()
   End Sub
   
   Private Sub RestoreData()   
      ' Deserialize the data
      Dim sr AS New StreamReader(".\NumericData.bin")
      Dim data As String = sr.ReadToEnd()
      sr.Close()
      
      Dim stringValues() As String = data.Split("|"c)
      Dim newValueList As New List(Of Double)
      
      For Each stringValue In stringValues
         Try
            newValueList.Add(Double.Parse(stringValue))
         Catch e As FormatException
            newValueList.Add(Double.NaN)
         End Try   
      Next                                   

      Console.WriteLine("Restored values:")
      For Each newValue In newValueList
         Console.WriteLine(newValue.ToString("R", NumberFormatInfo.InvariantInfo))
      Next
   End Sub
End Module
' The example displays the following output:
'       Original values:
'       160325.972
'       8631.16
'       130400
'       98017554.385
'       8.5938287084321671E+94
'       
'       Restored values:
'       160325972
'       863116
'       130400
'       98017554385
'       8.5938287084321666E+110

Конструкторы

NumberFormatInfo()

Инициализирует новый доступный для записи экземпляр класса NumberFormatInfo, не зависящий от языка и региональных параметров (инвариантный).Initializes a new writable instance of the NumberFormatInfo class that is culture-independent (invariant).

Свойства

CurrencyDecimalDigits

Возвращает или задает число десятичных разрядов, используемое в значениях денежных сумм.Gets or sets the number of decimal places to use in currency values.

CurrencyDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях денежных сумм.Gets or sets the string to use as the decimal separator in currency values.

CurrencyGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях денежных сумм.Gets or sets the string that separates groups of digits to the left of the decimal in currency values.

CurrencyGroupSizes

Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в значениях денежных сумм.Gets or sets the number of digits in each group to the left of the decimal in currency values.

CurrencyNegativePattern

Возвращает или задает шаблон формата для отрицательных значений денежных сумм.Gets or sets the format pattern for negative currency values.

CurrencyPositivePattern

Возвращает или задает шаблон формата для положительных значений денежных сумм.Gets or sets the format pattern for positive currency values.

CurrencySymbol

Возвращает или задает строку, используемую в качестве знака денежной единицы.Gets or sets the string to use as the currency symbol.

CurrentInfo

Возвращает доступный только для чтения объект NumberFormatInfo, форматирующий значения на основе текущего языка и региональных параметров.Gets a read-only NumberFormatInfo that formats values based on the current culture.

DigitSubstitution

Возвращает или задает значение, определяющее, каким образом а графическом интерфейсе пользователя должны отображаться фигуры цифр.Gets or sets a value that specifies how the graphical user interface displays the shape of a digit.

InvariantInfo

Возвращает объект NumberFormatInfo, доступный только для чтения, который не зависит от языка и региональных параметров (инвариантный).Gets a read-only NumberFormatInfo object that is culture-independent (invariant).

IsReadOnly

Возвращает значение, указывающее, является ли данный объект NumberFormatInfo доступным только для чтения.Gets a value that indicates whether this NumberFormatInfo object is read-only.

NaNSymbol

Возвращает или задает строку, представляющую значение IEEE NaN (не числовое).Gets or sets the string that represents the IEEE NaN (not a number) value.

NativeDigits

Возвращает или задает массив строк собственных цифр, эквивалентных арабским цифрам от 0 до 9.Gets or sets a string array of native digits equivalent to the Western digits 0 through 9.

NegativeInfinitySymbol

Возвращает или задает строку, представляющую минус бесконечность.Gets or sets the string that represents negative infinity.

NegativeSign

Возвращает или задает строку, указывающую, что соответствующее число является отрицательным.Gets or sets the string that denotes that the associated number is negative.

NumberDecimalDigits

Возвращает или задает число десятичных разрядов, используемое в числовых значениях.Gets or sets the number of decimal places to use in numeric values.

NumberDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в числовых значениях.Gets or sets the string to use as the decimal separator in numeric values.

NumberGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в числовых значениях.Gets or sets the string that separates groups of digits to the left of the decimal in numeric values.

NumberGroupSizes

Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в числовых значениях.Gets or sets the number of digits in each group to the left of the decimal in numeric values.

NumberNegativePattern

Возвращает или задает шаблон формата для отрицательных числовых значений.Gets or sets the format pattern for negative numeric values.

PercentDecimalDigits

Возвращает или задает количество десятичных разрядов, используемое в значениях процентов.Gets or sets the number of decimal places to use in percent values.

PercentDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях процентов.Gets or sets the string to use as the decimal separator in percent values.

PercentGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях процентов.Gets or sets the string that separates groups of digits to the left of the decimal in percent values.

PercentGroupSizes

Возвращает или задает количество цифр в каждой из групп разрядов целой части десятичной дроби в значениях процентов.Gets or sets the number of digits in each group to the left of the decimal in percent values.

PercentNegativePattern

Возвращает или задает шаблон формата для отрицательных значений процентов.Gets or sets the format pattern for negative percent values.

PercentPositivePattern

Возвращает или задает шаблон формата для положительных значений процентов.Gets or sets the format pattern for positive percent values.

PercentSymbol

Возвращает или задает строку, используемую в качестве знака процентов.Gets or sets the string to use as the percent symbol.

PerMilleSymbol

Возвращает или задает строку, используемую в качестве знака промилле.Gets or sets the string to use as the per mille symbol.

PositiveInfinitySymbol

Возвращает или задает строку, представляющую плюс бесконечность.Gets or sets the string that represents positive infinity.

PositiveSign

Возвращает или задает строку, указывающую, что соответствующее число является положительным.Gets or sets the string that denotes that the associated number is positive.

Методы

Clone()

Создает неполную копию объекта NumberFormatInfo.Creates a shallow copy of the NumberFormatInfo object.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetFormat(Type)

Возвращает объект указанного типа, предоставляющий службу форматирования чисел.Gets an object of the specified type that provides a number formatting service.

GetHashCode()

Служит в качестве хэш-функции по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetInstance(IFormatProvider)

Возвращает класс NumberFormatInfo, связанный с заданным IFormatProvider.Gets the NumberFormatInfo associated with the specified IFormatProvider.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
ReadOnly(NumberFormatInfo)

Возвращает программу-оболочку NumberFormatInfo, доступную только для чтения.Returns a read-only NumberFormatInfo wrapper.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

Применяется к

Дополнительно