NumberFormatInfo Třída

Definice

Poskytuje informace specifické pro jazykovou verzi pro formátování a parsování číselných hodnot.

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
Dědičnost
NumberFormatInfo
Atributy
Implementuje

Příklady

Následující příklad ukazuje, jak načíst NumberFormatInfo objekt pro odpovídající CultureInfo objekt a použít načtený objekt k dotazování na informace o formátování čísel pro konkrétní jazykovou verzi.

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 '$'

Poznámky

Třída NumberFormatInfo obsahuje informace specifické pro jazykovou verzi, které se používají při formátování a analýze číselných hodnot. Tyto informace zahrnují symbol měny, symbol desetinného čísla, symbol oddělovače skupin a symboly pro kladná a záporná znaménka.

Vytvoření instance objektu NumberFormatInfo

Můžete vytvořit instanci objektu, který představuje konvence formátování aktuální jazykové verze, neutrální jazykové verze, konkrétní jazykové verze NumberFormatInfo nebo neutrální jazykové verze.

Vytvoření instance objektu NumberFormatInfo pro aktuální jazykovou verzi

Instanci objektu pro aktuální jazykovou verzi můžete vytvořit NumberFormatInfo libovolným z následujících způsobů. V každém případě je NumberFormatInfo vrácený objekt jen pro čtení.

Následující příklad používá tyto tři způsoby k vytvoření NumberFormatInfo objektů, které představují konvence formátování aktuální jazykové verze. Načte také hodnotu vlastnosti pro IsReadOnly ilustraci, že každý objekt je jen pro čtení.

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

Zapisovatelný objekt, který představuje konvence aktuální jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:

Následující příklad znázorňuje tyto dva způsoby vytvoření instance objektu a zobrazuje hodnotu jeho vlastnosti, aby bylo znázorněno, že objekt není NumberFormatInfo IsReadOnly jen pro čtení.

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

Všimněte si, Windows operační systém umožňuje uživateli přepsat některé hodnoty vlastností použité v operacích číselného formátování a analýzy prostřednictvím položky Region a Language v NumberFormatInfo Ovládací panely. Například uživatel, jehož jazyková verze je angličtina (USA), může místo výchozí hodnoty 1,1 USD zobrazit hodnoty měny jako 1,1 USD. Objekty NumberFormatInfo načtené dříve probíraly tato přepsání uživatele. Pokud je to nežádoucí, můžete vytvořit objekt, který neodráží přepsání uživatele (a který je také určen pro čtení a zápis, nikoli jen pro čtení) voláním konstruktoru a poskytnutím hodnoty pro NumberFormatInfo CultureInfo.CultureInfo(String, Boolean) argument false useUserOverride . Následující příklad obsahuje obrázek pro systém, jehož aktuální jazyková verze je angličtina (USA) a jejíž symbol měny byl změněn z výchozí hodnoty $ na 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: $

Pokud je vlastnost nastavená na , vlastnosti , a se CultureInfo.UseUserOverride true také CultureInfo.DateTimeFormat CultureInfo.NumberFormat CultureInfo.TextInfo načítá z uživatelského nastavení. Pokud jsou uživatelská nastavení nekompatibilní s jazykovou verzí přidruženou k objektu (například pokud vybraný kalendář není jedním z kalendářů uvedených vlastností), výsledky metod a hodnoty vlastností CultureInfo OptionalCalendars nejsou definovány.

Vytvoření instance objektu NumberFormatInfo pro invariantní jazykovou verzi

Invariantní jazyková verze představuje jazykovou verzi, která není závislá na jazykové verzi. Je založená na anglickém jazyce, ale ne na konkrétní anglicky mluvící zemi nebo oblasti. I když data konkrétních kultur mohou být dynamická a mohou se změnit tak, aby odrážela nové kulturní konvence nebo předvolby uživatelů, data invariantní kultury se nemění. Objekt, NumberFormatInfo který představuje konvence formátování invariantní jazykové verze, lze použít pro operace formátování, ve kterých by se výsledné řetězce neměly lišit podle jazykové verze.

Instanci objektu, který představuje konvence formátování invariantní jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:

Následující příklad používá každou z těchto metod k vytvoření instance NumberFormatInfo objektu, který představuje invariantní jazykovou verzi. Pak určuje, jestli je objekt jen pro čtení.

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

