NumberFormatInfo Класс

Определение

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

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

Примеры

В следующем примере показано, как получить NumberFormatInfo объект для соответствующего CultureInfo объекта и использовать полученный объект для запроса сведений о форматировании чисел для конкретного языка и региональных параметров.

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 содержит сведения, относящиеся к языку и региональным параметрам, которые используются при форматировании и анализе числовых значений. Эти сведения включают символ валюты, десятичный символ, разделитель групп и символы для положительных и отрицательных знаков.

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

Можно создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании текущего языка и региональных параметров, инвариантного языка и региональных параметров, определенного языка и региональных параметров или нейтрального языка и региональных параметров.

Создание экземпляра объекта NumberFormatInfo для текущего языка и региональных параметров

Вы можете создать экземпляр NumberFormatInfo объекта для текущего языка и региональных параметров любым из следующих способов. В каждом случае возвращенный NumberFormatInfo объект доступен только для чтения.

  • Извлекая объект, представляющий текущий язык и региональные CultureInfo параметры из CultureInfo.CurrentCulture свойства, и извлекая CultureInfo объект из его CultureInfo.NumberFormat свойства.

  • Извлекая объект, NumberFormatInfo возвращенный свойством static (Sharedв Visual Basic). CurrentInfo

  • Путем вызова GetInstance метода с CultureInfo объектом, представляющим текущий язык и региональные параметры.

В следующем примере используются три способа создания NumberFormatInfo объектов, представляющих соглашения о форматировании текущего языка и региональных параметров. Он также извлекает значение IsReadOnly свойства, чтобы проиллюстрировать, что каждый объект доступен только для чтения.

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 для записи, который представляет соглашения текущего языка и региональных параметров любым из следующих способов:

  • Извлекая объект любым из способов, показанных в предыдущем примере кода, и вызывая NumberFormatInfo Clone метод для возвращаемого NumberFormatInfo объекта. При этом создается копия исходного NumberFormatInfo объекта, за исключением того, что его IsReadOnly свойство равно false.

  • Вызывая CultureInfo.CreateSpecificCulture метод для создания CultureInfo объекта, представляющего текущий язык и региональные параметры, а затем используя его CultureInfo.NumberFormat свойство для получения NumberFormatInfo объекта.

В следующем примере показаны два способа создания экземпляра NumberFormatInfo объекта и отображение значения его IsReadOnly свойства для иллюстрации того, что объект не доступен только для чтения.

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 значения свойств, используемые в числовых операциях форматирования и синтаксического анализа с помощью элемента Region и Language в панель управления. Например, пользователь с языком и региональными параметрами (США) может отображать денежные значения как 1,1 ДОЛЛ. США вместо значения по умолчанию 1,1 долл. США. Объекты NumberFormatInfo , полученные ранее, отражают переопределения этих пользователей. Если это нежелательно, можно создать NumberFormatInfo объект, который не отражает переопределения пользователей (а также чтение и запись, а не только для чтения), вызвав CultureInfo.CultureInfo(String, Boolean) конструктор и указав значение false аргумента useUserOverride . В следующем примере показана иллюстрация для системы с текущим языком и региональными параметрами (США) и символом валюты которого по умолчанию было изменено значение $на 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: $

CultureInfo.UseUserOverride Если свойству присвоено значение true, свойства CultureInfo.DateTimeFormatCultureInfo.NumberFormat, а CultureInfo.TextInfo также извлекаются из параметров пользователя. Если параметры пользователя несовместимы с языком и региональными параметрами, связанными с CultureInfo объектом (например, если выбранный календарь не является одним из календарей, перечисленных свойством OptionalCalendars ), результаты методов и значения свойств не определены.

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

Инвариантная культура представляет язык и региональные параметры, не зависящие от языка и региональных параметров. Он основан на английском языке, но не на какой-либо конкретной англоязычной стране или регионе. Хотя данные конкретных языков и региональных параметров могут быть динамическими и могут изменяться в соответствии с новыми культурными соглашениями или предпочтениями пользователей, данные инвариантных региональных параметров не изменяются. Объект NumberFormatInfo , представляющий соглашения о форматировании инвариантного языка и региональных параметров, можно использовать для операций форматирования, в которых результирующих строк не должно отличаться в зависимости от языка и региональных параметров.

