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
属性
実装

次の例は、対応するCultureInfoオブジェクトのオブジェクトをNumberFormatInfo取得し、取得したオブジェクトを使用して特定のカルチャの数値書式情報を照会する方法を示しています。

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 オブジェクトは読み取り専用です。

次の例では、これら 3 つの方法を使用して、現在のカルチャの書式設定規則を表すオブジェクトを作成 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 オブジェクトを作成できます。

次の例では、オブジェクトをインスタンス化するこれら 2 つの方法を 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 [地域] 項目と [言語] 項目を使用して、数値の書式設定および解析操作で使用されるプロパティ値の一部をオーバーライドできます。 たとえば、カルチャが英語 (米国) のユーザーは、既定の $1.1 ではなく 1.1 USD として通貨値を表示することを選択できます。 前に説明した方法で取得されたオブジェクトはすべて 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 、プロパティCultureInfo.DateTimeFormatに設定trueされ、CultureInfo.NumberFormatCultureInfo.TextInfoユーザー設定からも取得される場合。 ユーザー設定がオブジェクトに関連付 CultureInfo けられているカルチャと互換性がない場合 (たとえば、選択した予定表がプロパティに OptionalCalendars 一覧表示されているカレンダーの 1 つでない場合)、メソッドの結果とプロパティの値は未定義です。

インバリアント カルチャの 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 書式設定規則を表すオブジェクトは、次の方法でインスタンス化できます。

次の例では、これら 4 つの方法を使用して、 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 オブジェクトをインスタンス化する

ニュートラル カルチャは、国/地域に依存しないカルチャまたは言語を表します。 通常、これは 1 つ以上の特定のカルチャの親です。 たとえば、fr はフランス語のニュートラル カルチャであり、fr-FR カルチャの親です。 ニュートラル カルチャの書式設定規則を表すオブジェクトは、特定のカルチャの書式設定規則を表すオブジェクトを作成するのと同じ方法で作成NumberFormatInfoNumberFormatInfoします。

注意

.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 提供されるカルチャ データと同様に動的です。 特定CultureInfoのオブジェクトに関連付けられているオブジェクトの値NumberFormatInfoの安定性に関する仮定は行うべきではありません。 不変カルチャとそれに関連付けられている NumberFormatInfo オブジェクトによって提供されるデータのみが安定しています。 その他のデータは、アプリケーション セッション間、または単一セッション内でも、次の理由で変更される可能性があります。

  • システムの更新。 通貨記号や通貨書式などのカルチャ設定は、時間の経過と同時に変化します。 この場合、Windows Updateには特定のカルチャの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には、数値を書式設定するための 2 つのIFormatProvider実装が用意されています。

実装が IFormatProvider 書式設定メソッドに明示的に提供されていない場合は、現在の CultureInfo カルチャを CultureInfo.CurrentCulture 表すプロパティによって返されるオブジェクトが使用されます。

次の例では、カスタムIFormatProvider実装をIFormatProvider定義して、書式設定操作におけるインターフェイスとNumberFormatInfoクラスの関係を示します。 そのメソッドは GetFormat 、書式設定操作によって要求されたオブジェクトの型名を表示します。 インターフェイスがオブジェクトを要求している NumberFormatInfo 場合、このメソッドは現在のカルチャの NumberFormatInfo オブジェクトを提供します。 この例の出力が示すように、Decimal.ToString(IFormatProvider)メソッドはオブジェクトに書式情報を提供するように要求NumberFormatInfoしますがString.Format(IFormatProvider, String, Object[])、メソッドは実装と同様に要求しDateTimeFormatInfo、オブジェクトもICustomFormatter要求NumberFormatInfoします。

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 プロパティ

すべての書式設定操作では、標準またはカスタムの数値書式指定文字列を使用して、数値から結果文字列を生成します。 場合によっては、次の例のように、書式指定文字列を使用して結果文字列を生成することが明示的になります。 このコードは、en-US カルチャの書式設定規則を使用して、値をさまざまな文字列表現に変換Decimalするメソッドを呼び出Decimal.ToString(IFormatProvider)します。

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

各標準数値書式指定文字列では、1 つ以上の NumberFormatInfo プロパティを使用して、結果文字列で使用されるパターンまたはシンボルを決定します。 同様に、"0" と "#" を除く各カスタム数値書式指定子は、プロパティによって NumberFormatInfo 定義される結果文字列にシンボルを挿入します。 次の表に、標準およびカスタムの数値書式指定子とそれに関連付けられている NumberFormatInfo プロパティを示します。 特定のカルチャの結果文字列の外観を変更するには、「 NumberFormatInfo プロパティの変更 」セクションを参照してください。 これらの書式指定子の使用方法の詳細については、「 標準の数値書式指定文字列 」および 「カスタム数値書式指定文字列」を参照してください。

書式指定子 関連付けられているプロパティ
"C" または "c" (通貨書式指定子) CurrencyDecimalDigitsを使用して、小数部の既定の桁数を定義します。

CurrencyDecimalSeparator (小数点の記号を定義します)。

CurrencyGroupSeparatorをクリックして、グループまたは桁区切り記号を定義します。

CurrencyGroupSizesを使用して、整数グループのサイズを定義します。

CurrencyNegativePatternを使用して、負の通貨値のパターンを定義します。

CurrencyPositivePatternを使用して、正の通貨値のパターンを定義します。

CurrencySymbolをクリックして通貨記号を定義します。