Vytvoření instance objektu NumberFormatInfo pro konkrétní jazykovou verzi

Konkrétní jazyková verze představuje jazyk, který je vyslovený v konkrétní zemi nebo oblasti. Například en-US je konkrétní jazyková verze, která představuje anglický jazyk mluvený v USA, a en-CA je konkrétní jazyková verze, která představuje anglický jazyk vyslovený v Kanadě. Instanci objektu, který představuje konvence formátování konkrétní jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:

Následující příklad používá tyto čtyři způsoby k vytvoření objektu, který odráží konvence formátování indonéštiny NumberFormatInfo (Indonéština). Také určuje, jestli je každý objekt jen pro čtení.

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

Vytvoření instance objektu NumberFormatInfo pro neutrální jazykovou verzi.

Neutrální jazyková verze představuje jazyk nebo jazyk, který je nezávislý na zemi nebo oblasti. Obvykle je nadřazeným objektem jedné nebo více konkrétních jazykových verzí. Například fr je neutrální jazyková verze pro francouzštinu a nadřazená jazyková verze fr-FR. Vytvoříte objekt, který představuje konvence formátování neutrální jazykové verze stejným způsobem jako objekt, který představuje konvence formátování konkrétní NumberFormatInfo NumberFormatInfo jazykové verze.

Poznámka

Ve verzi .NET Framework 3.5 a starších verzích vyvolá pokus o načtení objektu, který odráží konvence formátování neutrální jazykové NumberFormatInfo NotSupportedException verze, výjimku.

Vzhledem k tomu, že je nezávislá na konkrétní zemi nebo oblasti, neutrální jazyková verze nemá informace o formátování specifické pro jazykovou verzi. Místo naplnění objektu obecnými hodnotami vrací .NET Framework objekt, který odráží konvence formátování konkrétní jazykové verze, která je podřízeným objektem NumberFormatInfo NumberFormatInfo neutrální jazykové verze. Například objekt pro neutrální jazykovou verzi en odráží konvence formátování jazykové verze en-US a objekt pro jazykovou verzi fr odráží konvence formátování jazykové verze NumberFormatInfo NumberFormatInfo fr-FR.

Pomocí kódu, jako je následující, můžete určit, které konkrétní konvence formátování jazykové verze každá neutrální jazyková verze představuje.

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 a dynamická data

Data specifická pro jazykovou verzi pro formátování číselných hodnot poskytovaných třídou jsou dynamická, stejně jako kulturní NumberFormatInfo data poskytovaná CultureInfo třídou . Neměli byste provádět žádné předpoklady o stabilitě hodnot pro NumberFormatInfo objekty, které jsou přidruženy ke konkrétním CultureInfo objektům. Stabilní jsou pouze data poskytnutá invariantní jazykovou verzí a NumberFormatInfo přidruženým objektem. Jiná data se mohou mezi relacemi aplikace nebo dokonce v rámci jedné relace měnit z následujících důvodů:

  • Aktualizace systému. Kulturní předvolby, jako je symbol měny nebo formáty měny, se v průběhu času mění. Když k tomu dojde, Windows Update zahrnuje změny NumberFormatInfo hodnoty vlastnosti pro konkrétní jazykovou verzi.

  • Nahrazování jazykových verzí. Třídu CultureAndRegionInfoBuilder lze použít k nahrazení dat existující jazykové verze.

  • Kaskádové změny hodnot vlastností Za běhu se může změnit řada vlastností souvisejících s jazykovou verzí, což zase způsobí změnu NumberFormatInfo dat. Aktuální jazykovou verzi lze například změnit programově nebo prostřednictvím akce uživatele. V takovém případě se NumberFormatInfo objekt vrácený CurrentInfo vlastností změní na objekt přidružený k aktuální jazykové verzi.

  • Předvolby uživatelů. Uživatelé vaší aplikace mohou přepsat některé hodnoty přidružené k aktuální jazykové verzi systému prostřednictvím oblasti a jazykových možností v Ovládací panely. Uživatelé mohou například zvolit jiný symbol měny nebo jiný oddělovač desetinných míst. Pokud je vlastnost nastavená na (výchozí hodnota), vlastnosti objektu se také načítá CultureInfo.UseUserOverride true z NumberFormatInfo uživatelského nastavení.

