NumberFormatInfo クラス

定義

数値の書式設定と解析に関するカルチャ固有の情報を提供します。

public ref class NumberFormatInfo sealed : IFormatProvider
public ref class NumberFormatInfo sealed : ICloneable, IFormatProvider
public sealed class NumberFormatInfo : IFormatProvider
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
type NumberFormatInfo = class
    interface IFormatProvider
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements ICloneable, IFormatProvider
継承
NumberFormatInfo
属性
実装

注釈

NumberFormatInfo クラスには、数値を書式設定および解析するときに使用されるカルチャ固有の情報が含まれています。 この情報には、通貨記号、小数点記号、グループ区切り記号、正符号と負符号の記号が含まれます。

NumberFormatInfo オブジェクトをインスタンス化する

現在のカルチャ、インバリアント カルチャ、特定のカルチャ、またはニュートラル カルチャの書式設定規則を表す NumberFormatInfo オブジェクトをインスタンス化できます。

現在のカルチャの NumberFormatInfo オブジェクトをインスタンス化する

現在のカルチャの NumberFormatInfo オブジェクトは、次のいずれかの方法でインスタンス化できます。 いずれの場合も、返される NumberFormatInfo オブジェクトは読み取り専用です。

次の例では、次の 3 つの方法を使用して、現在のカルチャの書式設定規則を表す NumberFormatInfo オブジェクトを作成します。 また、各オブジェクトが読み取り専用であることを示すために、 IsReadOnly プロパティの値も取得します。

using System;
using System.Globalization;