NegativeSign (マイナス記号を定義します)。
"D" または "d" (10 進書式指定子) 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" (16 進数書式指定子) [なし] :
"."(小数点のカスタム書式指定子) NumberDecimalSeparator (小数点の記号を定義します)。
"," (グループ区切り記号のカスタム書式指定子) NumberGroupSeparatorをクリックして、グループ (千) 区切り記号を定義します。
"%" (パーセンテージ プレースホルダー カスタム書式指定子) PercentSymbolを使用してパーセント記号を定義します。
"‰" (ミル単位のプレースホルダーカスタム書式指定子) PerMilleSymbolを使用して、ミル単位の記号を定義します。
"E" (指数表記カスタム書式指定子) NegativeSignは、仮数と指数の負符号記号を定義します。

PositiveSign指数の正符号記号を定義します。

このクラスには、特定のNumberFormatInfoNativeDigitsカルチャで使用される基本 10 桁を指定するプロパティが含まれています。 ただし、プロパティは書式設定操作では使用されません。結果文字列には、基本ラテン数字 0 (U+0030) ~ 9 (U+0039) のみが使用されます。 さらに、結果文字列の値SingleDouble 、、およびNegativeInfinity結果PositiveInfinity文字列は、それぞれ 、PositiveInfinitySymbol、およびNegativeInfinitySymbolプロパティによって定義されたNaNSymbolシンボルNaNのみで構成されます。

NumberFormatInfo プロパティの変更

オブジェクトのプロパティを変更して、 NumberFormatInfo 数値書式指定操作で生成される結果文字列をカスタマイズできます。 これを行うには、次の手順を実行します。

  1. 書式設定規則を変更する NumberFormatInfo オブジェクトの読み取り/書き込みコピーを作成します。 詳細については、「 NumberFormatInfo オブジェクトのインスタンス化 」セクションを参照してください。

  2. 目的の結果文字列を生成するために使用するプロパティを変更します。 書式設定メソッドでプロパティを使用 NumberFormatInfo して結果文字列を定義する方法については、「文字列の 書式設定」および「NumberFormatInfo プロパティ 」セクションを参照してください。

  3. 書式設定メソッドの呼び出しでは、IFormatProviderカスタム NumberFormatInfo オブジェクトを引数として使用します。

注意

アプリケーションが開始されるたびにカルチャのプロパティ値を動的に変更する代わりに、クラスを 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 書式設定できます。 たとえば、米国の社会保障番号は、次XXX-XX-XXXXのように 9 桁で構成されます。 次の例では、社会保障番号が整数値として格納され、適切に書式設定されていることを前提としています。

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の各数値型には、オーバーロードされた 2 つの解析メソッドParseTryParse. このメソッドは Parse 、文字列を数値に変換し、変換が失敗した場合に例外をスローします。 このメソッドは TryParse 、文字列を数値に変換し、その数値を out 引数に割り当て、変換が成功したかどうかを示す値を返 Boolean します。

解析メソッドは、列挙値を NumberStyles 暗黙的または明示的に使用して、解析操作が成功する場合に文字列に存在できるスタイル要素 (グループ区切り記号、小数点区切り記号、通貨記号など) を決定します。 NumberStylesメソッド呼び出しで値が指定されていない場合、既定値はNumberStyles、解析された文字列にグループ記号、小数点記号、負符号、および空白文字を含めることができるか、または指数表記で数値の文字列表現を使用できることを指定する、and フラグを含むFloatAllowThousands値です。

また、解析メソッドは、解析する文字列内で発生する可能性がある特定のシンボルとパターンを定義するオブジェクトを暗黙的または明示的に使用 NumberFormatInfo します。 オブジェクトが NumberFormatInfo 指定されていない場合、既定値は現在の NumberFormatInfo カルチャの場合です。 解析の詳細については、個々の解析方法 Int16.Parse(String)(例: , , Int32.Parse(String, NumberStyles), Int64.Parse(String, IFormatProvider)Decimal.Parse(String, NumberStyles, IFormatProvider), Double.TryParse(String, Double), などBigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger)) を参照してください。

次の例は、文字列を解析するカルチャに依存する性質を示しています。 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)

解析は通常、次の 2 つのコンテキストで行われます。

  • ユーザー入力を数値に変換するように設計された操作として。

  • 数値をラウンドトリップするように設計された操作として。つまり、以前に文字列としてシリアル化された数値を逆シリアル化します。

次のセクションでは、これら 2 つの操作について詳しく説明します。

ユーザー文字列の解析

ユーザーが入力した数値文字列を解析するときは、常にユーザーのカルチャ設定を NumberFormatInfo 反映するオブジェクトをインスタンス化する必要があります。 ユーザーのカスタマイズを反映するオブジェクトを NumberFormatInfo インスタンス化する方法については、「 NumberFormatInfo と動的データ 」セクションを参照してください。

次の例は、ユーザーカルチャ設定を反映する解析操作と反映されない解析操作の違いを示しています。 この場合、既定のシステム カルチャは en-US ですが、ユーザーは 10 進記号として "," を、コントロール パネル、地域、言語 のグループ区切り記号として "." を定義しています。 通常、これらのシンボルは、既定の en-US カルチャで反転されます。 ユーザーがユーザー設定を反映する文字列を入力し、ユーザー設定も反映するオブジェクトによって NumberFormatInfo 文字列が解析されると (オーバーライド)、解析操作は正しい結果を返します。 ただし、文字列が標準の en-US カルチャ設定を NumberFormatInfo 反映するオブジェクトによって解析されると、コンマ記号がグループ区切り記号に誤りがあり、正しくない結果が返されます。

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)

適用対象

こちらもご覧ください