Počínaje .NET Framework 2.0 jsou při vytvoření objektu inicializovány všechny uživatelem NumberFormatInfo přepisovatelné vlastnosti objektu. Stále existuje možnost nekonzistence, protože vytvoření objektu ani proces přepsání uživatelem nejsou atomické a příslušné hodnoty se při vytváření objektu mohou změnit. Tyto nekonziference by však měly být extrémně vzácné.

Můžete řídit, jestli se přepsání uživatele projeví v objektech, které představují stejnou jazykovou NumberFormatInfo verzi jako aktuální jazyková verze. Následující tabulka uvádí způsoby, jakými lze objekt načíst, a určuje, zda výsledný objekt odráží NumberFormatInfo přepsání uživatele.

Zdroj objektu CultureInfo a NumberFormatInfo Odráží přepsání uživatelů.
CultureInfo.CurrentCulture.NumberFormat majetek Yes
NumberFormatInfo.CurrentInfo majetek Yes
Metoda CultureInfo.CreateSpecificCulture Yes
Metoda CultureInfo.GetCultureInfo No
CultureInfo(String) BeginRequestEventArgs Yes
CultureInfo.CultureInfo(String, Boolean) BeginRequestEventArgs Závisí na hodnotě useUserOverride parametru

Pokud neexistují přesvědčivé důvody v jiném smyslu, měli byste respektovat přepsání uživatelů při použití NumberFormatInfo objektu v klientských aplikacích k formátování a analýze vstupu uživatele nebo k zobrazení číselných dat. Pro serverové aplikace nebo bezobslužné aplikace byste neměli respektovat přepsání uživatelů. Nicméně pokud používáte NumberFormatInfo objekt explicitně nebo implicitně k zachování číselných dat ve formě řetězce, měli byste buď použít NumberFormatInfo objekt, který odráží konvence formátování invariantní jazykové verze, nebo byste měli zadat vlastní řetězec číselného formátu, který použijete bez ohledu na jazykovou verzi.

IFormatProvider, NumberFormatInfo a formátování čísel

NumberFormatInfoObjekt se implicitně nebo explicitně používá v rámci všech operací s číselným formátováním. Mezi ně patří volání následujících metod:

Všechny operace číselného formátování využívají IFormatProvider implementaci. IFormatProviderRozhraní obsahuje jedinou metodu, GetFormat(Type) . Toto je metoda zpětného volání, která je předána Type objektu, který představuje typ potřebný k zadání informací o formátování. Metoda zodpovídá za vrácení buď instance daného typu null , nebo, pokud nemůže poskytnout instanci typu. .NET Framework poskytuje dvě IFormatProvider implementace pro formátování čísel:

Pokud není IFormatProvider implementována metoda formátování explicitně, CultureInfo CultureInfo.CurrentCulture je použit objekt vrácený vlastností, která představuje aktuální jazykovou verzi.

Následující příklad znázorňuje vztah mezi IFormatProvider rozhraním a NumberFormatInfo třídou v rámci formátování operací definováním vlastní IFormatProvider implementace. Jeho GetFormat Metoda zobrazí název typu objektu požadovaného operací formátování. Pokud rozhraní požaduje NumberFormatInfo objekt, tato metoda poskytuje NumberFormatInfo objekt pro aktuální jazykovou verzi. Jak ukazuje výstup z příkladu, Decimal.ToString(IFormatProvider) metoda požaduje NumberFormatInfo objekt, který poskytuje informace o formátování, zatímco String.Format(IFormatProvider, String, Object[]) požadavky metody NumberFormatInfo a DateTimeFormatInfo objekty a také ICustomFormatter implementaci.

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

Pokud IFormatProvider není implementace explicitně k dispozici ve volání metody číselného formátování, metoda volá CultureInfo.CurrentCulture.GetFormat metodu, která vrátí NumberFormatInfo objekt, který odpovídá aktuální jazykové verzi.

Formátování řetězců a vlastností NumberFormatInfo