Вы можете создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании инвариантного языка и региональных параметров следующим образом:

В следующем примере каждый из этих методов используется для создания экземпляра NumberFormatInfo объекта, представляющего инвариантный язык и региональные параметры. Затем он указывает, доступен ли объект только для чтения.

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 для определенного языка и региональных параметров

Определенный язык и региональные параметры представляют язык, который говорится в определенной стране или регионе. Например, en-US — это определенная культура, представляющая английский язык, который говорится в США, а en-CA — это определенная культура, представляющая английский язык, который говорится в Канаде. Вы можете создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании определенного языка и региональных параметров следующими способами:

В следующем примере используются четыре способа создания NumberFormatInfo объекта, который отражает соглашения о форматировании индонезийского языка и региональных параметров (Индонезия). Он также указывает, доступен ли каждый объект только для чтения.

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 для нейтрального языка и региональных параметров

Нейтральный язык и региональные параметры представляют язык и региональные параметры, независимые от страны или региона. Обычно это родитель одного или нескольких конкретных языков и региональных параметров. Например, fr — это нейтральный язык и региональные параметры французского языка, а также родитель языка fr-FR. NumberFormatInfo Создается объект, представляющий соглашения о форматировании нейтрального языка и региональных параметров так же, как и NumberFormatInfo объект, представляющий соглашения о форматировании определенного языка и региональных параметров.

Примечание

В платформа .NET Framework версии 3.5 и более ранних версиях попытка получить NumberFormatInfo объект, который отражает соглашения о форматировании нейтрального языка и региональных параметров, NotSupportedException вызывает исключение.

Тем не менее, поскольку она не зависит от конкретной страны или региона, нейтральный язык и региональные параметры не имеют сведений о форматировании, зависящих от языка и региональных параметров. Вместо заполнения NumberFormatInfo объекта универсальными значениями платформа .NET Framework возвращает NumberFormatInfo объект, который отражает соглашения о форматировании определенного языка и региональных параметров, который является дочерним элементом нейтрального языка и региональных параметров. Например, NumberFormatInfo объект для нейтрального языка и региональных параметров отражает соглашения о форматировании языка и региональных параметров en-US, а NumberFormatInfo объект для языка и региональных параметров fr отражает соглашения о форматировании языка fr-FR.

Для определения соглашений о форматировании конкретных языков и региональных параметров каждый нейтральный язык и региональные параметры можно использовать следующий код.

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 классом, являются динамическими, как и культурные данные, предоставляемые классом CultureInfo . Не следует делать никаких предположений о стабильности значений для NumberFormatInfo объектов, связанных с конкретными CultureInfo объектами. Только данные, предоставляемые инвариантным языком и региональными параметрами и связанными с ним NumberFormatInfo объектами, стабильны. Другие данные могут меняться между сеансами приложений или даже в рамках одного сеанса по следующим причинам:

  • Обновления системы. Культурные предпочтения, такие как символ валюты или форматы валют, изменяются с течением времени. В этом случае клиентский компонент Центра обновления Windows включает изменения NumberFormatInfo в значение свойства для определенного языка и региональных параметров.

  • Язык и региональные параметры замены. Класс CultureAndRegionInfoBuilder можно использовать для замены данных существующего языка и региональных параметров.

  • Каскадные изменения значений свойств. Ряд свойств, связанных с языком и региональными параметрами, может изменяться во время выполнения, что, в свою очередь, приводит NumberFormatInfo к изменению данных. Например, текущий язык и региональные параметры можно изменить программным способом или с помощью действий пользователя. В этом случае объект, возвращаемый свойством, изменяется на объект, NumberFormatInfo связанный с текущим языком CurrentInfo и региональными параметрами.

  • Пользовательские настройки. Пользователи приложения могут переопределить некоторые значения, связанные с текущим языком и региональными параметрами системы, через регион и языковые параметры в панель управления. Например, пользователи могут выбрать другой символ валюты или другой символ десятичного разделителя. CultureInfo.UseUserOverride Если свойству true присвоено значение (значение по умолчанию), свойства NumberFormatInfo объекта также извлекаются из параметров пользователя.