public class InstantiateEx1
{
    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

現在のカルチャの規則を表す書き込み可能な NumberFormatInfo オブジェクトは、次のいずれかの方法で作成できます。

次の例は、 NumberFormatInfo オブジェクトをインスタンス化するこれら 2 つの方法を示し、オブジェクトが読み取り専用ではないことを示すために、 IsReadOnly プロパティの値を表示します。

using System;
using System.Globalization;

public class InstantiateEx2
{
    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

Windows オペレーティング システムでは、コントロール パネルの NumberFormatInfo] 項目を使用して、数値の書式設定および解析操作で使用されるプロパティ値の一部をオーバーライドできます。 たとえば、カルチャが英語 (米国) のユーザーは、既定の $1.1 ではなく 1.1 USD として通貨値を表示することを選択できます。 先ほど説明した方法で取得した NumberFormatInfo オブジェクトは、これらのユーザーのオーバーライドのすべてを反映します。 これが望ましくない場合は、NumberFormatInfo コンストラクターを呼び出し、CultureInfo.CultureInfo(String, Boolean)引数に false の値を指定することで、ユーザーのオーバーライドを反映しない (読み取り/書き込みも可能) useUserOverride オブジェクトを作成できます。 次の例では、現在のカルチャが英語 (米国) で、通貨記号が既定の $ から USD に変更されたシステムの図を示します。

using System;
using System.Globalization;

public class InstantiateEx3
{
    public static void Main()
    {
        CultureInfo culture;
        NumberFormatInfo nfi;

        culture = CultureInfo.CurrentCulture;
        nfi = culture.NumberFormat;
        Console.WriteLine($"Culture Name:    {culture.Name}");
        Console.WriteLine($"User Overrides:  {culture.UseUserOverride}");
        Console.WriteLine($"Currency Symbol: {culture.NumberFormat.CurrencySymbol}\n");

        culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
        Console.WriteLine($"Culture Name:    {culture.Name}");
        Console.WriteLine($"User Overrides:  {culture.UseUserOverride}");
        Console.WriteLine($"Currency Symbol: {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: $

CultureInfo.UseUserOverrideプロパティがtrueに設定されている場合、プロパティCultureInfo.DateTimeFormatCultureInfo.NumberFormat、およびCultureInfo.TextInfoもユーザー設定から取得されます。 ユーザー設定が CultureInfo オブジェクトに関連付けられているカルチャと互換性がない場合 (たとえば、選択した予定表が OptionalCalendars プロパティに一覧表示されているカレンダーの 1 つでない場合)、メソッドの結果とプロパティの値は未定義です。

インバリアント カルチャの NumberFormatInfo オブジェクトをインスタンス化する

インバリアント カルチャは、カルチャに依存しないカルチャを表します。 これは英語に基づいていますが、特定の英語を話す国/地域には基づいていません。 特定のカルチャのデータは動的であり、新しいカルチャ規則やユーザー設定を反映するように変更できますが、インバリアント カルチャのデータは変わりません。 インバリアント カルチャの書式設定規則を表す NumberFormatInfo オブジェクトは、結果文字列がカルチャによって異なるべきではない書式設定操作に使用できます。

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

次の例では、これらの各メソッドを使用して、インバリアント カルチャを表す NumberFormatInfo オブジェクトをインスタンス化します。 次に、オブジェクトが読み取り専用かどうかを示します。

using System;
using System.Globalization;

public class InstantiateEx4
{
    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

特定のカルチャの NumberFormatInfo オブジェクトをインスタンス化する

特定のカルチャは、特定の国/地域で話される言語を表します。 たとえば、en-US は米国で話される英語を表す特定のカルチャであり、en-CA はカナダで話される英語を表す特定のカルチャです。 次の方法で、特定のカルチャの書式設定規則を表す NumberFormatInfo オブジェクトをインスタンス化できます。

次の例では、これら 4 つの方法を使用して、インドネシア語 (インドネシア) カルチャの書式設定規則を反映する NumberFormatInfo オブジェクトを作成します。 また、各オブジェクトが読み取り専用かどうかを示します。

using System;
using System.Globalization;

public class InstantiateEx5
{
    public static void Main()
    {
        CultureInfo culture;
        NumberFormatInfo nfi;

        nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat;
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");

        culture = new CultureInfo("id-ID");
        nfi = NumberFormatInfo.GetInstance(culture);
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");

        culture = CultureInfo.CreateSpecificCulture("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");

        culture = new CultureInfo("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");
    }
}
// The example displays the following output:
//       Read-only: True
//       Read-only: False
//       Read-only: False
//       Read-only: False

ニュートラル カルチャの NumberFormatInfo オブジェクトをインスタンス化する

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

ただし、特定の国/地域から独立しているため、ニュートラル カルチャにはカルチャ固有の書式設定情報がありません。 .NET は、 NumberFormatInfo オブジェクトにジェネリック値を設定するのではなく、ニュートラル カルチャの子である特定のカルチャの書式設定規則を反映する NumberFormatInfo オブジェクトを返します。 たとえば、ニュートラルな en カルチャの NumberFormatInfo オブジェクトは en-US カルチャの書式設定規則を反映し、fr カルチャの NumberFormatInfo オブジェクトは fr-FR カルチャの書式設定規則を反映します。

次のようなコードを使用して、各ニュートラル カルチャが表す特定のカルチャの書式設定規則を決定できます。

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

public class InstantiateEx6
{
    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 '{name}' matches '{ci.Name}'");
                hasOneMatch = true;
            }
        }
        if (!hasOneMatch)
            Console.WriteLine($"NumberFormatInfo object for '{name}' --> No Match");

        Console.WriteLine();
    }
}

動的データ

NumberFormatInfo クラスによって提供される数値を書式設定するためのカルチャ固有のデータは、CultureInfo クラスによって提供されるカルチャ データと同様に動的です。 特定の NumberFormatInfo オブジェクトに関連付けられている CultureInfo オブジェクトの値の安定性に関してはどのような仮定も行うべきではありません。 安定しているのは、インバリアント カルチャとそれに関連付けられている NumberFormatInfo オブジェクトによって提供されるデータだけです。 その他のデータは、アプリケーション セッション間、または単一セッション内でも、次の理由で変更される可能性があります。

  • システムの更新 通貨記号や通貨形式などのカルチャの設定は、時間の経過と同時に変化します。 この場合、Windows Update は、特定のカルチャの NumberFormatInfo プロパティ値に変更内容を含めます。