Každá operace formátování používá buď standardní, nebo vlastní řetězec číselného formátu k vytvoření výsledného řetězce z čísla. V některých případech použití formátovacího řetězce k vytvoření výsledného řetězce je explicitní, jako v následujícím příkladu. Tento kód volá Decimal.ToString(IFormatProvider) metodu pro převod Decimal hodnoty na několik různých řetězcových reprezentací pomocí formátovacích úmluv jazykové verze 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

V jiných případech je použití formátovacího řetězce implicitní. Například v následující metodě volá metodu výchozí nebo bez parametrů Decimal.ToString() , hodnota Decimal instance je formátována pomocí specifikátoru obecného formátu ("G") a konvence aktuální jazykové verze, která je v tomto případě jazyková verze 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

Každý standardní číselný formátovací řetězec používá jednu nebo více NumberFormatInfo vlastností k určení vzoru nebo symbolů použitých ve výsledném řetězci. Podobně každý vlastní číselný specifikátor formátu s výjimkou "0" a "#" vloží symboly ve výsledném řetězci, které jsou definovány NumberFormatInfo vlastnostmi. V následující tabulce jsou uvedeny specifikátory standardního a vlastního číselného formátu a jejich přidružené NumberFormatInfo Vlastnosti. Chcete-li změnit vzhled výsledného řetězce pro konkrétní jazykovou verzi, přečtěte si část Úprava vlastností NumberFormatInfo . Podrobnosti o použití těchto specifikátorů formátu naleznete v tématu Standardní číselné formátovací řetězce a vlastní číselné formátovací řetězce.

Specifikátor formátu Přidružené vlastnosti
"C" nebo "c" (specifikátor formátu měny) CurrencyDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic.

CurrencyDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

CurrencyGroupSeparatorpro definování oddělovače skupin nebo tisíců.

CurrencyGroupSizespro definování velikosti integrálních skupin.

CurrencyNegativePatternpro definování vzoru záporných hodnot měny.

CurrencyPositivePatternpro definování vzoru hodnot kladné měny.

CurrencySymbol, chcete-li definovat symbol měny.

NegativeSign, chcete-li definovat symbol záporného znaménka.
"D" nebo "d" (specifikátor desítkového formátu) NegativeSign, chcete-li definovat symbol záporného znaménka.
"E" nebo "e" (specifikátor exponenciálního nebo vědeckého formátu) NegativeSign, chcete-li definovat symbol záporného znaménka v mantise a exponentu.

NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

PositiveSign, chcete-li v exponentu definovat symbol kladného znaménka.
"F" nebo "f" (specifikátor formátu s pevnou desetinnou čárkou) NegativeSign, chcete-li definovat symbol záporného znaménka.

NumberDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic.

NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.
"G" nebo "g" (obecný specifikátor formátu) NegativeSign, chcete-li definovat symbol záporného znaménka.

NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

PositiveSign, chcete-li definovat symbol kladného znaménka pro výsledné řetězce v exponenciálním formátu.
"N" nebo "n" (specifikátor číselného formátu) NegativeSign, chcete-li definovat symbol záporného znaménka.

NumberDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic.

NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

NumberGroupSeparator, chcete-li definovat symbol oddělovače skupin (tisíců).

NumberGroupSizes, chcete-li definovat počet integrálních číslic ve skupině.

NumberNegativePattern, chcete-li definovat formát záporných hodnot.
"P" nebo "p" (specifikátor formátu procent) NegativeSign, chcete-li definovat symbol záporného znaménka.

PercentDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic.

PercentDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

PercentGroupSeparator, chcete-li definovat symbol oddělovače skupiny.

PercentGroupSizes, chcete-li definovat počet integrálních číslic ve skupině.

PercentNegativePatternpro definování umístění symbolu procenta a záporného symbolu pro záporné hodnoty.

PercentPositivePatternpro definování umístění symbolu procenta pro kladné hodnoty.

PercentSymbol, chcete-li definovat symbol procenta.
"R" nebo "r" (specifikátor formátu Round-Trip) NegativeSign, chcete-li definovat symbol záporného znaménka.

NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.