Начиная с платформа .NET Framework 2.0 все переопределимые пользователем свойства NumberFormatInfo объекта инициализируются при создании объекта. По-прежнему существует вероятность несоответствия, так как ни создание объекта, ни процесс переопределения пользователя атомарны, а соответствующие значения могут изменяться во время создания объекта. Однако эти несоответствия должны быть крайне редкими.

Вы можете контролировать, отражаются ли переопределения пользователей в NumberFormatInfo объектах, представляющих тот же язык и региональные параметры, что и текущий язык и региональные параметры. В следующей таблице перечислены способы NumberFormatInfo извлечения объекта и указывает, отражает ли результирующий объект переопределения пользователей.

Источник объекта CultureInfo и NumberFormatInfo Отражает переопределения пользователей
СвойствоCultureInfo.CurrentCulture.NumberFormat Да
СвойствоNumberFormatInfo.CurrentInfo Да
Метод CultureInfo.CreateSpecificCulture Да
Метод CultureInfo.GetCultureInfo Нет
Конструктор CultureInfo(String) Да
Конструктор CultureInfo.CultureInfo(String, Boolean) Зависит от значения useUserOverride параметра

Если в противном случае нет убедительных причин, следует учитывать переопределения пользователей при использовании NumberFormatInfo объекта в клиентских приложениях для форматирования и анализа входных данных пользователя или отображения числовых данных. Для серверных приложений или автоматических приложений не следует учитывать переопределения пользователей. Однако если объект используется NumberFormatInfo явно или неявно для сохранения числовых данных в строковой NumberFormatInfo форме, следует либо использовать объект, который отражает соглашения о форматировании инвариантного языка и региональных параметров, либо указать строку настраиваемого числового формата, используемую независимо от языка и региональных параметров.

IFormatProvider, NumberFormatInfo и числовое форматирование

NumberFormatInfo Объект используется неявно или явно во всех числовых операциях форматирования. К ним относятся вызовы следующих методов:

Все числовые операции форматирования используют реализацию IFormatProvider . Интерфейс IFormatProvider включает один метод. GetFormat(Type) Это метод обратного Type вызова, который передает объект, представляющий тип, необходимый для предоставления сведений о форматировании. Метод отвечает за возврат экземпляра этого типа или null, если он не может предоставить экземпляр типа. Платформа .NET Framework предоставляет две IFormatProvider реализации для форматирования чисел:

  • Класс CultureInfo , представляющий определенный язык и региональные параметры (или определенный язык в определенной стране или регионе). В операции числового форматирования метод возвращает объект, CultureInfo.GetFormat связанный NumberFormatInfo со своим CultureInfo.NumberFormat свойством.

  • Класс NumberFormatInfo , предоставляющий сведения о соглашениях о форматировании связанного языка и региональных параметров. Метод NumberFormatInfo.GetFormat возвращает сам экземпляр.

IFormatProvider Если реализация не предоставляется методу форматирования явным образом, используется объект, CultureInfo возвращаемый свойствомCultureInfo.CurrentCulture, представляющим текущий язык и региональные параметры.

В следующем примере показана связь между интерфейсом IFormatProvider и NumberFormatInfo классом в операциях форматирования путем определения пользовательской IFormatProvider реализации. Его GetFormat метод отображает имя типа объекта, запрошенного операцией форматирования. Если интерфейс запрашивает NumberFormatInfo объект, этот метод предоставляет NumberFormatInfo объект для текущего языка и региональных параметров. Как показано в выходных данных из примера, Decimal.ToString(IFormatProvider) метод запрашивает NumberFormatInfo объект для предоставления сведений о форматировании, в то время как String.Format(IFormatProvider, String, Object[]) запросы NumberFormatInfo и объекты метода, DateTimeFormatInfo а также ICustomFormatter реализация.

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