  • 代替文化 CultureAndRegionInfoBuilder クラスを使用して、既存のカルチャのデータを置き換えることができます。

  • プロパティ値に対する連鎖的な変更。 カルチャ関連のプロパティの数は実行時に変更される可能性があり、その結果、 NumberFormatInfo データが変更されます。 たとえば、現在のカルチャは、プログラムまたはユーザー アクションを使用して変更できます。 この場合、NumberFormatInfo プロパティによって返されるCurrentInfo オブジェクトは、現在のカルチャに関連付けられているオブジェクトに変更されます。

  • ユーザー設定。 アプリケーションのユーザーは、コントロール パネルの領域と言語オプションを使用して、現在のシステム カルチャに関連付けられている値の一部をオーバーライドする場合があります。 たとえば、ユーザーは別の通貨記号または別の小数点記号を選択できます。 CultureInfo.UseUserOverride プロパティが true (既定値) に設定されている場合、NumberFormatInfo オブジェクトのプロパティもユーザー設定から取得されます。

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 には、数値を書式設定するための 2 つの IFormatProvider 実装が用意されています。

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

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

using System;
using System.Globalization;

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

public class FormatProviderEx
{
    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

数値書式指定メソッドの呼び出しで IFormatProvider 実装が明示的に指定されていない場合、メソッドは CultureInfo.CurrentCulture.GetFormat メソッドを呼び出します。このメソッドは、現在のカルチャに対応する NumberFormatInfo オブジェクトを返します。

書式指定文字列と NumberFormatInfo プロパティ

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

using System;
using System.Globalization;

public class PropertiesEx1
{
    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

それ以外の場合、書式指定文字列の使用は暗黙的です。 たとえば、次のメソッドでは、既定のメソッドまたはパラメーターなしの Decimal.ToString() メソッドを呼び出します。 Decimal インスタンスの値は、一般 ("G") 書式指定子と現在のカルチャの規則を使用して書式設定されます。この場合は、en-US カルチャです。

using System;

public class PropertiesEx2
{
    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

各標準数値書式指定文字列は、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 進数書式指定子) None.
"."(小数点のカスタム書式指定子) NumberDecimalSeparator (小数点の記号を定義します)。
"," (グループ区切り記号カスタム書式指定子) NumberGroupSeparator: グループ (千) 区切り記号を定義します。
"%" (パーセンテージ プレースホルダーカスタム書式指定子) PercentSymbolをクリックしてパーセント記号を定義します。
"‰" (ミル単位のプレースホルダーカスタム書式指定子) PerMilleSymbolをクリックして、ミル単位のシンボルを定義します。
"E" (指数表記カスタム書式指定子) NegativeSign (仮数と指数に負の符号記号を定義します)。

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

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

NumberFormatInfo プロパティの変更

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

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

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

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

Note

アプリケーションが開始されるたびにカルチャのプロパティ値を動的に変更する代わりに、 CultureAndRegionInfoBuilder クラスを使用して、カスタム カルチャ (一意の名前を持ち、既存のカルチャを補完するカルチャ) または置換カルチャ (特定のカルチャではなく使用されるカルチャ) を定義できます。

次のセクションでは、いくつかの例を示します。

通貨記号とパターンを変更する

次の例では、en-US カルチャの書式設定規則を表す NumberFormatInfo オブジェクトを変更します。 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

国の識別番号を書式設定する

多くの国民識別番号は数字のみで構成されるため、 NumberFormatInfo オブジェクトのプロパティを変更することで簡単に書式設定できます。 たとえば、米国の社会保障番号は、次のように 9 桁で構成されます: XXX-XX-XXXX。 次の例では、社会保障番号が整数値として格納され、適切に書式設定されることを前提としています。

using System;
using System.Globalization;

public class CustomizeSSNEx
{
    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

数値文字列の解析

解析には、数値の文字列形式を数値に変換する必要があります。 .NET の各数値型には、 ParseTryParseの 2 つのオーバーロードされた解析メソッドが含まれています。 Parse メソッドは、文字列を数値に変換し、変換が失敗した場合に例外をスローします。 TryParse メソッドは、文字列を数値に変換し、その数値をout引数に割り当て、変換が成功したかどうかを示すBoolean値を返します。

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

また、解析メソッドは、解析する文字列内に現れる可能性のある特定の記号とパターンを定義する 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 ParseEx1
{
    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($"'{value}' --> {amount} ({name})");
                }
                catch (FormatException)
                {
                    Console.WriteLine($"'{value}': FormatException ({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)

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

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

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

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

ユーザー文字列を解析する

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

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

using System;
using System.Globalization;

public class ParseUserEx
{
    public static void Main()
    {
        CultureInfo stdCulture = CultureInfo.GetCultureInfo("en-US");
        CultureInfo custCulture = CultureInfo.CreateSpecificCulture("en-US");

        String value = "310,16";
        try
        {
            Console.WriteLine($"{stdCulture.Name} culture reflects user overrides: {stdCulture.UseUserOverride}");
            Decimal amount = Decimal.Parse(value, stdCulture);
            Console.WriteLine($"'{value}' --> {amount.ToString(CultureInfo.InvariantCulture)}");
        }
        catch (FormatException)
        {
            Console.WriteLine($"Unable to parse '{value}'");
        }
        Console.WriteLine();

        try
        {
            Console.WriteLine($"{custCulture.Name} culture reflects user overrides: {custCulture.UseUserOverride}");
            Decimal amount = Decimal.Parse(value, custCulture);
            Console.WriteLine($"'{value}' --> {amount.ToString(CultureInfo.InvariantCulture)}");
        }
        catch (FormatException)
        {
            Console.WriteLine($"Unable to parse '{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

数値データのシリアル化と逆シリアル化

数値データを文字列形式でシリアル化し、後で逆シリアル化して解析する場合は、インバリアント カルチャの規則を使用して文字列を生成および解析する必要があります。 書式設定と解析の操作では、特定のカルチャの規則を反映しないでください。 カルチャ固有の設定を使用する場合、データの移植性は厳密に制限されます。カルチャ固有の設定がシリアル化されたスレッドと同じスレッドでのみ、正常に逆シリアル化できます。 場合によっては、シリアル化されたのと同じシステムでデータを正常に逆シリアル化できない場合もあります。

次の例は、この原則に違反した場合に何が起こるかを示しています。 現在のスレッドが en-US カルチャのカルチャ固有の設定を使用すると、配列内の浮動小数点値が文字列に変換されます。 その後、データは、pt-BR カルチャのカルチャ固有の設定を使用するスレッドによって解析されます。 この場合、各解析操作は成功しますが、データのラウンド トリップは成功せず、データの破損が発生します。 それ以外の場合は、解析処理に失敗し、FormatException の例外がスローされる可能性があります。

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

public class ParsePersistedEx
{
    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

Example

  The following example shows how to retrieve a <xref:System.Globalization.NumberFormatInfo> object for a corresponding <xref:System.Globalization.CultureInfo> object, and use the retrieved object to query number formatting information for the particular culture.

  :::code language="csharp" source="~/snippets/csharp/System.Globalization/NumberFormatInfo/Overview/NumberFormatInfo.cs" id="Snippet1":::
  :::code language="vb" source="~/snippets/visualbasic/System.Globalization/NumberFormatInfo/Overview/numberformatinfo.vb" id="Snippet1":::

コンストラクター

名前 説明
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

10 進数の左側にある数字のグループを数値で区切る文字列を取得または設定します。

NumberGroupSizes

数値の 10 進数の左側にある各グループの桁数を取得または設定します。

NumberNegativePattern

負の数値の書式パターンを取得または設定します。

PercentDecimalDigits

パーセント値で使用する小数点以下の桁数を取得または設定します。

PercentDecimalSeparator

パーセント値の小数点区切り記号として使用する文字列を取得または設定します。

PercentGroupSeparator

小数点の左にある数字のグループをパーセント値で区切る文字列を取得または設定します。

PercentGroupSizes

10 進数の左にある各グループの桁数をパーセント値で取得または設定します。

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)

適用対象

こちらもご覧ください