PositiveSign, k definování symbol kladného znaménka v exponentu.
"X" nebo "x" (specifikátor šestnáctkového formátu) Žádné
"." (specifikátor vlastního formátu desetinné čárky) NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst.
"," (specifikátor vlastního formátu oddělovače skupin) NumberGroupSeparator, chcete-li definovat symbol oddělovače skupiny (tisíc).
"%" (specifikátor vlastního formátu procentního symbolu) PercentSymbol, chcete-li definovat symbol procenta.
"‰" (specifikátor vlastního formátu zástupného textu na promile) PerMilleSymbol, k definování symbolu na promile.
"E" (specifikátor vlastního formátu exponenciálního zápisu) NegativeSign, chcete-li definovat symbol záporného znaménka v mantise a exponentu.

PositiveSign, chcete-li v exponentu definovat symbol kladného znaménka.

Všimněte si, že NumberFormatInfo Třída obsahuje NativeDigits vlastnost, která určuje základní 10 číslic používaných specifickou jazykovou verzí. Tato vlastnost se však nepoužívá při formátování operací. ve výsledném řetězci je použita pouze základní Latinská číslice 0 (U + 0030) až 9 (U + 0039). Kromě toho pro Single a Double hodnoty, a NaN se PositiveInfinity NegativeInfinity výsledný řetězec skládá výhradně z symbolů definovaných NaNSymbol PositiveInfinitySymbol vlastnostmi, a v NegativeInfinitySymbol uvedeném pořadí.

Změna vlastností NumberFormatInfo

Můžete upravit vlastnosti NumberFormatInfo objektu pro přizpůsobení výsledného řetězce vytvořeného v rámci operace formátování čísel. Použijte následující postup:

  1. Vytvořte kopii objektu pro čtení a zápis, NumberFormatInfo jejíž konvence formátování chcete upravit. Další informace naleznete v části vytvoření instance objektu NumberFormatInfo .

  2. Upravte vlastnost nebo vlastnosti, které se používají k výrobě požadovaného výsledného řetězce. Informace o tom, jak metody formátování používají NumberFormatInfo Vlastnosti k definování výsledných řetězců, naleznete v části formátovací řetězce a vlastnosti NumberFormatInfo .

  3. Použijte vlastní NumberFormatInfo objekt jako IFormatProvider argument v volání metody formátování.

Poznámka

Namísto dynamické úpravy hodnot vlastností jazykové verze pokaždé, když je aplikace spuštěná, můžete CultureAndRegionInfoBuilder třídu použít k definování vlastní jazykové verze (jazyková verze, která má jedinečný název a doplňuje stávající jazykové verze), nebo nahrazující jazykové verze (ta, která se používá místo konkrétní jazykové verze).

V následujících částech jsou uvedeny některé příklady.

Úpravy symbolu a vzorce měny

Následující příklad upravuje NumberFormatInfo objekt, který představuje konvence formátování jazykové verze en-US. Přiřadí k vlastnosti symbol měny ISO-4217 CurrencySymbol a definuje vzor pro hodnoty měny, který se skládá z symbolu měny následovaného mezerou a číselnou hodnotou.

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

Formátování národního identifikačního čísla

Mnoho národních identifikačních čísel se skládá výhradně z číslic, takže je lze snadno formátovat úpravou vlastností NumberFormatInfo objektu. Například číslo sociálního pojištění v USA sestává z 9 číslic seřazených takto: XXX-XX-XXXX . Následující příklad předpokládá, že čísla sociálních zabezpečení jsou ukládána jako celočíselné hodnoty a odpovídajícím způsobem jejich formátování.

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

Analýza číselných řetězců

Analýza zahrnuje převod řetězcové reprezentace čísla na číslo. každý číselný typ v .NET Framework zahrnuje dvě přetížené metody analýzy: Parse a TryParse . ParseMetoda převede řetězec na číslo a vyvolá výjimku, pokud se převod nezdařil. TryParseMetoda převede řetězec na číslo, přiřadí číslo k out argumentu a vrátí Boolean hodnotu, která označuje, zda byl převod úspěšný.

Metody analýzy implicitně nebo explicitně používají NumberStyles hodnotu výčtu k určení, jaké prvky stylu (například oddělovače skupin, oddělovač desetinných míst nebo symbol měny) mohou být k dispozici v řetězci, pokud je operace analýzy úspěšná. Pokud NumberStyles ve volání metody není zadána hodnota, je výchozí NumberStyles hodnota, která zahrnuje Float AllowThousands příznaky a, což určuje, že analyzovaný řetězec může zahrnovat skupinové symboly, oddělovač desetinných míst, záporné znaménko a prázdné znaky, nebo může být řetězcové vyjádření čísla v exponenciálním zápisu.