IFormatProvider Если реализация не предоставляется явным образом в вызове метода числового форматирования, метод вызывает CultureInfo.CurrentCulture.GetFormat метод, который возвращает NumberFormatInfo объект, соответствующий текущему языку и региональным параметрам.

Форматирование строк и свойств NumberFormatInfo

Каждая операция форматирования использует строку стандартного или настраиваемого числового формата для создания результирующих строк из числа. В некоторых случаях использование строки форматирования для получения результирующих строк является явным, как показано в следующем примере. Этот код вызывает Decimal.ToString(IFormatProvider) метод для преобразования Decimal значения в несколько различных строковых представлений с помощью соглашений о форматировании языка и региональных параметров en-US.

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

В других случаях использование строки формата неявно. Например, в следующем методе вызывается метод по умолчанию или без Decimal.ToString() параметров, значение Decimal экземпляра форматируется с помощью описателя общего формата ("G") и соглашений текущего языка и региональных параметров, которые в данном случае являются языком и региональными параметрами en-US.

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 свойств для определения шаблона или символов, используемых в результируемой строке. Аналогичным образом, каждый описатель настраиваемого числового формата, кроме символов "0" и "#" вставки в результирующую строку, определяемую свойствами NumberFormatInfo . В следующей таблице перечислены описатели стандартного и настраиваемого числовых форматов и связанные с ними NumberFormatInfo свойства. Чтобы изменить внешний вид строки результата для определенного языка и региональных параметров, см. раздел свойств Modifying NumberFormatInfo . Дополнительные сведения об использовании этих описателей формата см. в разделе " Стандартные числовые строки" и "Строки настраиваемого числового формата".

Описатель формата Связанные свойства
"C" или "c" (описатель формата валюты) CurrencyDecimalDigits, чтобы определить число дробных цифр по умолчанию.

CurrencyDecimalSeparator, для определения символа десятичного разделителя.

CurrencyGroupSeparator, для определения разделителя групп или тысяч.

CurrencyGroupSizes, чтобы определить размеры целочисленных групп.

CurrencyNegativePattern, чтобы определить шаблон отрицательных значений валюты.

CurrencyPositivePattern, чтобы определить шаблон положительных валютных значений.

CurrencySymbol, для определения символа валюты.

NegativeSign, для определения знака минус.
"D" или "d" (описатель десятичного формата) NegativeSign, для определения знака минус.
"E" или "e" (описатель экспоненциального или научного формата) NegativeSign, чтобы определить символ отрицательного знака в мантиссе и экспоненте.

NumberDecimalSeparator, для определения символа десятичного разделителя.

PositiveSign, чтобы определить символ положительного знака в экспоненте.
"F" или "f" (описатель формата фиксированной точки) NegativeSign, для определения знака минус.

NumberDecimalDigits, чтобы определить число дробных цифр по умолчанию.

NumberDecimalSeparator, для определения символа десятичного разделителя.
"G" или "g" (описатель общего формата) NegativeSign, для определения знака минус.

NumberDecimalSeparator, для определения символа десятичного разделителя.

PositiveSign, чтобы определить символ положительного знака для строк результатов в экспоненциальном формате.
"N" или "n" (описатель числового формата) NegativeSign, для определения знака минус.

NumberDecimalDigits, чтобы определить число дробных цифр по умолчанию.

NumberDecimalSeparator, для определения символа десятичного разделителя.

NumberGroupSeparator, чтобы определить символ разделителя групп (тысяч).

NumberGroupSizes, чтобы определить число целочисленных цифр в группе.

NumberNegativePattern, чтобы определить формат отрицательных значений.
"P" или "p" (описатель формата процента) NegativeSign, для определения знака минус.

PercentDecimalDigits, чтобы определить число дробных цифр по умолчанию.

PercentDecimalSeparator, для определения символа десятичного разделителя.