Metody analýzy také implicitně nebo explicitně používají NumberFormatInfo objekt, který definuje konkrétní symboly a vzory, které mohou nastat v řetězci, který má být analyzován. Pokud není NumberFormatInfo objekt zadán, výchozí hodnota je NumberFormatInfo pro aktuální jazykovou verzi. Další informace o analýze naleznete v tématu jednotlivé metody analýzy, jako například Int16.Parse(String) ,, Int32.Parse(String, NumberStyles) , Int64.Parse(String, IFormatProvider) Decimal.Parse(String, NumberStyles, IFormatProvider) , Double.TryParse(String, Double) a BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger) .

Následující příklad ukazuje povahu pro analýzu řetězců závislých na jazykové verzi. Pokusí se analyzovat řetězec, který obsahuje oddělovače tisíců, pomocí konvencí en-US, fr-FR a neutrálních kultur. Řetězec, který obsahuje čárku jako oddělovač skupiny a tečku jako oddělovač desetinných míst, se nedokáže analyzovat v jazykové verzi fr-FR a řetězec s prázdným znakem jako oddělovač skupin a čárka jako oddělovač desetinných míst se nedokáže analyzovat v EN-US a neutrální jazykové verzi.

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)

K analýze obvykle dochází ve dvou kontextech:

  • Jako operace, která je navržena pro převod vstupu uživatele na číselnou hodnotu.

  • Jako operace, která je určená k přenosu číselné hodnoty; To znamená, že k deserializaci číselné hodnoty, která byla dříve serializována jako řetězec.

Následující části podrobněji popisují tyto dvě operace.

Analýza uživatelských řetězců

Při analýze vstupu číselných řetězců uživatelem byste vždy měli vytvořit instanci NumberFormatInfo objektu, který odráží kulturní nastavení uživatele. Informace o tom, jak vytvořit instanci NumberFormatInfo objektu, který odráží uživatelské přizpůsobení, najdete v části NumberFormatInfo a dynamická data .

Následující příklad znázorňuje rozdíl mezi operací analýzy, která odráží nastavení kultury uživatele a druhý, který ne. V tomto případě je výchozí jazyková verze systému en-US, ale uživatel definoval "", "jako oddělovač skupiny v Ovládacích panelech, oblasti a jazyk". ". Obvykle jsou tyto symboly vráceny ve výchozí jazykové verzi en-US. Když uživatel zadá řetězec, který odráží uživatelská nastavení, a řetězec je analyzován pomocí NumberFormatInfo objektu, který také odráží uživatelská nastavení (přepsání), operace analýzy vrátí správný výsledek. Nicméně, pokud je řetězec analyzován pomocí NumberFormatInfo objektu, který odráží standardní kulturní nastavení en-US, vyhodnotí symbol čárky pro oddělovač skupin a vrátí nesprávný výsledek.

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

Serializace a deserializace číselných dat

Pokud jsou číselná data serializována ve formátu řetězce a později deserializovaná a analyzovaná, řetězce by se měly vygenerovat a analyzovat pomocí konvencí invariantní jazykové verze. Operace formátování a analýzy by nikdy neměly odrážet konvence konkrétní jazykové verze. Pokud se použije nastavení specifická pro jazykovou verzi, přenositelnost dat je striktně omezené; lze ji úspěšně deserializovat pouze v vlákně, jejíž nastavení specifické pro jazykovou verzi je identické s hodnotami vlákna, na kterých byla serializována. V některých případech to znamená, že data nelze dokonce úspěšně deserializovat ve stejném systému, na kterém byla serializována.

Následující příklad ukazuje, co se může stát, když je tento princip porušení. Hodnoty s plovoucí desetinnou čárkou v poli jsou převedeny na řetězce v případě, že aktuální vlákno používá nastavení kultury en-US specifické pro jazykovou verzi. Data se pak analyzují pomocí vlákna, které používá nastavení specifické pro jazykovou verzi pt-BR. V takovém případě, i když je každá operace analýzy úspěšná, se data nezdaří a dojde k poškození dat. V jiných případech může být operace analýzy neúspěšná a FormatException mohla by být vyvolána výjimka.

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

Konstruktory

NumberFormatInfo()

Inicializuje novou zapisovatelnou instanci NumberFormatInfo třídy, která je nezávislé na jazykové verzi (invariantní).

Vlastnosti

CurrencyDecimalDigits

Získá nebo nastaví počet desetinných míst, která se mají použít v hodnotách měny.

CurrencyDecimalSeparator

Získá nebo nastaví řetězec, který má být použit jako oddělovač desetinných míst v hodnotách měny.

CurrencyGroupSeparator

Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v hodnotách měny.

CurrencyGroupSizes

Získá nebo nastaví počet číslic v každé skupině vlevo od desetinné čárky v hodnotách měny.

CurrencyNegativePattern

Získá nebo nastaví vzor formátu pro záporné hodnoty měny.

CurrencyPositivePattern

Získá nebo nastaví vzor formátu pro kladné hodnoty měny.

CurrencySymbol

Získá nebo nastaví řetězec, který má být použit jako symbol měny.

CurrentInfo

Získá pouze pro čtení NumberFormatInfo , které formátuje hodnoty na základě aktuální jazykové verze.

DigitSubstitution

Získá nebo nastaví hodnotu, která určuje, jak grafické uživatelské rozhraní zobrazuje tvar číslice.

InvariantInfo

Získá objekt jen pro čtení, který je nezávislý na jazykové verzi NumberFormatInfo (invariantní).

IsReadOnly

Získá hodnotu, která určuje, zda je NumberFormatInfo tento objekt jen pro čtení.

NaNSymbol

Získá nebo nastaví řetězec, který představuje hodnotu IEEE NaN (nikoli číslo).

NativeDigits

Získá nebo nastaví pole řetězců nativních číslic odpovídající západním číslicám 0 až 9.

NegativeInfinitySymbol

Získá nebo nastaví řetězec, který představuje záporné nekonečno.

NegativeSign

Získá nebo nastaví řetězec, který označuje, že přidružené číslo je záporné.

NumberDecimalDigits

Získá nebo nastaví počet desetinných míst, která se budou používat v číselných hodnotách.

NumberDecimalSeparator

Získá nebo nastaví řetězec, který se použije jako oddělovač desetinných míst v číselných hodnotách.

NumberGroupSeparator

Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v číselných hodnotách.

NumberGroupSizes

Získá nebo nastaví počet číslic v každé skupině nalevo od desetinné čárky v číselných hodnotách.

NumberNegativePattern

Získá nebo nastaví formátový vzor pro záporné číselné hodnoty.

PercentDecimalDigits

Získá nebo nastaví počet desetinných míst, která se budou používat v hodnotách procent.

PercentDecimalSeparator

Získá nebo nastaví řetězec, který se použije jako oddělovač desetinných míst v hodnotách procent.

PercentGroupSeparator

Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v hodnotách procent.

PercentGroupSizes

Získá nebo nastaví počet číslic v každé skupině nalevo od desetinné čárky v hodnotách procent.

PercentNegativePattern

Získá nebo nastaví formátový vzor pro záporné procentuální hodnoty.

PercentPositivePattern

Získá nebo nastaví vzorek formátu pro kladné procentuální hodnoty.

PercentSymbol

Získá nebo nastaví řetězec, který má být použit jako symbol procenta.

PerMilleSymbol

Získá nebo nastaví řetězec, který má být použit jako symbol na promile.

PositiveInfinitySymbol

Získá nebo nastaví řetězec, který představuje kladné nekonečno.

PositiveSign

Získá nebo nastaví řetězec, který označuje, že přidružené číslo je kladné.

Metody

Clone()

Vytvoří kopii objektu bez podstruktury NumberFormatInfo .

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetFormat(Type)

Získá objekt zadaného typu, který poskytuje službu formátování čísel.

GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetInstance(IFormatProvider)

Získá objekt NumberFormatInfo přidružený k zadanému parametru IFormatProvider .

GetType()

Type Získá aktuální instanci.

(Zděděno od Object)
MemberwiseClone()

Vytvoří použádnou kopii aktuálního souboru Object.

(Zděděno od Object)
ReadOnly(NumberFormatInfo)

Vrátí obálku určenou jen pro čtení NumberFormatInfo .

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro

Viz také