PercentGroupSeparator, чтобы определить символ разделителя групп.

PercentGroupSizes, чтобы определить число целочисленных цифр в группе.

PercentNegativePattern, чтобы определить размещение символа процента и отрицательного символа для отрицательных значений.

PercentPositivePattern, чтобы определить размещение символа процента для положительных значений.

PercentSymbol, для определения символа процента.
"R" или "r" (описатель формата кругового пути) NegativeSign, для определения знака минус.

NumberDecimalSeparator, для определения символа десятичного разделителя.

PositiveSign, чтобы определить символ положительного знака в экспоненте.
"X" или "x" (описатель шестнадцатеричного формата) Нет.
"." (описатель настраиваемого формата десятичной запятой) NumberDecimalSeparator, для определения символа десятичного разделителя.
"," (описатель настраиваемого формата разделителя групп) NumberGroupSeparator, чтобы определить символ разделителя группы (тысяч).
"%" (описатель настраиваемого формата в процентах) PercentSymbol, чтобы определить символ процента.
""." (описатель настраиваемого формата в милле) PerMilleSymbol, чтобы определить символ милли.
"E" (описатель настраиваемого формата экспоненциальной нотации) NegativeSign, чтобы определить символ отрицательного знака в мантиссе и экспоненте.

PositiveSign, чтобы определить символ положительного знака в экспоненте.

Обратите внимание, что NumberFormatInfo класс содержит NativeDigits свойство, указывающее базовые 10 цифр, используемых определенным языком и региональными параметрами. Однако свойство не используется в операциях форматирования; В результирующем строке используются только цифры "Базовый латиница" от 0 (U+0030) до 9 (U+0039). Кроме того, для Single и Double значений NaN``PositiveInfinity, а NegativeInfinityтакже результирующих строк состоит исключительно из символов, определенных атрибутами NaNSymbolNegativeInfinitySymbol и PositiveInfinitySymbolсвойствами соответственно.

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

Вы можете изменить свойства NumberFormatInfo объекта, чтобы настроить результируемую строку, созданную в операции числового форматирования. Для этого выполните следующие действия.

  1. Создайте копию NumberFormatInfo объекта, для которого требуется изменить соглашения о форматировании и записи. Дополнительные сведения см. в разделе создания экземпляра объекта NumberFormatInfo .

  2. Измените свойство или свойства, которые используются для получения требуемой строки результата. Сведения о том, как методы форматирования используют NumberFormatInfo свойства для определения результирующих строк, см. в разделе "Строки формата" и свойств NumberFormatInfo .

  3. Используйте пользовательский NumberFormatInfo объект в качестве аргумента IFormatProvider в вызовах методов форматирования.

Примечание

Вместо динамического изменения значений свойств языка и региональных параметров при каждом запуске приложения можно использовать CultureAndRegionInfoBuilder класс для определения пользовательского языка и региональных параметров (языка и региональных параметров, имеющих уникальное имя и дополняющего существующие язык и региональные параметры) или замещающего языка и региональных параметров (который используется вместо конкретного языка и региональных параметров).

В следующих разделах приведены некоторые примеры.

Изменение символа и шаблона валюты

В следующем примере изменяется NumberFormatInfo объект, представляющий соглашения о форматировании языка и региональных параметров en-US. Он назначает символ денежной единицы ISO-4217 свойству CurrencySymbol и определяет шаблон для значений валют, состоящий из символа валюты, за которым следует пробел и числовое значение.

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

Форматирование национального идентификационного номера

Многие национальные идентификационные номера состоят исключительно из цифр, поэтому их можно легко отформатировать, изменив свойства NumberFormatInfo объекта. Например, номер социального страхования в США состоит из 9 цифр, расположенных следующим образом: XXX-XX-XXXX В следующем примере предполагается, что номера социального страхования хранятся в виде целых значений и форматируют их соответствующим образом.

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

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

Синтаксический анализ включает преобразование строкового представления числа в число. Каждый числовой тип в платформа .NET Framework включает два перегруженных метода синтаксического анализа: Parse и TryParse. Метод Parse преобразует строку в число и выдает исключение, если преобразование завершается ошибкой. Метод TryParse преобразует строку в число, присваивает число аргументу out и возвращает Boolean значение, указывающее, успешно ли выполнено преобразование.

Методы синтаксического анализа неявно или явно используют NumberStyles значение перечисления, чтобы определить, какие элементы стиля (например, разделители групп, десятичный разделитель или символ валюты) могут присутствовать в строке, если операция синтаксического анализа выполнена успешно. NumberStyles Если значение не указано в вызове метода, по умолчанию используется NumberStyles значение, включающее Float и AllowThousands флаги, которое указывает, что проанализированная строка может включать символы групп, десятичный разделитель, отрицательный знак и символы пробела, а также строковое представление числа в экспоненциальной нотации.

Методы синтаксического анализа также неявно или явно используют NumberFormatInfo объект, который определяет определенные символы и шаблоны, которые могут возникнуть в строке для анализа. NumberFormatInfo Если объект не указан, по умолчанию используется NumberFormatInfo текущий язык и региональные параметры. Дополнительные сведения о синтаксическом анализе см. в отдельных методах синтаксического анализа, таких как Int16.Parse(String), , , Decimal.Parse(String, NumberStyles, IFormatProvider)Int64.Parse(String, IFormatProvider)и Double.TryParse(String, Double)BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger). Int32.Parse(String, NumberStyles)

В следующем примере показана характер синтаксического анализа строк с учетом языка и региональных параметров. Он пытается проанализировать строку, включающую разделители тысяч, с помощью соглашений en-US, fr-FR и инвариантных языков и региональных параметров. Строка, содержащая запятую в качестве разделителя групп и точки в качестве десятичного разделителя, не может анализироваться в языке и региональных параметрах fr-FR, а строка с пробелом в качестве разделителя групп и запятой в качестве десятичного разделителя не может анализироваться в языках и региональных параметрах en-US и инвариантных языках.

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)

Синтаксический анализ обычно выполняется в двух контекстах:

  • Как операция, предназначенная для преобразования введенных пользователем данных в числовое значение.

  • Как операция, предназначенная для кругового пути числового значения; то есть для десериализации числового значения, ранее сериализованного в виде строки.

В следующих разделах более подробно рассматриваются эти две операции.

Синтаксический анализ строк пользователя

При синтаксическом анализе числовых строк, введенных пользователем, всегда следует создать экземпляр NumberFormatInfo объекта, который отражает региональные параметры пользователя. Сведения о создании экземпляра NumberFormatInfo объекта, который отражает пользовательские настройки, см. в разделе NumberFormatInfo и динамических данных .

В следующем примере показано различие между операцией синтаксического анализа, которая отражает региональные параметры пользователя и ту, которая не используется. В этом случае системный язык и региональные параметры по умолчанию — en-US, но пользователь определил "", как десятичный символ и "." в качестве разделителя групп в панель управления, регионе и языке. Обычно эти символы отменяются в языке и региональных параметрах en-US по умолчанию. Когда пользователь вводит строку, которая отражает параметры пользователя, и строка анализируется объектом, который также отражает пользовательские параметры (переопределения), операция синтаксического NumberFormatInfo анализа возвращает правильный результат. Однако если строка анализируется NumberFormatInfo объектом, который отражает стандартные региональные параметры en-US, он ошибает символ запятой для разделителя групп и возвращает неправильный результат.

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

Сериализация и десериализация числовых данных

Если числовые данные сериализуются в строковом формате, а затем десериализируются и анализируются, строки должны создаваться и анализироваться с помощью соглашений инвариантного языка и региональных параметров. Операции форматирования и синтаксического анализа никогда не должны отражать соглашения определенного языка и региональных параметров. Если используются параметры, зависящие от языка и региональных параметров, переносимость данных строго ограничена; его можно успешно десериализировать только в потоке, параметры которого зависят от параметров языка и региональных параметров, идентичных параметрам потока, в котором он был сериализован. В некоторых случаях это означает, что данные невозможно даже десериализировать в той же системе, в которой она была сериализована.

В следующем примере показано, что может произойти при нарушении этого принципа. Значения с плавающей запятой в массиве преобразуются в строки, когда текущий поток использует параметры языка и региональных параметров языка и региональных параметров en-US. Затем данные анализируются потоком, использующими параметры языка и региональных параметров языка и региональных параметров языка и региональных параметров pt-BR. В этом случае, хотя каждая операция синтаксического анализа завершается успешно, данные не будут успешно завершены и происходит повреждение данных. В других случаях операция синтаксического анализа может завершиться ошибкой, и FormatException может возникнуть исключение.

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

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

      CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR");
      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()
      CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
      PersistData()
      
      CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR")
      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, не зависящий от языка и региональных параметров (инвариантный).

Свойства

CurrencyDecimalDigits

Получает или задает число десятичных разрядов, используемое в значениях денежных сумм.

CurrencyDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях денежных сумм.

CurrencyGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях денежных сумм.

CurrencyGroupSizes

Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в значениях денежных сумм.

CurrencyNegativePattern

Возвращает или задает шаблон формата для отрицательных значений денежных сумм.

CurrencyPositivePattern

Возвращает или задает шаблон формата для положительных значений денежных сумм.

CurrencySymbol

Возвращает или задает строку, используемую в качестве знака денежной единицы.

CurrentInfo

Возвращает доступный только для чтения объект NumberFormatInfo, форматирующий значения на основе текущего языка и региональных параметров.

DigitSubstitution

Получает или задает значение, определяющее, каким образом а графическом интерфейсе пользователя должны отображаться фигуры цифр.

InvariantInfo

Возвращает объект NumberFormatInfo, доступный только для чтения, который не зависит от языка и региональных параметров (инвариантный).

IsReadOnly

Возвращает значение, указывающее, является ли данный объект NumberFormatInfo доступным только для чтения.

NaNSymbol

Возвращает или задает строку, представляющую значение IEEE NaN (не числовое).

NativeDigits

Возвращает или задает массив строк собственных цифр, эквивалентных арабским цифрам от 0 до 9.

NegativeInfinitySymbol

Возвращает или задает строку, представляющую минус бесконечность.

NegativeSign

Возвращает или задает строку, указывающую, что соответствующее число является отрицательным.

NumberDecimalDigits

Возвращает или задает число десятичных разрядов, используемое в числовых значениях.

NumberDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в числовых значениях.

NumberGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в числовых значениях.

NumberGroupSizes

Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в числовых значениях.

NumberNegativePattern

Возвращает или задает шаблон формата для отрицательных числовых значений.

PercentDecimalDigits

Возвращает или задает количество десятичных разрядов, используемое в значениях процентов.

PercentDecimalSeparator

Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях процентов.

PercentGroupSeparator

Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях процентов.

PercentGroupSizes

Возвращает или задает количество цифр в каждой из групп разрядов целой части десятичной дроби в значениях процентов.

PercentNegativePattern

Возвращает или задает шаблон формата для отрицательных значений процентов.

PercentPositivePattern

Возвращает или задает шаблон формата для положительных значений процентов.

PercentSymbol

Возвращает или задает строку, используемую в качестве знака процентов.

PerMilleSymbol

Возвращает или задает строку, используемую в качестве знака промилле.

PositiveInfinitySymbol

Возвращает или задает строку, представляющую плюс бесконечность.

PositiveSign

Возвращает или задает строку, указывающую, что соответствующее число является положительным.

Методы

Clone()

Создает неполную копию объекта NumberFormatInfo.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

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

Возвращает объект указанного типа, предоставляющий службу форматирования чисел.

GetHashCode()

Служит хэш-функцией по умолчанию.

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

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

GetType()

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

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

Создает неполную копию текущего объекта Object.

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

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

ToString()

Возвращает строку, представляющую текущий объект.

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

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

См. также раздел