2010-11-06T11:47:47の更新内容

programming/netfx/locale/0_abstract/index.wiki.txt

current previous
1,1251 0,0
+
${smdncms:title,カルチャの基本とカルチャ情報}
+
${smdncms:header_title,カルチャの基本とカルチャ情報 (CultureInfo)}
+
${smdncms:keywords,CultureInfo,RegionInfo,CurrentCulture,CurrentUICulture,InvariantCulture}
+
${smdncms:meta,toc-amazonlivelink-keyword,books-jp,.net framework}
+

          
+
#navi(..)
+

          
+
まずは、.NET Frameworkにおけるカルチャの概要と、カルチャ情報の取得について見ていきます。
+

          
+
----
+

          
+
*.NET Frameworkにおけるカルチャ
+
.NET Frameworkではスレッド毎にカルチャが関連付けられます。 スレッドに関連付けられるカルチャは二種類あり、一つは書式や暦を処理するために使われるカルチャと、もう一つはユーザーインターフェイスの表示やローカライズされたリソースの参照に使われるカルチャです。
+

          
+
スレッドに関連付けられるカルチャを表すクラスが&msdn(netfx,type,System.Globalization.CultureInfo){CultureInfoクラス};で、このクラスは特定のカルチャにおける書式や暦などの情報、カルチャの名称や言語コードなどの情報を参照するためのプロパティを持っています。
+

          
+
**カルチャとスレッド
+
現在スレッドに関連付けられているカルチャを取得するには、&msdn(netfx,member,System.Globalization.CultureInfo.CurrentCulture){CultureInfo.CurrentCultureプロパティ};を参照します。 ユーザーインターフェイスのカルチャを参照するには&msdn(netfx,member,System.Globalization.CultureInfo.CurrentUICulture){CultureInfo.CurrentUICultureプロパティ};を参照します。
+

          
+
これらは&msdn(netfx,type,System.Threading.Thread){Threadクラス};からも参照でき、それぞれ&msdn(netfx,member,System.Threading.Thread.CurrentCulture){Thread.CurrentThread.CurrentCultureプロパティ};と&msdn(netfx,member,System.Threading.Thread.CurrentUICulture){Thraed.CurrentThread.CurrentUICultureプロパティ};を参照することで取得できます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.WriteLine("[CultureInfo]");
+
    Console.WriteLine("CurrentCulture:   {0}", CultureInfo.CurrentCulture);
+
    Console.WriteLine("CurrentUICulture: {0}", CultureInfo.CurrentUICulture);
+

          
+
    Console.WriteLine("[Thread.CurrentThread]");
+
    Console.WriteLine("CurrentCulture:   {0}", Thread.CurrentThread.CurrentCulture);
+
    Console.WriteLine("CurrentUICulture: {0}", Thread.CurrentThread.CurrentUICulture);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("[CultureInfo]")
+
    Console.WriteLine("CurrentCulture:   {0}", CultureInfo.CurrentCulture)
+
    Console.WriteLine("CurrentUICulture: {0}", CultureInfo.CurrentUICulture)
+

          
+
    Console.WriteLine("[Thread.CurrentThread]")
+
    Console.WriteLine("CurrentCulture:   {0}", Thread.CurrentThread.CurrentCulture)
+
    Console.WriteLine("CurrentUICulture: {0}", Thread.CurrentThread.CurrentUICulture)
+
  End SUb
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
[CultureInfo]
+
CurrentCulture:   ja-JP
+
CurrentUICulture: ja-JP
+
[Thread.CurrentThread]
+
CurrentCulture:   ja-JP
+
CurrentUICulture: ja-JP
+
}}
+

          
+
デフォルトでは、スレッドのカルチャにはシステムのロケールに該当するカルチャが設定されていますが、任意の時点で変更することが出来ます。
+

          
+
スレッドのカルチャを変更するには、設定したいカルチャのCultureInfoを取得もしくは作成し、Thread.CurrentCultureプロパティに設定します。 現在のスレッドのカルチャを変更するにはThread.CurrentThread.CurrentCultureプロパティを設定します。
+

          
+
なお、CultureInfo.CurrenCultureプロパティは読み取り専用なのでこのプロパティを使って変更する事は出来ませんが、Thread.CurrentThread.CurrentCultureプロパティを設定するとこのプロパティにも反映されます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture);
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+
    Console.WriteLine();
+

          
+
    // 現在のスレッドのカルチャをen-US(英語/アメリカ合衆国)に変更
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+

          
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture);
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+
    Console.WriteLine();
+

          
+
    // 現在のスレッドのカルチャをde-DE(ドイツ語/ドイツ)に変更
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
+

          
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture);
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture)
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+
    Console.WriteLine()
+

          
+
    ' 現在のスレッドのカルチャをen-US(英語/アメリカ合衆国)に変更
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
+

          
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture)
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+
    Console.WriteLine()
+

          
+
    ' 現在のスレッドのカルチャをde-DE(ドイツ語/ドイツ)に変更
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("de-DE")
+

          
+
    Console.WriteLine("CultureInfo.CurrentCulture:          {0}", CultureInfo.CurrentCulture)
+
    Console.WriteLine("Thread.CurrentThread.CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
CultureInfo.CurrentCulture:          ja-JP
+
Thread.CurrentThread.CurrentCulture: ja-JP
+

          
+
CultureInfo.CurrentCulture:          en-US
+
Thread.CurrentThread.CurrentCulture: en-US
+

          
+
CultureInfo.CurrentCulture:          de-DE
+
Thread.CurrentThread.CurrentCulture: de-DE
+

          
+
}}
+

          
+
**カルチャと書式・テキスト処理
+
いくつかのクラスやメソッドでは、カルチャよって異なる結果を返すものがあります。 一つの例として、&msdn(netfx,member,System.DateTime.ToString){DateTime.ToStringメソッド};は、書式を指定しなかった場合は現在のカルチャに設定されている書式に従って文字列化します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6);
+

          
+
    // デフォルトのカルチャ(ja-JP)で日時を文字列化
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
+

          
+
    // en-US(英語/アメリカ合衆国)のカルチャで日時を文字列化
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+

          
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
+

          
+
    // de-DE(ドイツ語/ドイツ)のカルチャで日時を文字列化
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
+

          
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim dateTime As New DateTime(2000, 1, 23, 4, 5, 6)
+

          
+
    ' デフォルトのカルチャ(ja-JP)で日時を文字列化
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString())
+

          
+
    ' en-US(英語/アメリカ合衆国)のカルチャで日時を文字列化
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
+

          
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString())
+

          
+
    ' de-DE(ドイツ語/ドイツ)のカルチャで日時を文字列化
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("de-DE")
+

          
+
    Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString())
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
ja-JP: 2000/01/23 4:05:06
+
en-US: 1/23/2000 4:05:06 AM
+
de-DE: 23.01.2000 04:05:06
+
}}
+

          
+
カルチャによって結果が異なる例は他にもあります。 例えば、文字列の比較や大文字小文字の変換など、特に文字列からの/への変換では現在のカルチャに依存した結果を返すものが多く存在します。 この点については[[programming/netfx/locale/1_infoes]]で詳しく解説します。
+

          
+
カルチャによって結果が変わることが問題となる場合は、明示的に書式やカルチャを指定するか、[[インバリアントカルチャ(後述)>#invariant_culture]]を使用することが出来ます。 カルチャを考慮した文字列操作については、[[programming/netfx/string/2_comparison]]でも詳しく解説しているのでご覧ください。
+

          
+
**&aname(invariant_culture){インバリアントカルチャ};
+
前述したとおり、CultureInfoには特定の言語や国・地域で用いられる書式や文字列比較の規則などが設定されていますが、それとは別に''インバリアントカルチャ''と呼ばれる特定の言語や国・地域に依存しない特別なカルチャが用意されています。 インバリアントカルチャには英語圏で使われるものを基本とする書式・規則が設定されていて、特定のカルチャに依存しない形式への変換や比較を行いたい場合に使用します。 &msdn(netfx,member,System.Globalization.CultureInfo.InvariantCulture){CultureInfo.InvariantCultureプロパティ};を参照することでインバリアントカルチャを表すCultureInfoを取得することが出来ます。
+

          
+
インバリアントカルチャが有効に機能する一つの例を見てみます。 StreamWriterを使ってDouble型のデータをファイルに保存することを考えます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+

          
+
    double number = 1234.5678;
+

          
+
    using (StreamWriter writer = new StreamWriter("config.txt"))
+
    {
+
      writer.WriteLine(number);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+

          
+
    Dim number As Double = 1234.5678D
+

          
+
    Using writer As New StreamWriter("config.txt")
+
      writer.WriteLine(number)
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
上記のコードをja-JP(日本語/日本)の環境で実行すると、次のような内容が書き込まれるはずです。
+

          
+
#prompt(config.txt){{
+
1234.5678
+
}}
+

          
+
次に、このファイルを読み込んでみます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    // Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
+

          
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+

          
+
    double number;
+

          
+
    using (StreamReader reader = new StreamReader("config.txt"))
+
    {
+
      number = double.Parse(reader.ReadLine());
+
    }
+

          
+
    Console.WriteLine("loaded value : {0}", number);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR")
+

          
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+

          
+
    Dim number As Double
+

          
+
    Using reader As New StreamReader("config.txt")
+
      number = Double.Parse(reader.ReadLine())
+
    End Using
+

          
+
    Console.WriteLine("loaded value : {0}", number)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
このコードをfr-FR(フランス語/フランス)の環境で実行するか、コメントアウトしてある部分を有効にして実行すると次のように例外がスローされます。
+

          
+
#prompt{{
+
CurrentCulture: fr-FR
+

          
+
ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。
+
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
+
   場所 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
+
   場所 System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
+
   場所 Sample.Main()
+
}}
+

          
+
これは、fr-FRの環境では小数点区切りには ''.'' (ピリオド)ではなく '','' (カンマ)が用いられるためで、これによりDouble型の値としては不正な形式の文字列とみなされるためです。
+

          
+
もちろん、保存と読み込みを同じカルチャで実行すれば問題とはなりません。 しかし、異なるカルチャで実行した場合に結果が変わることが問題となる場合には、インバリアントカルチャを使うことでこのような問題が発生することを避けることが出来ます。
+

          
+
次のコードは、先のコードをインバリアントカルチャを使って保存・読み込みするように書き換えたものです。 この例では、インバリアントカルチャを書式プロバイダとして使用しています。 この点については[[programming/netfx/locale/1_infoes]]で詳しく解説します。
+

          
+
#tabpage(C#)
+
#code(cs,保存用のコード){{
+
using System;
+
using System.Globalization;
+
using System.IO;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+

          
+
    double number = 1234.5678;
+

          
+
    using (StreamWriter writer = new StreamWriter("config.txt"))
+
    {
+
      writer.WriteLine(number.ToString(CultureInfo.InvariantCulture));
+
    }
+
  }
+
}
+
}}
+
#code(cs,読み込み用のコード){{
+
using System;
+
using System.Globalization;
+
using System.IO;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture);
+

          
+
    double number;
+

          
+
    using (StreamReader reader = new StreamReader("config.txt"))
+
    {
+
      number = double.Parse(reader.ReadLine(), CultureInfo.InvariantCulture);
+
    }
+

          
+
    Console.WriteLine("loaded value : {0}", number);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,保存用のコード){{
+
Imports System
+
Imports System.Globalization
+
Imports System.IO
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+

          
+
    Dim number As Double = 1234.5678D
+

          
+
    Using writer As New StreamWriter("config.txt")
+
      writer.WriteLine(number.ToString(CultureInfo.InvariantCulture))
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#code(vb,読み込み用のコード){{
+
Imports System
+
Imports System.Globalization
+
Imports System.IO
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("CurrentCulture: {0}", Thread.CurrentThread.CurrentCulture)
+

          
+
    Dim number As Double
+

          
+
    Using reader As New StreamReader("config.txt")
+
      number = Double.Parse(reader.ReadLine(), CultureInfo.InvariantCulture)
+
    End Using
+

          
+
    Console.WriteLine("loaded value : {0}", number)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
なお、CultureInfo.InvariantCultureを使用しなくても、文字列関連のクラスではStringComparison.InvariantCultureやString.ToLowerInvariant、String.CompareInvariantなどを使うことでインバリアントカルチャの規則を使って処理を行うことができるようになっています。
+

          
+
*カルチャ情報の取得 (CultureInfo)
+
**カルチャに固有な情報の取得
+
CultureInfoクラスのプロパティを参照することで、カルチャに固有な情報を取得することが出来ます。 ロケールの固有なIDである&msdn(netfx,member,System.Globalization.CultureInfo.LCID){LCID};を始め、ISO 639-2形式の言語コードISOを取得する&msdn(netfx,member,System.Globalization.CultureInfo.TwoLetterISOLanguageName){TwoLetterISOLanguageName};、&msdn(netfx,member,System.Globalization.CultureInfo.ThreeLetterISOLanguageName){ThreeLetterISOLanguageName};などのプロパティがあります。
+

          
+
カルチャの名称は、カルチャの言語コード+国・地域コードの形式で取得する&msdn(netfx,member,System.Globalization.CultureInfo.Name){Name};、英語表記で取得する&msdn(netfx,member,System.Globalization.CultureInfo.EnglishName){EnglishName};、カルチャが表す言語で取得する&msdn(netfx,member,System.Globalization.CultureInfo.NativeName){NativeName};、ローカライズされた(システムの)言語で取得する&msdn(netfx,member,System.Globalization.CultureInfo.NativeName){NativeName};などのプロパティを使って取得出来ます。
+

          
+
その他、カルチャに固有な書式や変換・比較の規則は以下のプロパティで取得することが出来ます。 これらのプロパティについては[[programming/netfx/locale/1_infoes]]で詳しく解説します。
+
-&msdn(netfx,member,System.Globalization.CultureInfo.Calendar){Calendar};
+
-&msdn(netfx,member,System.Globalization.CultureInfo.CompareInfo){CompareInfo};
+
-&msdn(netfx,member,System.Globalization.CultureInfo.DateTimeFormat){DateTimeFormat};
+
-&msdn(netfx,member,System.Globalization.CultureInfo.NumberFormat){NumberFormat};
+
-&msdn(netfx,member,System.Globalization.CultureInfo.TextInfo){TextInfo};
+

          
+
以下は、CultureInfoで取得できる情報のいくつかを表示したものです。
+

          
+
#prompt{{
+
|LCID  |Name    |EnglishName                             |ISO2 |ISO3 |DisplayName                   |NativeName
+
------------------------------------------------------------------------------------------------------------------------
+
|1041  |ja-JP   |Japanese (Japan)                        |ja   |jpn  |日本語 (日本)                      |日本語 (日本)
+
|1033  |en-US   |English (United States)                 |en   |eng  |英語 (米国)                       |English (United States)
+
|2057  |en-GB   |English (United Kingdom)                |en   |eng  |英語 (英国)                       |English (United Kingdom)
+
|1031  |de-DE   |German (Germany)                        |de   |deu  |ドイツ語 (ドイツ)                    |Deutsch (Deutschland)
+
|3082  |es-ES   |Spanish (Spain)                         |es   |spa  |スペイン語 (スペイン)                  |español (España)
+
|1036  |fr-FR   |French (France)                         |fr   |fra  |フランス語 (フランス)                  |français (France)
+
|1028  |zh-TW   |Chinese (Taiwan)                        |zh   |zho  |中国語 (台湾)                      |中文(台灣)
+
|2052  |zh-CN   |Chinese (People's Republic of China)    |zh   |zho  |中国語 (中華人民共和国)                 |中文(中华人民共和国)
+
|14337 |ar-AE   |Arabic (U.A.E.)                         |ar   |ara  |アラビア語 (アラブ首長国連邦)              |العربية (الإمارات العربية المتحدة)
+

          
+
|EnglishName                             |Calendar                      |ANSICodePage          |LongDatePattern               |CurrencySymbol
+
--------------------------------------------------------------------------------------------------------------------------------------------
+
|Japanese (Japan)                        |GregorianCalendar             |932    (shift_jis    )|yyyy'年'M'月'd'日'               |¥
+
|English (United States)                 |GregorianCalendar             |1252   (Windows-1252 )|dddd, MMMM dd, yyyy           |$
+
|English (United Kingdom)                |GregorianCalendar             |1252   (Windows-1252 )|dd MMMM yyyy                  |£
+
|German (Germany)                        |GregorianCalendar             |1252   (Windows-1252 )|dddd, d. MMMM yyyy            |€
+
|Spanish (Spain)                         |GregorianCalendar             |1252   (Windows-1252 )|dddd, dd' de 'MMMM' de 'yyyy  |€
+
|French (France)                         |GregorianCalendar             |1252   (Windows-1252 )|dddd d MMMM yyyy              |€
+
|Chinese (Taiwan)                        |GregorianCalendar             |950    (big5         )|yyyy'年'M'月'd'日'               |NT$
+
|Chinese (People's Republic of China)    |GregorianCalendar             |936    (gb2312       )|yyyy'年'M'月'd'日'               |¥
+
|Arabic (U.A.E.)                         |GregorianCalendar             |1256   (windows-1256 )|dd MMMM, yyyy                 |د.إ.‏
+
}}
+

          
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Text;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.OutputEncoding = Encoding.UTF8;
+

          
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      new CultureInfo("ja-JP"),
+
      new CultureInfo("en-US"),
+
      new CultureInfo("en-GB"),
+
      new CultureInfo("de-DE"),
+
      new CultureInfo("es-ES"),
+
      new CultureInfo("fr-FR"),
+
      new CultureInfo("zh-TW"),
+
      new CultureInfo("zh-CN"),
+
      new CultureInfo("ar-AE"),
+
    };
+

          
+
    Console.WriteLine("|{0,-6}|{1,-8}|{2,-40}|{3,-5}|{4,-5}|{5,-30}|{6}",
+
                      "LCID",
+
                      "Name",
+
                      "EnglishName",
+
                      "ISO2",
+
                      "ISO3",
+
                      "DisplayName",
+
                      "NativeName");
+

          
+
    Console.WriteLine(new string('-', 120));
+

          
+
    foreach (CultureInfo c in cultures)
+
    {
+
      Console.WriteLine("|{0,-6:D}|{1,-8}|{2,-40}|{3,-5}|{4,-5}|{5,-30}|{6}",
+
                        c.LCID,
+
                        c.Name,
+
                        c.EnglishName,
+
                        c.TwoLetterISOLanguageName,
+
                        c.ThreeLetterISOLanguageName,
+
                        c.DisplayName,
+
                        c.NativeName);
+
    }
+

          
+
    Console.WriteLine();
+

          
+
    Console.WriteLine("|{0,-40}|{1,-30}|{2,-22}|{3,-30}|{4}",
+
                      "EnglishName",
+
                      "Calendar",
+
                      "ANSICodePage",
+
                      "LongDatePattern",
+
                      "CurrencySymbol");
+

          
+
    Console.WriteLine(new string('-', 140));
+

          
+
    foreach (CultureInfo c in cultures)
+
    {
+
      Console.WriteLine("|{0,-40}|{1,-30}|{2,-6} ({3,-13})|{4,-30}|{5}",
+
                        c.EnglishName,
+
                        c.Calendar.GetType().Name,
+
                        c.TextInfo.ANSICodePage,
+
                        Encoding.GetEncoding(c.TextInfo.ANSICodePage).WebName,
+
                        c.DateTimeFormat.LongDatePattern,
+
                        c.NumberFormat.CurrencySymbol);
+
    }
+
  }
+
}
+
}}
+

          
+
**言語と国・地域を指定したカルチャの取得
+
コンストラクタでカルチャの名前やIDを指定することで、それに該当するカルチャのCultureInfoを作成することが出来ます。 &msdn(netfx,member,System.Globalization.CultureInfo.CreateSpecificCulture){CreateSpecificCultureメソッド};も同様に名前を使ってCultureInfoを作成することが出来ます。 このようにして作成したCultureInfoは、DateTimeFormatやNumberFormatを変更して書式などをカスタマイズすることが出来ます。
+

          
+
一方、&msdn(netfx,member,System.Globalization.CultureInfo.GetCultureInfo){GetCultureInfoメソッド};も同様に名前やIDを使ってCultureInfoを取得することが出来ますが、このメソッドは読み取り専用のインスタンスを返すため、変更する事は出来ません。 また、キャッシュされた情報を元に作成するため、コンストラクタを使う場合よりもパフォーマンスに優れています。
+

          
+
また、国や地域に依存せず、言語のみに依存するカルチャ(''ニュートラルカルチャ'')を取得するには"ja"や"en"などの言語コードのみを指定します。 ニュートラルカルチャの場合は、DateTimeFormatやNumberFormatを取得したり、書式プロバイダとして使用することは出来ません。 ニュートラルカルチャかどうか調べるには、&msdn(netfx,member,System.Globalization.CultureInfo.IsNeutralCulture){IsNeutralCultureプロパティ};を参照します。 なお、Thread.CurrentUICultureにはニュートラルカルチャを指定することが出来ますがThread.CurrentCultureには指定することは出来ません。
+

          
+
以下の例では、いくつかのカルチャとニュートラルカルチャを取得し、プロパティの内容を表示しています。 また、ニュートラルカルチャでない場合は、カルチャ固有の書式を使ってDateTimeとDecimalの値を書式化しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Text;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.OutputEncoding = Encoding.UTF8;
+

          
+
    string[] codes = new string[] {
+
      "en", "en-US", "en-GB", "en-AU",
+
      "de", "de-DE", "de-AT", "de-CH",
+
      "ja", "ja-JP",
+
      "zh-Hans", "zh-Hant", "zh-TW", "zh-CN", "zh-HK",
+
    };
+

          
+
    DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6, DateTimeKind.Utc);
+
    decimal number = 1234.5678m;
+

          
+
    Console.WriteLine("|{0,-6}|{1,-8}|{2,-40}|{3,-8}|{4,-40}|{5}",
+
                      "LCID",
+
                      "Name",
+
                      "EnglishName",
+
                      "neutral",
+
                      "DateTime",
+
                      "Currency");
+

          
+
    Console.WriteLine(new string('-', 120));
+

          
+
    foreach (string code in codes)
+
    {
+
      CultureInfo c = CultureInfo.GetCultureInfo(code);
+

          
+
      Console.WriteLine("|{0,-6:D}|{1,-8}|{2,-40}|{3,-8}|{4,-40}|{5}",
+
                        c.LCID,
+
                        c.Name,
+
                        c.EnglishName,
+
                        c.IsNeutralCulture,
+
                        c.IsNeutralCulture ? string.Empty : dateTime.ToString("U", c),
+
                        c.IsNeutralCulture ? string.Empty : number.ToString("C", c));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.OutputEncoding = Encoding.UTF8
+

          
+
    Dim codes() As String = New String() { _
+
      "en", "en-US", "en-GB", "en-AU", _
+
      "de", "de-DE", "de-AT", "de-CH", _
+
      "ja", "ja-JP", _
+
      "zh-Hans", "zh-Hant", "zh-TW", "zh-CN", "zh-HK" _
+
    }
+

          
+
    Dim dateTime As New DateTime(2000, 1, 23, 4, 5, 6, DateTimeKind.Utc)
+
    Dim number As Decimal = 1234.5678D
+

          
+
    Console.WriteLine("|{0,-6}|{1,-8}|{2,-40}|{3,-8}|{4,-40}|{5}", _
+
                      "LCID", _
+
                      "Name", _
+
                      "EnglishName", _
+
                      "neutral", _
+
                      "DateTime", _
+
                      "Currency")
+

          
+
    Console.WriteLine(New String("-"c, 120))
+

          
+
    For Each code As String In codes
+
      Dim c As CultureInfo = CultureInfo.GetCultureInfo(code)
+

          
+
      Console.WriteLine("|{0,-6:D}|{1,-8}|{2,-40}|{3,-8}|{4,-40}|{5}", _
+
                        c.LCID, _
+
                        c.Name, _
+
                        c.EnglishName, _
+
                        c.IsNeutralCulture, _
+
                        If (c.IsNeutralCulture, String.Empty, dateTime.ToString("U", c)), _
+
                        If (c.IsNeutralCulture, string.Empty, number.ToString("C", c)))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
|LCID  |Name    |EnglishName                             |neutral |DateTime                                |Currency
+
------------------------------------------------------------------------------------------------------------------------
+
|9     |en      |English                                 |True    |                                        |
+
|1033  |en-US   |English (United States)                 |False   |Sunday, January 23, 2000 4:05:06 AM     |$1,234.57
+
|2057  |en-GB   |English (United Kingdom)                |False   |23 January 2000 04:05:06                |£1,234.57
+
|3081  |en-AU   |English (Australia)                     |False   |Sunday, 23 January 2000 4:05:06 AM      |$1,234.57
+
|7     |de      |German                                  |True    |                                        |
+
|1031  |de-DE   |German (Germany)                        |False   |Sonntag, 23. Januar 2000 04:05:06       |1.234,57 €
+
|3079  |de-AT   |German (Austria)                        |False   |Sonntag, 23. Jänner 2000 04:05:06       |€ 1.234,57
+
|2055  |de-CH   |German (Switzerland)                    |False   |Sonntag, 23. Januar 2000 04:05:06       |SFr. 1'234.57
+
|17    |ja      |Japanese                                |True    |                                        |
+
|1041  |ja-JP   |Japanese (Japan)                        |False   |2000年1月23日 4:05:06                      |¥1,235
+
|4     |zh-Hans |Chinese (Simplified)                    |True    |                                        |
+
|31748 |zh-Hant |Chinese (Traditional)                   |True    |                                        |
+
|1028  |zh-TW   |Chinese (Taiwan)                        |False   |2000年1月23日 上午 04:05:06                  |NT$1,234.57
+
|2052  |zh-CN   |Chinese (People's Republic of China)    |False   |2000年1月23日 4:05:06                      |¥1,234.57
+
|3076  |zh-HK   |Chinese (Hong Kong S.A.R.)              |False   |Sunday, 23 January, 2000 4:05:06        |HK$1,234.57
+
}}
+

          
+
**種類を指定したカルチャの取得
+
&msdn(netfx,member,System.Globalization.CultureInfo.GetCultures){GetCulturesメソッド};を使うと、サポートされているカルチャを取得することが出来ます。 取得の際に、&msdn(netfx,type,System.Globalization.CultureTypes){CultureTypes列挙型};で取得するカルチャの種類を指定することが出来ます。 種類には以下の値を組み合わせて指定出来ます。
+

          
+
|*CultureTypes列挙型で指定できる主なカルチャの種類
+
|~値|~取得する種類|h
+
|NeutralCultures|国・地域に固有でない(ニュートラルな)カルチャ。 インバリアントカルチャも含みます。|
+
|SpecificCultures|国・地域に固有なカルチャ。|
+
|UserCustomCulture|ユーザが作成したカルチャ。|
+
|InstalledWin32Cultures|インストールされているすべてのカルチャ。&br;(.NET Frameworkでサポートされるカルチャのうち、システムにインストールされていないものは使用出来ません)|
+
|AllCultures|上記のすべてのカルチャ。|
+

          
+
以下はGetCulturesメソッドを使ってニュートラルカルチャと国・地域に固有なカルチャを取得し、一覧で表示する例です。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections.Generic;
+
using System.Globalization;
+
using System.Text;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Console.OutputEncoding = Encoding.UTF8;
+

          
+
    Console.WriteLine(Environment.Version);
+
    Console.WriteLine(Environment.OSVersion);
+

          
+
    List<CultureInfo> cultures = new List<CultureInfo>();
+

          
+
    // CultureTypes.SpecificCulturesとCultureTypes.NeutralCulturesに該当するカルチャを取得
+
    cultures.AddRange(CultureInfo.GetCultures(CultureTypes.SpecificCultures | CultureTypes.NeutralCultures));
+

          
+
    // CultureInfo.Nameでソート
+
    cultures.Sort(delegate(CultureInfo x, CultureInfo y) {
+
      return StringComparer.Ordinal.Compare(x.Name, y.Name);
+
    });
+

          
+
    Console.WriteLine("|{0,-6}|{1,-10}|{2,-8}|{3,-45}|{4}",
+
                      "LCID",
+
                      "Name",
+
                      "neutral",
+
                      "EnglishName",
+
                      "NativeName");
+

          
+
    Console.WriteLine(new string('-', 120));
+

          
+
    foreach (CultureInfo c in cultures)
+
    {
+
      Console.WriteLine("|{0,-6:D}|{1,-10}|{2,-8}|{3,-45}|{4}",
+
                        c.LCID,
+
                        c.Name,
+
                        c.IsNeutralCulture ? "neutral" : string.Empty,
+
                        c.EnglishName,
+
                        c.NativeName);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+
Imports System.Globalization
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.OutputEncoding = Encoding.UTF8
+

          
+
    Console.WriteLine(Environment.Version)
+
    Console.WriteLine(Environment.OSVersion)
+

          
+
    Dim cultures As New List(Of CultureInfo)
+

          
+
    ' CultureTypes.SpecificCulturesとCultureTypes.NeutralCulturesに該当するカルチャを取得
+
    cultures.AddRange(CultureInfo.GetCultures(CultureTypes.SpecificCultures Or CultureTypes.NeutralCultures))
+

          
+
    ' CultureInfo.Nameでソート
+
    cultures.Sort(Function (x As CultureInfo, y As CultureInfo)
+
      Return StringComparer.Ordinal.Compare(x.Name, y.Name)
+
    End Function)
+

          
+
    Console.WriteLine("|{0,-6}|{1,-10}|{2,-8}|{3,-45}|{4}", _
+
                      "LCID", _
+
                      "Name", _
+
                      "neutral", _
+
                      "EnglishName", _
+
                      "NativeName")
+

          
+
    Console.WriteLine(New String("-"c, 120))
+

          
+
    For Each c As CultureInfo In cultures
+
      Console.WriteLine("|{0,-6:D}|{1,-10}|{2,-8}|{3,-45}|{4}", _
+
                        c.LCID, _
+
                        c.Name, _
+
                        If (c.IsNeutralCulture, "neutral", String.Empty), _
+
                        c.EnglishName, _
+
                        c.NativeName)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
4.0.30319.1
+
Microsoft Windows NT 5.1.2600 Service Pack 3
+
|LCID  |Name      |neutral |EnglishName                                  |NativeName
+
------------------------------------------------------------------------------------------------------------------------
+
|127   |          |        |Invariant Language (Invariant Country)       |Invariant Language (Invariant Country)
+
|54    |af        |neutral |Afrikaans                                    |Afrikaans
+
|1078  |af-ZA     |        |Afrikaans (South Africa)                     |Afrikaans (Suid Afrika)
+
|94    |am        |neutral |Amharic                                      |አማርኛ
+
|1118  |am-ET     |        |Amharic (Ethiopia)                           |አማርኛ (ኢትዮጵያ)
+
|1     |ar        |neutral |Arabic                                       |العربية
+
|14337 |ar-AE     |        |Arabic (U.A.E.)                              |العربية (الإمارات العربية المتحدة)
+
|15361 |ar-BH     |        |Arabic (Bahrain)                             |العربية (البحرين)
+
|5121  |ar-DZ     |        |Arabic (Algeria)                             |العربية (الجزائر)
+
|3073  |ar-EG     |        |Arabic (Egypt)                               |العربية (مصر)
+
|2049  |ar-IQ     |        |Arabic (Iraq)                                |العربية (العراق)
+
|11265 |ar-JO     |        |Arabic (Jordan)                              |العربية (الأردن)
+
|13313 |ar-KW     |        |Arabic (Kuwait)                              |العربية (الكويت)
+
|12289 |ar-LB     |        |Arabic (Lebanon)                             |العربية (لبنان)
+
|4097  |ar-LY     |        |Arabic (Libya)                               |العربية (ليبيا)
+
|6145  |ar-MA     |        |Arabic (Morocco)                             |العربية (المملكة المغربية)
+
|8193  |ar-OM     |        |Arabic (Oman)                                |العربية (عمان)
+
|16385 |ar-QA     |        |Arabic (Qatar)                               |العربية (قطر)
+
|1025  |ar-SA     |        |Arabic (Saudi Arabia)                        |العربية (المملكة العربية السعودية)
+
|10241 |ar-SY     |        |Arabic (Syria)                               |العربية (سوريا)
+
|7169  |ar-TN     |        |Arabic (Tunisia)                             |العربية (تونس)
+
|9217  |ar-YE     |        |Arabic (Yemen)                               |العربية (اليمن)
+
|122   |arn       |neutral |Mapudungun                                   |Mapudungun
+
|1146  |arn-CL    |        |Mapudungun (Chile)                           |Mapudungun (Chile)
+
|77    |as        |neutral |Assamese                                     |অসমীয়া
+
|1101  |as-IN     |        |Assamese (India)                             |অসমীয়া (ভাৰত)
+
|44    |az        |neutral |Azeri                                        |Azərbaycan­ılı
+
|29740 |az-Cyrl   |neutral |Azeri (Cyrillic)                             |Азәрбајҹан дили
+
|2092  |az-Cyrl-AZ|        |Azeri (Cyrillic, Azerbaijan)                 |Азәрбајҹан (Азәрбајҹан)
+
|30764 |az-Latn   |neutral |Azeri (Latin)                                |Azərbaycan­ılı
+
|1068  |az-Latn-AZ|        |Azeri (Latin, Azerbaijan)                    |Azərbaycan­ılı (Azərbaycan)
+
|109   |ba        |neutral |Bashkir                                      |Башҡорт
+
|1133  |ba-RU     |        |Bashkir (Russia)                             |Башҡорт (Россия)
+
|35    |be        |neutral |Belarusian                                   |Беларускі
+
|1059  |be-BY     |        |Belarusian (Belarus)                         |Беларускі (Беларусь)
+
|2     |bg        |neutral |Bulgarian                                    |български
+
|1026  |bg-BG     |        |Bulgarian (Bulgaria)                         |български (България)
+
|69    |bn        |neutral |Bengali                                      |বাংলা
+
|2117  |bn-BD     |        |Bengali (Bangladesh)                         |বাংলা (বাংলাদেশ)
+
|1093  |bn-IN     |        |Bengali (India)                              |বাংলা (ভারত)
+
|81    |bo        |neutral |Tibetan                                      |བོད་ཡིག
+
|1105  |bo-CN     |        |Tibetan (PRC)                                |བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)
+
|126   |br        |neutral |Breton                                       |brezhoneg
+
|1150  |br-FR     |        |Breton (France)                              |brezhoneg (Frañs)
+
|30746 |bs        |neutral |Bosnian                                      |bosanski
+
|25626 |bs-Cyrl   |neutral |Bosnian (Cyrillic)                           |босански
+
|8218  |bs-Cyrl-BA|        |Bosnian (Cyrillic, Bosnia and Herzegovina)   |босански (Босна и Херцеговина)
+
|26650 |bs-Latn   |neutral |Bosnian (Latin)                              |bosanski
+
|5146  |bs-Latn-BA|        |Bosnian (Latin, Bosnia and Herzegovina)      |bosanski (Bosna i Hercegovina)
+
|3     |ca        |neutral |Catalan                                      |català
+
|1027  |ca-ES     |        |Catalan (Catalan)                            |català (català)
+
|131   |co        |neutral |Corsican                                     |Corsu
+
|1155  |co-FR     |        |Corsican (France)                            |Corsu (France)
+
|5     |cs        |neutral |Czech                                        |čeština
+
|1029  |cs-CZ     |        |Czech (Czech Republic)                       |čeština (Česká republika)
+
|82    |cy        |neutral |Welsh                                        |Cymraeg
+
|1106  |cy-GB     |        |Welsh (United Kingdom)                       |Cymraeg (y Deyrnas Unedig)
+
|6     |da        |neutral |Danish                                       |dansk
+
|1030  |da-DK     |        |Danish (Denmark)                             |dansk (Danmark)
+
|7     |de        |neutral |German                                       |Deutsch
+
|3079  |de-AT     |        |German (Austria)                             |Deutsch (Österreich)
+
|2055  |de-CH     |        |German (Switzerland)                         |Deutsch (Schweiz)
+
|1031  |de-DE     |        |German (Germany)                             |Deutsch (Deutschland)
+
|5127  |de-LI     |        |German (Liechtenstein)                       |Deutsch (Liechtenstein)
+
|4103  |de-LU     |        |German (Luxembourg)                          |Deutsch (Luxemburg)
+
|31790 |dsb       |neutral |Lower Sorbian                                |dolnoserbšćina
+
|2094  |dsb-DE    |        |Lower Sorbian (Germany)                      |dolnoserbšćina (Nimska)
+
|101   |dv        |neutral |Divehi                                       |ދިވެހިބަސް
+
|1125  |dv-MV     |        |Divehi (Maldives)                            |ދިވެހިބަސް (ދިވެހި ރާއްޖެ)
+
|8     |el        |neutral |Greek                                        |Ελληνικά
+
|1032  |el-GR     |        |Greek (Greece)                               |Ελληνικά (Ελλάδα)
+
|9     |en        |neutral |English                                      |English
+
|9225  |en-029    |        |English (Caribbean)                          |English (Caribbean)
+
|3081  |en-AU     |        |English (Australia)                          |English (Australia)
+
|10249 |en-BZ     |        |English (Belize)                             |English (Belize)
+
|4105  |en-CA     |        |English (Canada)                             |English (Canada)
+
|2057  |en-GB     |        |English (United Kingdom)                     |English (United Kingdom)
+
|6153  |en-IE     |        |English (Ireland)                            |English (Ireland)
+
|16393 |en-IN     |        |English (India)                              |English (India)
+
|8201  |en-JM     |        |English (Jamaica)                            |English (Jamaica)
+
|17417 |en-MY     |        |English (Malaysia)                           |English (Malaysia)
+
|5129  |en-NZ     |        |English (New Zealand)                        |English (New Zealand)
+
|13321 |en-PH     |        |English (Republic of the Philippines)        |English (Philippines)
+
|18441 |en-SG     |        |English (Singapore)                          |English (Singapore)
+
|11273 |en-TT     |        |English (Trinidad and Tobago)                |English (Trinidad y Tobago)
+
|1033  |en-US     |        |English (United States)                      |English (United States)
+
|7177  |en-ZA     |        |English (South Africa)                       |English (South Africa)
+
|12297 |en-ZW     |        |English (Zimbabwe)                           |English (Zimbabwe)
+
|10    |es        |neutral |Spanish                                      |español
+
|11274 |es-AR     |        |Spanish (Argentina)                          |Español (Argentina)
+
|16394 |es-BO     |        |Spanish (Bolivia)                            |Español (Bolivia)
+
|13322 |es-CL     |        |Spanish (Chile)                              |Español (Chile)
+
|9226  |es-CO     |        |Spanish (Colombia)                           |Español (Colombia)
+
|5130  |es-CR     |        |Spanish (Costa Rica)                         |Español (Costa Rica)
+
|7178  |es-DO     |        |Spanish (Dominican Republic)                 |Español (República Dominicana)
+
|12298 |es-EC     |        |Spanish (Ecuador)                            |Español (Ecuador)
+
|3082  |es-ES     |        |Spanish (Spain, International Sort)          |Español (España, alfabetización internacional)
+
|4106  |es-GT     |        |Spanish (Guatemala)                          |Español (Guatemala)
+
|18442 |es-HN     |        |Spanish (Honduras)                           |Español (Honduras)
+
|2058  |es-MX     |        |Spanish (Mexico)                             |Español (México)
+
|19466 |es-NI     |        |Spanish (Nicaragua)                          |Español (Nicaragua)
+
|6154  |es-PA     |        |Spanish (Panama)                             |Español (Panamá)
+
|10250 |es-PE     |        |Spanish (Peru)                               |Español (Perú)
+
|20490 |es-PR     |        |Spanish (Puerto Rico)                        |Español (Puerto Rico)
+
|15370 |es-PY     |        |Spanish (Paraguay)                           |Español (Paraguay)
+
|17418 |es-SV     |        |Spanish (El Salvador)                        |Español (El Salvador)
+
|21514 |es-US     |        |Spanish (United States)                      |Español (Estados Unidos)
+
|14346 |es-UY     |        |Spanish (Uruguay)                            |Español (Uruguay)
+
|8202  |es-VE     |        |Spanish (Bolivarian Republic of Venezuela)   |Español (Republica Bolivariana de Venezuela)
+
|37    |et        |neutral |Estonian                                     |eesti
+
|1061  |et-EE     |        |Estonian (Estonia)                           |eesti (Eesti)
+
|45    |eu        |neutral |Basque                                       |euskara
+
|1069  |eu-ES     |        |Basque (Basque)                              |euskara (euskara)
+
|41    |fa        |neutral |Persian                                      |فارسى
+
|1065  |fa-IR     |        |Persian                                      |فارسى (ایران)
+
|11    |fi        |neutral |Finnish                                      |suomi
+
|1035  |fi-FI     |        |Finnish (Finland)                            |suomi (Suomi)
+
|100   |fil       |neutral |Filipino                                     |Filipino
+
|1124  |fil-PH    |        |Filipino (Philippines)                       |Filipino (Pilipinas)
+
|56    |fo        |neutral |Faroese                                      |føroyskt
+
|1080  |fo-FO     |        |Faroese (Faroe Islands)                      |føroyskt (Føroyar)
+
|12    |fr        |neutral |French                                       |français
+
|2060  |fr-BE     |        |French (Belgium)                             |français (Belgique)
+
|3084  |fr-CA     |        |French (Canada)                              |français (Canada)
+
|4108  |fr-CH     |        |French (Switzerland)                         |français (Suisse)
+
|1036  |fr-FR     |        |French (France)                              |français (France)
+
|5132  |fr-LU     |        |French (Luxembourg)                          |français (Luxembourg)
+
|6156  |fr-MC     |        |French (Monaco)                              |français (Principauté de Monaco)
+
|98    |fy        |neutral |Frisian                                      |Frysk
+
|1122  |fy-NL     |        |Frisian (Netherlands)                        |Frysk (Nederlân)
+
|60    |ga        |neutral |Irish                                        |Gaeilge
+
|2108  |ga-IE     |        |Irish (Ireland)                              |Gaeilge (Éire)
+
|145   |gd        |neutral |Scottish Gaelic                              |Gàidhlig
+
|1169  |gd-GB     |        |Scottish Gaelic (United Kingdom)             |Gàidhlig (An Rìoghachd Aonaichte)
+
|86    |gl        |neutral |Galician                                     |galego
+
|1110  |gl-ES     |        |Galician (Galician)                          |galego (galego)
+
|132   |gsw       |neutral |Alsatian                                     |Elsässisch
+
|1156  |gsw-FR    |        |Alsatian (France)                            |Elsässisch (Frànkrisch)
+
|71    |gu        |neutral |Gujarati                                     |ગુજરાતી
+
|1095  |gu-IN     |        |Gujarati (India)                             |ગુજરાતી (ભારત)
+
|104   |ha        |neutral |Hausa                                        |Hausa
+
|31848 |ha-Latn   |neutral |Hausa (Latin)                                |Hausa
+
|1128  |ha-Latn-NG|        |Hausa (Latin, Nigeria)                       |Hausa (Nigeria)
+
|13    |he        |neutral |Hebrew                                       |עברית
+
|1037  |he-IL     |        |Hebrew (Israel)                              |עברית (ישראל)
+
|57    |hi        |neutral |Hindi                                        |हिंदी
+
|1081  |hi-IN     |        |Hindi (India)                                |हिंदी (भारत)
+
|26    |hr        |neutral |Croatian                                     |hrvatski
+
|4122  |hr-BA     |        |Croatian (Latin, Bosnia and Herzegovina)     |hrvatski (Bosna i Hercegovina)
+
|1050  |hr-HR     |        |Croatian (Croatia)                           |hrvatski (Hrvatska)
+
|46    |hsb       |neutral |Upper Sorbian                                |hornjoserbšćina
+
|1070  |hsb-DE    |        |Upper Sorbian (Germany)                      |hornjoserbšćina (Němska)
+
|14    |hu        |neutral |Hungarian                                    |magyar
+
|1038  |hu-HU     |        |Hungarian (Hungary)                          |magyar (Magyarország)
+
|43    |hy        |neutral |Armenian                                     |Հայերեն
+
|1067  |hy-AM     |        |Armenian (Armenia)                           |Հայերեն (Հայաստան)
+
|33    |id        |neutral |Indonesian                                   |Bahasa Indonesia
+
|1057  |id-ID     |        |Indonesian (Indonesia)                       |Bahasa Indonesia (Indonesia)
+
|112   |ig        |neutral |Igbo                                         |Igbo
+
|1136  |ig-NG     |        |Igbo (Nigeria)                               |Igbo (Nigeria)
+
|120   |ii        |neutral |Yi                                           |ꆈꌠꁱꂷ
+
|1144  |ii-CN     |        |Yi (PRC)                                     |ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)
+
|15    |is        |neutral |Icelandic                                    |íslenska
+
|1039  |is-IS     |        |Icelandic (Iceland)                          |íslenska (Ísland)
+
|16    |it        |neutral |Italian                                      |italiano
+
|2064  |it-CH     |        |Italian (Switzerland)                        |italiano (Svizzera)
+
|1040  |it-IT     |        |Italian (Italy)                              |italiano (Italia)
+
|93    |iu        |neutral |Inuktitut                                    |Inuktitut
+
|30813 |iu-Cans   |neutral |Inuktitut (Syllabics)                        |ᐃᓄᒃᑎᑐᑦ
+
|1117  |iu-Cans-CA|        |Inuktitut (Syllabics, Canada)                |ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)
+
|31837 |iu-Latn   |neutral |Inuktitut (Latin)                            |Inuktitut
+
|2141  |iu-Latn-CA|        |Inuktitut (Latin, Canada)                    |Inuktitut (Kanatami)
+
|17    |ja        |neutral |Japanese                                     |日本語
+
|1041  |ja-JP     |        |Japanese (Japan)                             |日本語 (日本)
+
|55    |ka        |neutral |Georgian                                     |ქართული
+
|1079  |ka-GE     |        |Georgian (Georgia)                           |ქართული (საქართველო)
+
|63    |kk        |neutral |Kazakh                                       |Қазақ
+
|1087  |kk-KZ     |        |Kazakh (Kazakhstan)                          |Қазақ (Қазақстан)
+
|111   |kl        |neutral |Greenlandic                                  |kalaallisut
+
|1135  |kl-GL     |        |Greenlandic (Greenland)                      |kalaallisut (Kalaallit Nunaat)
+
|83    |km        |neutral |Khmer                                        |ខ្មែរ
+
|1107  |km-KH     |        |Khmer (Cambodia)                             |ខ្មែរ (កម្ពុជា)
+
|75    |kn        |neutral |Kannada                                      |ಕನ್ನಡ
+
|1099  |kn-IN     |        |Kannada (India)                              |ಕನ್ನಡ (ಭಾರತ)
+
|18    |ko        |neutral |Korean                                       |한국어
+
|1042  |ko-KR     |        |Korean (Korea)                               |한국어 (대한민국)
+
|87    |kok       |neutral |Konkani                                      |कोंकणी
+
|1111  |kok-IN    |        |Konkani (India)                              |कोंकणी (भारत)
+
|64    |ky        |neutral |Kyrgyz                                       |Кыргыз
+
|1088  |ky-KG     |        |Kyrgyz (Kyrgyzstan)                          |Кыргыз (Кыргызстан)
+
|110   |lb        |neutral |Luxembourgish                                |Lëtzebuergesch
+
|1134  |lb-LU     |        |Luxembourgish (Luxembourg)                   |Lëtzebuergesch (Luxembourg)
+
|84    |lo        |neutral |Lao                                          |ລາວ
+
|1108  |lo-LA     |        |Lao (Lao P.D.R.)                             |ລາວ (ສ.ປ.ປ. ລາວ)
+
|39    |lt        |neutral |Lithuanian                                   |lietuvių
+
|1063  |lt-LT     |        |Lithuanian (Lithuania)                       |lietuvių (Lietuva)
+
|38    |lv        |neutral |Latvian                                      |latviešu
+
|1062  |lv-LV     |        |Latvian (Latvia)                             |latviešu (Latvija)
+
|129   |mi        |neutral |Maori                                        |Reo Māori
+
|1153  |mi-NZ     |        |Maori (New Zealand)                          |Reo Māori (Aotearoa)
+
|47    |mk        |neutral |Macedonian (FYROM)                           |македонски јазик
+
|1071  |mk-MK     |        |Macedonian (Former Yugoslav Republic of Macedonia)|македонски јазик (Македонија)
+
|76    |ml        |neutral |Malayalam                                    |മലയാളം
+
|1100  |ml-IN     |        |Malayalam (India)                            |മലയാളം (ഭാരതം)
+
|80    |mn        |neutral |Mongolian                                    |Монгол хэл
+
|30800 |mn-Cyrl   |neutral |Mongolian (Cyrillic)                         |Монгол хэл
+
|1104  |mn-MN     |        |Mongolian (Cyrillic, Mongolia)               |Монгол хэл (Монгол улс)
+
|31824 |mn-Mong   |neutral |Mongolian (Traditional Mongolian)            |ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ
+
|2128  |mn-Mong-CN|        |Mongolian (Traditional Mongolian, PRC)       |ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)
+
|124   |moh       |neutral |Mohawk                                       |Kanien'kéha
+
|1148  |moh-CA    |        |Mohawk (Mohawk)                              |Kanien'kéha
+
|78    |mr        |neutral |Marathi                                      |मराठी
+
|1102  |mr-IN     |        |Marathi (India)                              |मराठी (भारत)
+
|62    |ms        |neutral |Malay                                        |Bahasa Melayu
+
|2110  |ms-BN     |        |Malay (Brunei Darussalam)                    |Bahasa Melayu (Brunei Darussalam)
+
|1086  |ms-MY     |        |Malay (Malaysia)                             |Bahasa Melayu (Malaysia)
+
|58    |mt        |neutral |Maltese                                      |Malti
+
|1082  |mt-MT     |        |Maltese (Malta)                              |Malti (Malta)
+
|31764 |nb        |neutral |Norwegian (Bokmål)                           |norsk (bokmål)
+
|1044  |nb-NO     |        |Norwegian, Bokmål (Norway)                   |norsk, bokmål (Norge)
+
|97    |ne        |neutral |Nepali                                       |नेपाली
+
|1121  |ne-NP     |        |Nepali (Nepal)                               |नेपाली (नेपाल)
+
|19    |nl        |neutral |Dutch                                        |Nederlands
+
|2067  |nl-BE     |        |Dutch (Belgium)                              |Nederlands (België)
+
|1043  |nl-NL     |        |Dutch (Netherlands)                          |Nederlands (Nederland)
+
|30740 |nn        |neutral |Norwegian (Nynorsk)                          |norsk (nynorsk)
+
|2068  |nn-NO     |        |Norwegian, Nynorsk (Norway)                  |norsk, nynorsk (Noreg)
+
|20    |no        |neutral |Norwegian                                    |norsk
+
|108   |nso       |neutral |Sesotho sa Leboa                             |Sesotho sa Leboa
+
|1132  |nso-ZA    |        |Sesotho sa Leboa (South Africa)              |Sesotho sa Leboa (Afrika Borwa)
+
|130   |oc        |neutral |Occitan                                      |Occitan
+
|1154  |oc-FR     |        |Occitan (France)                             |Occitan (França)
+
|72    |or        |neutral |Oriya                                        |ଓଡ଼ିଆ
+
|1096  |or-IN     |        |Oriya (India)                                |ଓଡ଼ିଆ (ଭାରତ)
+
|70    |pa        |neutral |Punjabi                                      |ਪੰਜਾਬੀ
+
|1094  |pa-IN     |        |Punjabi (India)                              |ਪੰਜਾਬੀ (ਭਾਰਤ)
+
|21    |pl        |neutral |Polish                                       |polski
+
|1045  |pl-PL     |        |Polish (Poland)                              |polski (Polska)
+
|140   |prs       |neutral |Dari                                         |درى
+
|1164  |prs-AF    |        |Dari (Afghanistan)                           |درى (افغانستان)
+
|99    |ps        |neutral |Pashto                                       |پښتو
+
|1123  |ps-AF     |        |Pashto (Afghanistan)                         |پښتو (افغانستان)
+
|22    |pt        |neutral |Portuguese                                   |Português
+
|1046  |pt-BR     |        |Portuguese (Brazil)                          |Português (Brasil)
+
|2070  |pt-PT     |        |Portuguese (Portugal)                        |português (Portugal)
+
|134   |qut       |neutral |K'iche                                       |K'iche
+
|1158  |qut-GT    |        |K'iche (Guatemala)                           |K'iche (Guatemala)
+
|107   |quz       |neutral |Quechua                                      |runasimi
+
|1131  |quz-BO    |        |Quechua (Bolivia)                            |runasimi (Qullasuyu)
+
|2155  |quz-EC    |        |Quechua (Ecuador)                            |runasimi (Ecuador)
+
|3179  |quz-PE    |        |Quechua (Peru)                               |runasimi (Piruw)
+
|23    |rm        |neutral |Romansh                                      |Rumantsch
+
|1047  |rm-CH     |        |Romansh (Switzerland)                        |Rumantsch (Svizra)
+
|24    |ro        |neutral |Romanian                                     |română
+
|1048  |ro-RO     |        |Romanian (Romania)                           |română (România)
+
|25    |ru        |neutral |Russian                                      |русский
+
|1049  |ru-RU     |        |Russian (Russia)                             |русский (Россия)
+
|135   |rw        |neutral |Kinyarwanda                                  |Kinyarwanda
+
|1159  |rw-RW     |        |Kinyarwanda (Rwanda)                         |Kinyarwanda (Rwanda)
+
|79    |sa        |neutral |Sanskrit                                     |संस्कृत
+
|1103  |sa-IN     |        |Sanskrit (India)                             |संस्कृत (भारतम्)
+
|133   |sah       |neutral |Yakut                                        |саха
+
|1157  |sah-RU    |        |Yakut (Russia)                               |саха (Россия)
+
|59    |se        |neutral |Sami (Northern)                              |davvisámegiella
+
|3131  |se-FI     |        |Sami, Northern (Finland)                     |davvisámegiella (Suopma)
+
|1083  |se-NO     |        |Sami, Northern (Norway)                      |davvisámegiella (Norga)
+
|2107  |se-SE     |        |Sami, Northern (Sweden)                      |davvisámegiella (Ruoŧŧa)
+
|91    |si        |neutral |Sinhala                                      |සිංහල
+
|1115  |si-LK     |        |Sinhala (Sri Lanka)                          |සිංහල (ශ්‍රී ලංකා)
+
|27    |sk        |neutral |Slovak                                       |slovenčina
+
|1051  |sk-SK     |        |Slovak (Slovakia)                            |slovenčina (Slovenská republika)
+
|36    |sl        |neutral |Slovenian                                    |slovenski
+
|1060  |sl-SI     |        |Slovenian (Slovenia)                         |slovenski (Slovenija)
+
|30779 |sma       |neutral |Sami (Southern)                              |åarjelsaemiengiele
+
|6203  |sma-NO    |        |Sami, Southern (Norway)                      |åarjelsaemiengiele (Nöörje)
+
|7227  |sma-SE    |        |Sami, Southern (Sweden)                      |åarjelsaemiengiele (Sveerje)
+
|31803 |smj       |neutral |Sami (Lule)                                  |julevusámegiella
+
|4155  |smj-NO    |        |Sami, Lule (Norway)                          |julevusámegiella (Vuodna)
+
|5179  |smj-SE    |        |Sami, Lule (Sweden)                          |julevusámegiella (Svierik)
+
|28731 |smn       |neutral |Sami (Inari)                                 |sämikielâ
+
|9275  |smn-FI    |        |Sami, Inari (Finland)                        |sämikielâ (Suomâ)
+
|29755 |sms       |neutral |Sami (Skolt)                                 |sääm´ǩiõll
+
|8251  |sms-FI    |        |Sami, Skolt (Finland)                        |sääm´ǩiõll (Lää´ddjânnam)
+
|28    |sq        |neutral |Albanian                                     |shqipe
+
|1052  |sq-AL     |        |Albanian (Albania)                           |shqipe (Shqipëria)
+
|31770 |sr        |neutral |Serbian                                      |srpski
+
|27674 |sr-Cyrl   |neutral |Serbian (Cyrillic)                           |српски
+
|7194  |sr-Cyrl-BA|        |Serbian (Cyrillic, Bosnia and Herzegovina)   |српски (Босна и Херцеговина)
+
|3098  |sr-Cyrl-CS|        |Serbian (Cyrillic, Serbia and Montenegro (Former))|српски (Србија и Црна Гора (Претходно))
+
|12314 |sr-Cyrl-ME|        |Serbian (Cyrillic, Montenegro)               |српски (Црна Гора)
+
|10266 |sr-Cyrl-RS|        |Serbian (Cyrillic, Serbia)                   |српски (Србија)
+
|28698 |sr-Latn   |neutral |Serbian (Latin)                              |srpski
+
|6170  |sr-Latn-BA|        |Serbian (Latin, Bosnia and Herzegovina)      |srpski (Bosna i Hercegovina)
+
|2074  |sr-Latn-CS|        |Serbian (Latin, Serbia and Montenegro (Former))|srpski (Srbija i Crna Gora (Prethodno))
+
|11290 |sr-Latn-ME|        |Serbian (Latin, Montenegro)                  |srpski (Crna Gora)
+
|9242  |sr-Latn-RS|        |Serbian (Latin, Serbia)                      |srpski (Srbija)
+
|29    |sv        |neutral |Swedish                                      |svenska
+
|2077  |sv-FI     |        |Swedish (Finland)                            |svenska (Finland)
+
|1053  |sv-SE     |        |Swedish (Sweden)                             |svenska (Sverige)
+
|65    |sw        |neutral |Kiswahili                                    |Kiswahili
+
|1089  |sw-KE     |        |Kiswahili (Kenya)                            |Kiswahili (Kenya)
+
|90    |syr       |neutral |Syriac                                       |ܣܘܪܝܝܐ
+
|1114  |syr-SY    |        |Syriac (Syria)                               |ܣܘܪܝܝܐ (سوريا)
+
|73    |ta        |neutral |Tamil                                        |தமிழ்
+
|1097  |ta-IN     |        |Tamil (India)                                |தமிழ் (இந்தியா)
+
|74    |te        |neutral |Telugu                                       |తెలుగు
+
|1098  |te-IN     |        |Telugu (India)                               |తెలుగు (భారత దేశం)
+
|40    |tg        |neutral |Tajik                                        |Тоҷикӣ
+
|31784 |tg-Cyrl   |neutral |Tajik (Cyrillic)                             |Тоҷикӣ
+
|1064  |tg-Cyrl-TJ|        |Tajik (Cyrillic, Tajikistan)                 |Тоҷикӣ (Тоҷикистон)
+
|30    |th        |neutral |Thai                                         |ไทย
+
|1054  |th-TH     |        |Thai (Thailand)                              |ไทย (ไทย)
+
|66    |tk        |neutral |Turkmen                                      |türkmençe
+
|1090  |tk-TM     |        |Turkmen (Turkmenistan)                       |türkmençe (Türkmenistan)
+
|50    |tn        |neutral |Setswana                                     |Setswana
+
|1074  |tn-ZA     |        |Setswana (South Africa)                      |Setswana (Aforika Borwa)
+
|31    |tr        |neutral |Turkish                                      |Türkçe
+
|1055  |tr-TR     |        |Turkish (Turkey)                             |Türkçe (Türkiye)
+
|68    |tt        |neutral |Tatar                                        |Татар
+
|1092  |tt-RU     |        |Tatar (Russia)                               |Татар (Россия)
+
|95    |tzm       |neutral |Tamazight                                    |Tamazight
+
|31839 |tzm-Latn  |neutral |Tamazight (Latin)                            |Tamazight
+
|2143  |tzm-Latn-DZ|        |Tamazight (Latin, Algeria)                   |Tamazight (Djazaïr)
+
|128   |ug        |neutral |Uyghur                                       |ئۇيغۇرچە
+
|1152  |ug-CN     |        |Uyghur (PRC)                                 |ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)
+
|34    |uk        |neutral |Ukrainian                                    |українська
+
|1058  |uk-UA     |        |Ukrainian (Ukraine)                          |українська (Україна)
+
|32    |ur        |neutral |Urdu                                         |اُردو
+
|1056  |ur-PK     |        |Urdu (Islamic Republic of Pakistan)          |اُردو (پاکستان)
+
|67    |uz        |neutral |Uzbek                                        |U'zbek
+
|30787 |uz-Cyrl   |neutral |Uzbek (Cyrillic)                             |Ўзбек
+
|2115  |uz-Cyrl-UZ|        |Uzbek (Cyrillic, Uzbekistan)                 |Ўзбек (Ўзбекистон)
+
|31811 |uz-Latn   |neutral |Uzbek (Latin)                                |U'zbek
+
|1091  |uz-Latn-UZ|        |Uzbek (Latin, Uzbekistan)                    |U'zbek (U'zbekiston Respublikasi)
+
|42    |vi        |neutral |Vietnamese                                   |Tiếng Việt
+
|1066  |vi-VN     |        |Vietnamese (Vietnam)                         |Tiếng Việt (Việt Nam)
+
|136   |wo        |neutral |Wolof                                        |Wolof
+
|1160  |wo-SN     |        |Wolof (Senegal)                              |Wolof (Sénégal)
+
|52    |xh        |neutral |isiXhosa                                     |isiXhosa
+
|1076  |xh-ZA     |        |isiXhosa (South Africa)                      |isiXhosa (uMzantsi Afrika)
+
|106   |yo        |neutral |Yoruba                                       |Yoruba
+
|1130  |yo-NG     |        |Yoruba (Nigeria)                             |Yoruba (Nigeria)
+
|30724 |zh        |neutral |Chinese                                      |中文
+
|4     |zh-CHS    |neutral |Chinese (Simplified) Legacy                  |中文(简体) 旧版
+
|31748 |zh-CHT    |neutral |Chinese (Traditional) Legacy                 |中文(繁體) 舊版
+
|2052  |zh-CN     |        |Chinese (Simplified, PRC)                    |中文(中华人民共和国)
+
|3076  |zh-HK     |        |Chinese (Traditional, Hong Kong S.A.R.)      |中文(香港特別行政區)
+
|4     |zh-Hans   |neutral |Chinese (Simplified)                         |中文(简体)
+
|31748 |zh-Hant   |neutral |Chinese (Traditional)                        |中文(繁體)
+
|5124  |zh-MO     |        |Chinese (Traditional, Macao S.A.R.)          |中文(澳門特別行政區)
+
|4100  |zh-SG     |        |Chinese (Simplified, Singapore)              |中文(新加坡)
+
|1028  |zh-TW     |        |Chinese (Traditional, Taiwan)                |中文(台灣)
+
|53    |zu        |neutral |isiZulu                                      |isiZulu
+
|1077  |zu-ZA     |        |isiZulu (South Africa)                       |isiZulu (iNingizimu Afrika)
+
}}
+

          
+
**国・地域に固有な情報の取得 (RegionInfo)
+
特定の国・地域に固有な情報のみが取得できればよい場合は&msdn(netfx,type,System.Globalization.RegionInfo){RegionInfoクラス};を使用することも出来ます。 RegionInfoクラスはCultureInfoとは異なり、書式や変換に関する規則等は設定されず、またスレッドにRegionInfoを設定することも出来ません。 InvariantCultureに相当するようなRegionInfoも存在しません。 RegionInfoクラスでは、通貨記号・地域コードのほか、CultureInfoクラスでは取得できないいくつかの情報も取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    RegionInfo[] regions = new RegionInfo[] {
+
      new RegionInfo("JP"),
+
      new RegionInfo("US"),
+
      new RegionInfo("GB"),
+
      new RegionInfo("DE"),
+
      new RegionInfo("ES"),
+
      new RegionInfo("FR"),
+
      new RegionInfo("TW"),
+
      new RegionInfo("CN"),
+
      new RegionInfo("AE"),
+
    };
+

          
+
    Console.WriteLine("|{0,-6}| {1,-32}| {2,-5}| {3,-5}| {4,-8}| {5,-18}| {6,-12}| {7,-32}| {8,-32}| {9,-32}| {10}",
+
                      "Name",
+
                      "EnglishName",
+
                      "ISO2",
+
                      "ISO3",
+
                      "GeoId",
+
                      "ISOCurrencySymbol",
+
                      "CurrSymbol",
+
                      "CurrencyEnglishName",
+
                      "CurrencyNativeName",
+
                      "DisplayName",
+
                      "NativeName");
+

          
+
    Console.WriteLine(new string('-', 180));
+

          
+
    foreach (RegionInfo r in regions)
+
    {
+
      Console.WriteLine("|{0,-6}| {1,-32}| {2,-5}| {3,-5}| {4,-8}| {5,-18}| {6,-12}| {7,-32}| {8,-32}| {9,-32}| {10}",
+
                        r.Name,
+
                        r.EnglishName,
+
                        r.TwoLetterISORegionName,
+
                        r.ThreeLetterISORegionName,
+
                        r.GeoId,
+
                        r.ISOCurrencySymbol,
+
                        r.CurrencySymbol,
+
                        r.CurrencyEnglishName,
+
                        r.CurrencyNativeName,
+
                        r.DisplayName,
+
                        r.NativeName);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim regions() As RegionInfo = New RegionInfo() { _
+
      New RegionInfo("JP"), _
+
      New RegionInfo("US"), _
+
      New RegionInfo("GB"), _
+
      New RegionInfo("DE"), _
+
      New RegionInfo("ES"), _
+
      New RegionInfo("FR"), _
+
      New RegionInfo("TW"), _
+
      New RegionInfo("CN"), _
+
      New RegionInfo("AE") _
+
    }
+

          
+
    Console.WriteLine("|{0,-6}| {1,-32}| {2,-5}| {3,-5}| {4,-8}| {5,-18}| {6,-12}| {7,-32}| {8,-32}| {9,-32}| {10}", _
+
                      "Name", _
+
                      "EnglishName", _
+
                      "ISO2", _
+
                      "ISO3", _
+
                      "GeoId", _
+
                      "ISOCurrencySymbol", _
+
                      "CurrSymbol", _
+
                      "CurrencyEnglishName", _
+
                      "CurrencyNativeName", _
+
                      "DisplayName", _
+
                      "NativeName")
+

          
+
    Console.WriteLine(New String("-"c, 180))
+

          
+
    For Each r As RegionInfo In regions
+
      Console.WriteLine("|{0,-6}| {1,-32}| {2,-5}| {3,-5}| {4,-8}| {5,-18}| {6,-12}| {7,-32}| {8,-32}| {9,-32}| {10}", _
+
                        r.Name, _
+
                        r.EnglishName, _
+
                        r.TwoLetterISORegionName, _
+
                        r.ThreeLetterISORegionName, _
+
                        r.GeoId, _
+
                        r.ISOCurrencySymbol, _
+
                        r.CurrencySymbol, _
+
                        r.CurrencyEnglishName, _
+
                        r.CurrencyNativeName, _
+
                        r.DisplayName, _
+
                        r.NativeName)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
|Name  | EnglishName                     | ISO2 | ISO3 | GeoId   | ISOCurrencySymbol | CurrSymbol  | CurrencyEnglishName             | CurrencyNativeName              | DisplayName                     | NativeName
+
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
|JP    | Japan                           | JP   | JPN  | 122     | JPY               | ¥           | Japanese Yen                    | 円                               | 日本                              | 日本
+
|US    | United States                   | US   | USA  | 244     | USD               | $           | US Dollar                       | US Dollar                       | 米国                              | United States
+
|GB    | United Kingdom                  | GB   | GBR  | 242     | GBP               | £           | UK Pound Sterling               | Pound Sterling                  | 英国                              | United Kingdom
+
|DE    | Germany                         | DE   | DEU  | 94      | EUR               | €           | Euro                            | Euro                            | ドイツ                             | Deutschland
+
|ES    | Spain                           | ES   | ESP  | 217     | EUR               | €           | Euro                            | euro                            | スペイン                            | España
+
|FR    | France                          | FR   | FRA  | 84      | EUR               | €           | Euro                            | euro                            | フランス                            | France
+
|TW    | Taiwan                          | TW   | TWN  | 237     | TWD               | NT$         | New Taiwan Dollar               | 新台幣                             | 台湾                              | 台灣
+
|CN    | People's Republic of China      | CN   | CHN  | 45      | CNY               | ¥           | PRC Yuan Renminbi               | 人民币                             | 中華人民共和国                         | 中华人民共和国
+
|AE    | U.A.E.                          | AE   | ARE  | 224     | AED               | د.إ.‏       | UAE Dirham                      | درهم اماراتي                    | アラブ首長国連邦                        | الإمارات العربية المتحدة
+
}}
+

          
+
#navi(..)
+

          

programming/netfx/locale/1_infoes/index.wiki.txt

current previous
1,1490 0,0
+
${smdncms:title,カルチャと書式・テキスト処理・暦}
+
${smdncms:keywords,NumberFormatInfo,DateTimeFormatInfo,CompareInfo,TextInfo,Calendar}
+
${smdncms:meta,toc-amazonlivelink-keyword,books-jp,.net framework}
+

          
+
#navi(..)
+

          
+
ここではカルチャに設定される固有の書式・テキスト処理の規則と暦について見ていきます。
+

          
+
-関連するページ
+
--[[programming/netfx/comparison]]
+
---[[programming/netfx/comparison/0_comparison]]
+
---[[programming/netfx/comparison/1_equation]]
+
--[[programming/netfx/string]]
+
---[[programming/netfx/string/2_comparison]]
+
---[[programming/netfx/string/3_formatting]]
+

          
+
----
+

          
+
*&aname(formatting){カルチャと書式};
+
ニュートラルでないカルチャには、日時や数値に固有の書式が割り当てられています。 この書式は、カルチャの言語・国・地域にあわせて桁の区切・月の名前・曜日名・通貨記号などの文字列がローカライズされた表記・形式となっています。 これらの書式は、数値や日付・時間などの値を文字列化する場合などに使用されます。
+

          
+
**スレッドのカルチャと書式
+
ToStringなどのメソッドでは、書式を指定しなかった場合やカルチャに依存する形式に書式化される書式指定文字列を使用した場合は、現在のスレッドのカルチャに従ってローカライズされた形式で文字列化されます。 そのため、スレッドのカルチャを変更するとこれらのメソッドの結果にも影響します。
+

          
+
次のコードでは、スレッドのカルチャを変更して、書式を指定しない場合とローカライズされる書式指定文字列を使った場合の文字列化の結果を出力しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    // decimal型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("number");
+

          
+
    decimal number = -12345.67m;
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Thread.CurrentThread.CurrentCulture = culture;
+

          
+
      Console.WriteLine("{0,-6}| {1,-15} {2,-15} {3,-15}",
+
                        CultureInfo.CurrentCulture.Name,
+
                        number.ToString(),
+
                        number.ToString("N"),
+
                        number.ToString("C"));
+
    }
+

          
+
    // DateTime型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("date and time");
+

          
+
    DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6);
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Thread.CurrentThread.CurrentCulture = culture;
+

          
+
      Console.WriteLine("{0,-6}| {1,-25} {2,-15} {3}",
+
                        CultureInfo.CurrentCulture.Name,
+
                        dateTime.ToString(),
+
                        dateTime.ToString("T"),
+
                        dateTime.ToString("F"));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    ' decimal型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("number")
+

          
+
    Dim number As Decimal = -12345.67D
+

          
+
    For Each culture As CultureInfo In cultures
+
      Thread.CurrentThread.CurrentCulture = culture
+

          
+
      Console.WriteLine("{0,-6}| {1,-15} {2,-15} {3,-15}", _
+
                        CultureInfo.CurrentCulture.Name, _
+
                        number.ToString(), _
+
                        number.ToString("N"), _
+
                        number.ToString("C"))
+
    Next
+

          
+
    ' DateTime型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("date and time")
+

          
+
    Dim dateTime As New DateTime(2000, 1, 23, 4, 5, 6)
+

          
+
    For Each culture As CultureInfo In cultures
+
      Thread.CurrentThread.CurrentCulture = culture
+

          
+
      Console.WriteLine("{0,-6}| {1,-25} {2,-15} {3}", _
+
                        CultureInfo.CurrentCulture.Name, _
+
                        dateTime.ToString(), _
+
                        dateTime.ToString("T"), _
+
                        dateTime.ToString("F"))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
number
+
ja-JP | -12345.67       -12,345.67      -\12,346       
+
en-US | -12345.67       -12,345.67      ($12,345.67)   
+
en-GB | -12345.67       -12,345.67      -£12,345.67    
+
fr-FR | -12345,67       -12 345,67      -12 345,67 €   
+
es-ES | -12345,67       -12.345,67      -12.345,67 €   
+
      | -12345.67       -12,345.67      ($12,345.67)   
+
date and time
+
ja-JP | 2000/01/23 4:05:06        4:05:06         2000年1月23日 4:05:06
+
en-US | 1/23/2000 4:05:06 AM      4:05:06 AM      Sunday, January 23, 2000 4:05:06 AM
+
en-GB | 23/01/2000 04:05:06       04:05:06        23 January 2000 04:05:06
+
fr-FR | 23/01/2000 04:05:06       04:05:06        dimanche 23 janvier 2000 04:05:06
+
es-ES | 23/01/2000 4:05:06        4:05:06         domingo, 23 de enero de 2000 4:05:06
+
      | 01/23/2000 04:05:06       04:05:06        Sunday, 23 January 2000 04:05:06
+
}}
+

          
+
このように、スレッドのカルチャに応じて、桁区切り記号や小数点記号・通貨記号、月名・曜日名がローカライズされて文字列化されます。
+

          
+
**カルチャと書式プロバイダ
+
ToStringなどのメソッドは、引数にCultureInfoを指定することが出来ます。 スレッドのカルチャを変更する代わりにToStringメソッドにCultureInfoを指定することで、そのカルチャの書式を使うように指定することが出来ます。
+

          
+
次のコードでは、先のコードを少し変更し、スレッドのカルチャは変更せずにToStringメソッドの引数にCultureInfoを指定した場合の文字列化の結果を出力しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    // decimal型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("number");
+

          
+
    decimal number = -12345.67m;
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Console.WriteLine("{0,-6} {1,-15} | {2,-6} {3,-15} {4,-15} {5,-15}",
+
                        CultureInfo.CurrentCulture.Name,
+
                        number.ToString(),
+
                        culture.Name,
+
                        number.ToString(culture),
+
                        number.ToString("N", culture),
+
                        number.ToString("C", culture));
+
    }
+

          
+
    // DateTime型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("date and time");
+

          
+
    DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6);
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Console.WriteLine("{0,-6} {1,-15} | {2,-6} {3,-25} {4,-15} {5}",
+
                        CultureInfo.CurrentCulture.Name,
+
                        dateTime.ToString(),
+
                        culture.Name,
+
                        dateTime.ToString(culture),
+
                        dateTime.ToString("T", culture),
+
                        dateTime.ToString("F", culture));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    ' decimal型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("number")
+

          
+
    Dim number As Decimal = -12345.67D
+

          
+
    For Each culture As CultureInfo In cultures
+
      Console.WriteLine("{0,-6} {1,-15} | {2,-6} {3,-15} {4,-15} {5,-15}", _
+
                        CultureInfo.CurrentCulture.Name, _
+
                        number.ToString(), _
+
                        culture.Name, _
+
                        number.ToString(culture), _
+
                        number.ToString("N", culture), _
+
                        number.ToString("C", culture))
+
    Next
+

          
+
    ' DateTime型の値をいくつかの書式・カルチャの組み合わせで文字列化
+
    Console.WriteLine("date and time")
+

          
+
    Dim dateTime As New DateTime(2000, 1, 23, 4, 5, 6)
+

          
+
    For Each culture As CultureInfo In cultures
+
      Console.WriteLine("{0,-6} {1,-15} | {2,-6} {3,-25} {4,-15} {5}", _
+
                        CultureInfo.CurrentCulture.Name, _
+
                        dateTime.ToString(), _
+
                        culture.Name, _
+
                        dateTime.ToString(culture), _
+
                        dateTime.ToString("T", culture), _
+
                        dateTime.ToString("F", culture))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
number
+
ja-JP  -12345.67       | ja-JP  -12345.67       -12,345.67      -\12,346       
+
ja-JP  -12345.67       | en-US  -12345.67       -12,345.67      ($12,345.67)   
+
ja-JP  -12345.67       | en-GB  -12345.67       -12,345.67      -£12,345.67    
+
ja-JP  -12345.67       | fr-FR  -12345,67       -12 345,67      -12 345,67 €   
+
ja-JP  -12345.67       | es-ES  -12345,67       -12.345,67      -12.345,67 €   
+
ja-JP  -12345.67       |        -12345.67       -12,345.67      ($12,345.67)   
+
date and time
+
ja-JP  2000/01/23 4:05:06 | ja-JP  2000/01/23 4:05:06        4:05:06         2000年1月23日 4:05:06
+
ja-JP  2000/01/23 4:05:06 | en-US  1/23/2000 4:05:06 AM      4:05:06 AM      Sunday, January 23, 2000 4:05:06 AM
+
ja-JP  2000/01/23 4:05:06 | en-GB  23/01/2000 04:05:06       04:05:06        23 January 2000 04:05:06
+
ja-JP  2000/01/23 4:05:06 | fr-FR  23/01/2000 04:05:06       04:05:06        dimanche 23 janvier 2000 04:05:06
+
ja-JP  2000/01/23 4:05:06 | es-ES  23/01/2000 4:05:06        4:05:06         domingo, 23 de enero de 2000 4:05:06
+
ja-JP  2000/01/23 4:05:06 |        01/23/2000 04:05:06       04:05:06        Sunday, 23 January 2000 04:05:06
+
}}
+

          
+
このように、ToStringメソッドの引数にCultureInfoを指定した場合、(スレッドのカルチャとは無関係に)指定されたカルチャに固有な形式へとローカライズされた文字列に変換されます。
+

          
+
この例で使用したToStringメソッドのオーバーロードは、&msdn(netfx,type,System.IFormatProvider){IFormatProviderインターフェイス};を引数に取るようになっています。 これは''書式プロバイダ''と呼ばれるもので、数値や日付・時間などを文字列化するときに使用する書式を参照する際に呼び出されます。 CultureInfoクラスはIFormatProviderインターフェイスを実装しているため、ToStringメソッドに渡すことが出来ます。 この場合、CultureInfo自身が書式プロバイダとして機能し、ローカライズされた形式の書式を提供するようになります。
+

          
+
このときに使用される具体的な書式は、数値なら&msdn(netfx,member,System.Globalization.CultureInfo.NumberFormat){CultureInfo.NumberFormatプロパティ};で取得できるNumberFormatInfoクラス、日付と時間の場合は&msdn(netfx,member,System.Globalization.CultureInfo.DateTimeFormat){CultureInfo.DateTimeFormatプロパティ};で取得できるDateTimeFormatInfoクラスを使って決定されます。
+

          
+
ToString等のメソッドと書式プロバイダ・IFormatProviderインターフェイスの関係については[[programming/netfx/string/3_formatting]]で解説しているので、独自に実装する場合やカスタマイズする場合などに参照してください。
+

          
+
**&aname(NumberFormatInfo){数値の書式 (NumberFormatInfo)};
+
&msdn(netfx,type,System.Globalization.NumberFormatInfo){NumberFormatInfoクラス};は、桁区切り・小数点・通貨単位など数値に関する記号や書式化のルールを提供するクラスで、特定のカルチャにローカライズされた形式で取得することが出来ます。
+

          
+
このクラスのコンストラクタでは特定の言語や国・地域を指定することは出来ず、インバリアントなインスタンスしか作成出来ません。 代わりに、ニュートラルでないカルチャの&msdn(netfx,member,System.Globalization.CultureInfo.NumberFormat){CultureInfo.NumberFormatプロパティ};から、カルチャに対応するNumberFormatInfoを取得することが出来ます。
+

          
+
次のコードでは、いくつかのカルチャでのNumberFormatInfoを取得し、NumberFormatInfoに設定されているプロパティの内容を表示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      NumberFormatInfo nf = culture.NumberFormat;
+

          
+
      Console.WriteLine("{0,-6}|{1,-3} {2,-3} {3,-3} {4,-3} {5,-3} {6,-3} {7,-3}",
+
                        culture.Name,
+
                        nf.NumberDecimalSeparator,
+
                        nf.NumberGroupSeparator,
+
                        nf.NumberGroupSizes[0],
+
                        nf.NumberNegativePattern,
+
                        nf.CurrencySymbol,
+
                        nf.CurrencyPositivePattern,
+
                        nf.PositiveInfinitySymbol);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    For Each culture As CultureInfo In cultures
+
      Dim nf As NumberFormatInfo = culture.NumberFormat
+

          
+
      Console.WriteLine("{0,-6}|{1,-3} {2,-3} {3,-3} {4,-3} {5,-3} {6,-3} {7,-3}", _
+
                        culture.Name, _
+
                        nf.NumberDecimalSeparator, _
+
                        nf.NumberGroupSeparator, _
+
                        nf.NumberGroupSizes(0), _
+
                        nf.NumberNegativePattern, _
+
                        nf.CurrencySymbol, _
+
                        nf.CurrencyPositivePattern, _
+
                        nf.PositiveInfinitySymbol)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
ja-JP |.   ,   3   1   ¥   0   +∞ 
+
en-US |.   ,   3   1   $   0   Infinity
+
en-GB |.   ,   3   1   £   0   Infinity
+
fr-FR |,       3   1   €   3   +Infini
+
es-ES |,   .   3   1   €   3   Infinito
+
      |.   ,   3   1   ¤   0   Infinity
+
}}
+

          
+
NumberFormatInfoのプロパティを設定することで、書式を変えることも出来ます。 例えば、桁区切りを4桁毎(万単位)にしたり、通貨記号や小数点・桁区切りの記号を全角にしたりすることが出来ます。 以下の例では、NumberFormatInfoのプロパティを変更して書式をカスタマイズしています。 なお、比較のためにカスタマイズしていないデフォルトの書式も併記しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    // 文字列化する数値
+
    decimal positiveNumber = +123456.7890m;
+
    decimal negativeNumber = -123456.7890m;
+

          
+
    // デフォルトのja-JPのカルチャを作成 (読み取り専用)
+
    CultureInfo jajpDefault = CultureInfo.GetCultureInfo("ja-JP");
+

          
+
    // カスタマイズするja-JP用のカルチャを作成
+
    CultureInfo jajpCustom = new CultureInfo("ja-JP");
+

          
+
    // NumberFormatInfoを取得
+
    NumberFormatInfo nf = jajpCustom.NumberFormat;
+

          
+
    nf.NumberGroupSizes = new int[] {4}; // 一般数値の桁区切りを4桁にする
+
    nf.NumberDecimalSeparator = ".";    // 一般数値の小数点区切りを全角にする
+
    nf.NumberGroupSeparator = ",";      // 一般数値の桁区切りを全角にする
+

          
+
    Console.WriteLine("number");
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString(jajpDefault), positiveNumber.ToString(jajpCustom));
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString(jajpDefault), negativeNumber.ToString(jajpCustom));
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("N4", jajpDefault), positiveNumber.ToString("N4", jajpCustom));
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("N4", jajpDefault), negativeNumber.ToString("N4", jajpCustom));
+

          
+
    nf.NegativeSign = "マイナス";  // 負の値を文字で表記する
+

          
+
    nf.CurrencyGroupSeparator = " ";  // 通貨の桁区切り記号を空白にする
+
    nf.CurrencySymbol = "円";         // 通貨記号を「円」にする
+
    nf.CurrencyPositivePattern = 1;   // 正の通貨の表記をn$のパターンにする
+
    nf.CurrencyNegativePattern = 5;   // 負の通貨の表記を-n$のパターンにする
+

          
+
    Console.WriteLine("currency");
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("C4", jajpDefault), positiveNumber.ToString("C4", jajpCustom));
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("C4", jajpDefault), negativeNumber.ToString("C4", jajpCustom));
+

          
+
    nf.PercentSymbol = "\u332b";      // パーセント記号を「㌫」(U+332B)にする
+
    nf.PercentGroupSeparator = "";    // パーセント値の桁区切りをなくす
+

          
+
    Console.WriteLine("percent");
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("P", jajpDefault), positiveNumber.ToString("P", jajpCustom));
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("P", jajpDefault), negativeNumber.ToString("P", jajpCustom));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 文字列化する数値
+
    Dim positiveNumber As Decimal = +123456.7890D
+
    Dim negativeNumber As Decimal = -123456.7890D
+

          
+
    ' デフォルトのja-JPのカルチャを作成 (読み取り専用)
+
    Dim jajpDefault As CultureInfo = CultureInfo.GetCultureInfo("ja-JP")
+

          
+
    ' カスタマイズするja-JP用のカルチャを作成
+
    Dim jajpCustom As New CultureInfo("ja-JP")
+

          
+
    ' NumberFormatInfoを取得
+
    Dim nf As NumberFormatInfo = jajpCustom.NumberFormat
+

          
+
    nf.NumberGroupSizes = New Integer() {4} ' 一般数値の桁区切りを4桁にする
+
    nf.NumberDecimalSeparator = "."        ' 一般数値の小数点区切りを全角にする
+
    nf.NumberGroupSeparator = ","          ' 一般数値の桁区切りを全角にする
+

          
+
    Console.WriteLine("number")
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString(jajpDefault), positiveNumber.ToString(jajpCustom))
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString(jajpDefault), negativeNumber.ToString(jajpCustom))
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("N4", jajpDefault), positiveNumber.ToString("N4", jajpCustom))
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("N4", jajpDefault), negativeNumber.ToString("N4", jajpCustom))
+

          
+
    nf.NegativeSign = "マイナス"  ' 負の値を文字で表記する
+

          
+
    nf.CurrencyGroupSeparator = " " ' 通貨の桁区切り記号を空白にする
+
    nf.CurrencySymbol = "円"        ' 通貨記号を「円」にする
+
    nf.CurrencyPositivePattern = 1  ' 正の通貨の表記をn$のパターンにする
+
    nf.CurrencyNegativePattern = 5  ' 負の通貨の表記を-n$のパターンにする
+

          
+
    Console.WriteLine("currency")
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("C4", jajpDefault), positiveNumber.ToString("C4", jajpCustom))
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("C4", jajpDefault), negativeNumber.ToString("C4", jajpCustom))
+

          
+
    nf.PercentSymbol = CStr(ChrW(&h332B)) ' パーセント記号を「㌫」(U+332B)にする
+
    nf.PercentGroupSeparator = ""         ' パーセント値の桁区切りをなくす
+

          
+
    Console.WriteLine("percent")
+
    Console.WriteLine("{0,-20} {1,-20}", positiveNumber.ToString("P", jajpDefault), positiveNumber.ToString("P", jajpCustom))
+
    Console.WriteLine("{0,-20} {1,-20}", negativeNumber.ToString("P", jajpDefault), negativeNumber.ToString("P", jajpCustom))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
number
+
123456.789           123456.789          
+
-123456.789          -123456.789         
+
123,456.7890         12,3456.7890        
+
-123,456.7890        -12,3456.7890       
+
currency
+
¥123,456.7890        123 456.7890円       
+
-¥123,456.7890       マイナス123 456.7890円   
+
percent
+
12,345,678.90%       12345678.90㌫        
+
-12,345,678.90%      マイナス12345678.90㌫    
+
}}
+

          
+
**&aname(DateTimeFormatInfo){日付と時間の書式 (DateTimeFormatInfo)};
+
&msdn(netfx,type,System.Globalization.DateTimeFormatInfo){DateTimeFormatInfoクラス};は、日付・時刻・午前/午後や曜日名・月名など日付と時刻に関する表記と書式化のルールを提供するクラスで、特定のカルチャにローカライズされた形式で取得することが出来ます。
+

          
+
[[NumberFormatInfo>#NumberFormatInfo]]と同様、このクラスのコンストラクタでは特定の言語や国・地域を指定することは出来ず、インバリアントなインスタンスしか作成出来ません。 代わりに、ニュートラルでないカルチャの&msdn(netfx,member,System.Globalization.CultureInfo.DateTimeFormat){CultureInfo.DateTimeFormatプロパティ};から、カルチャに対応するDateTimeFormatInfoを取得することが出来ます。
+

          
+
次のコードでは、いくつかのカルチャでのDateTimeFormatInfoを取得し、DateTimeFormatInfoに設定されているプロパティの内容を表示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      DateTimeFormatInfo dtf = culture.DateTimeFormat;
+

          
+
      Console.WriteLine("{0,-6}|{1,-40} {2,-15} {3,-15} {4,-10} {5,-10} {6} {7}",
+
                        culture.Name,
+
                        dtf.FullDateTimePattern,
+
                        dtf.ShortDatePattern,
+
                        dtf.ShortTimePattern,
+
                        dtf.FirstDayOfWeek,
+
                        dtf.CalendarWeekRule,
+
                        dtf.AMDesignator,
+
                        dtf.PMDesignator);
+
    }
+

          
+
    Console.WriteLine("[MonthNames]");
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, string.Join(", ", culture.DateTimeFormat.MonthNames));
+
    }
+

          
+
    Console.WriteLine("[DayNames]");
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, string.Join(", ", culture.DateTimeFormat.DayNames));
+
    }
+

          
+
    Console.WriteLine("[AbbreviatedDayNames]");
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, string.Join(", ", culture.DateTimeFormat.AbbreviatedDayNames));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    For Each culture As CultureInfo In cultures
+
      Dim dtf As DateTimeFormatInfo = culture.DateTimeFormat
+

          
+
      Console.WriteLine("{0,-6}|{1,-40} {2,-15} {3,-15} {4,-10} {5,-10} {6} {7}", _
+
                        culture.Name, _
+
                        dtf.FullDateTimePattern, _
+
                        dtf.ShortDatePattern, _
+
                        dtf.ShortTimePattern, _
+
                        dtf.FirstDayOfWeek, _
+
                        dtf.CalendarWeekRule, _
+
                        dtf.AMDesignator, _
+
                        dtf.PMDesignator)
+
    Next
+

          
+
    Console.WriteLine("[MonthNames]")
+

          
+
    For Each culture As CultureInfo In cultures
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, String.Join(", ", culture.DateTimeFormat.MonthNames))
+
    Next
+

          
+
    Console.WriteLine("[DayNames]")
+

          
+
    For Each culture As CultureInfo In cultures
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, String.Join(", ", culture.DateTimeFormat.DayNames))
+
    Next
+

          
+
    Console.WriteLine("[AbbreviatedDayNames]")
+

          
+
    For Each culture As CultureInfo In cultures
+
      Console.WriteLine("{0,-6}|{1}", culture.Name, String.Join(", ", culture.DateTimeFormat.AbbreviatedDayNames))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
ja-JP |yyyy'年'M'月'd'日' H:mm:ss                  yyyy/MM/dd      H:mm            Sunday     FirstDay   午前 午後
+
en-US |dddd, MMMM dd, yyyy h:mm:ss tt           M/d/yyyy        h:mm tt         Sunday     FirstDay   AM PM
+
en-GB |dd MMMM yyyy HH:mm:ss                    dd/MM/yyyy      HH:mm           Monday     FirstDay   AM PM
+
fr-FR |dddd d MMMM yyyy HH:mm:ss                dd/MM/yyyy      HH:mm           Monday     FirstDay    
+
es-ES |dddd, dd' de 'MMMM' de 'yyyy H:mm:ss     dd/MM/yyyy      H:mm            Monday     FirstDay    
+
      |dddd, dd MMMM yyyy HH:mm:ss              MM/dd/yyyy      HH:mm           Sunday     FirstDay   AM PM
+
[MonthNames]
+
ja-JP |1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月, 
+
en-US |January, February, March, April, May, June, July, August, September, October, November, December, 
+
en-GB |January, February, March, April, May, June, July, August, September, October, November, December, 
+
fr-FR |janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre, 
+
es-ES |enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre, 
+
      |January, February, March, April, May, June, July, August, September, October, November, December, 
+
[DayNames]
+
ja-JP |日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日
+
en-US |Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
+
en-GB |Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
+
fr-FR |dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi
+
es-ES |domingo, lunes, martes, miércoles, jueves, viernes, sábado
+
      |Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
+
[AbbreviatedDayNames]
+
ja-JP |日, 月, 火, 水, 木, 金, 土
+
en-US |Sun, Mon, Tue, Wed, Thu, Fri, Sat
+
en-GB |Sun, Mon, Tue, Wed, Thu, Fri, Sat
+
fr-FR |dim., lun., mar., mer., jeu., ven., sam.
+
es-ES |dom, lun, mar, mié, jue, vie, sáb
+
      |Sun, Mon, Tue, Wed, Thu, Fri, Sat
+
}}
+

          
+
NumberFormatInfoと同様、DateTimeFormatInfoのプロパティを変更して書式をカスタマイズすることが出来ます。 以下の例では、月名をカスタマイズしています。 なお、比較のためにカスタマイズしていないデフォルトの書式も併記しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    // デフォルトのja-JPのカルチャを作成 (読み取り専用)
+
    CultureInfo jajpDefault = CultureInfo.GetCultureInfo("ja-JP");
+

          
+
    // カスタマイズするja-JP用のカルチャを作成
+
    CultureInfo jajpCustom = new CultureInfo("ja-JP");
+

          
+
    // DateTimeFormatInfoを取得
+
    DateTimeFormatInfo dtf = jajpCustom.DateTimeFormat;
+

          
+
    // 月名を変更
+
    dtf.MonthNames = new string[] {
+
      "睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走", string.Empty,
+
    };
+

          
+
    for (DateTime dateTime = new DateTime(2010, 1, 1); dateTime.Year == 2010; dateTime = dateTime.AddDays(29).AddMinutes(108))
+
    {
+
      Console.WriteLine("{0,-25} {1,-25}", dateTime.ToString("F", jajpDefault), dateTime.ToString("F", jajpCustom));
+
    }
+

          
+
    // 書式指定文字"F"に関連付けられている書式を変更
+
    // (DateTimeFormatInfo.MonthNamesは、書式指定文字MMMMを置換する際に使用される)
+
    dtf.FullDateTimePattern = "西暦yyyy年 MMMM dd日 (dddd) tthh時 mm分 ss秒";
+

          
+
    for (DateTime dateTime = new DateTime(2010, 1, 1); dateTime.Year == 2010; dateTime = dateTime.AddDays(29).AddMinutes(108))
+
    {
+
      Console.WriteLine("{0,-25} {1,-25}", dateTime.ToString("F", jajpDefault), dateTime.ToString("F", jajpCustom));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' デフォルトのja-JPのカルチャを作成 (読み取り専用)
+
    Dim jajpDefault As CultureInfo = CultureInfo.GetCultureInfo("ja-JP")
+

          
+
    ' カスタマイズするja-JP用のカルチャを作成
+
    Dim jajpCustom As New CultureInfo("ja-JP")
+

          
+
    ' DateTimeFormatInfoを取得
+
    Dim dtf As DateTimeFormatInfo = jajpCustom.DateTimeFormat
+

          
+
    ' 月名を変更
+
    dtf.MonthNames = New String() { _
+
      "睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走", String.Empty _
+
    }
+

          
+
    Dim dateTime As New DateTime(2010, 1, 1)
+

          
+
    Do
+
      Console.WriteLine("{0,-25} {1,-25}", dateTime.ToString("F", jajpDefault), dateTime.ToString("F", jajpCustom))
+

          
+
      dateTime = dateTime.AddDays(29).AddMinutes(108)
+
    Loop While dateTime.Year = 2010
+

          
+
    ' 書式指定文字"F"に関連付けられている書式を変更
+
    ' (DateTimeFormatInfo.MonthNamesは、書式指定文字MMMMを置換する際に使用される)
+
    dtf.FullDateTimePattern = "西暦yyyy年 MMMM dd日 (dddd) tthh時 mm分 ss秒"
+

          
+
    dateTime = New DateTime(2010, 1, 1)
+

          
+
    Do
+
      Console.WriteLine("{0,-25} {1,-25}", dateTime.ToString("F", jajpDefault), dateTime.ToString("F", jajpCustom))
+

          
+
      dateTime = dateTime.AddDays(29).AddMinutes(108)
+
    Loop While dateTime.Year = 2010
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
2010年1月1日 0:00:00         2010年1月1日 0:00:00        
+
2010年1月30日 1:48:00        2010年1月30日 1:48:00       
+
2010年2月28日 3:36:00        2010年2月28日 3:36:00       
+
2010年3月29日 5:24:00        2010年3月29日 5:24:00       
+
2010年4月27日 7:12:00        2010年4月27日 7:12:00       
+
2010年5月26日 9:00:00        2010年5月26日 9:00:00       
+
2010年6月24日 10:48:00       2010年6月24日 10:48:00      
+
2010年7月23日 12:36:00       2010年7月23日 12:36:00      
+
2010年8月21日 14:24:00       2010年8月21日 14:24:00      
+
2010年9月19日 16:12:00       2010年9月19日 16:12:00      
+
2010年10月18日 18:00:00      2010年10月18日 18:00:00     
+
2010年11月16日 19:48:00      2010年11月16日 19:48:00     
+
2010年12月15日 21:36:00      2010年12月15日 21:36:00     
+
2010年1月1日 0:00:00         西暦2010年 睦月 01日 (金曜日) 午前12時 00分 00秒
+
2010年1月30日 1:48:00        西暦2010年 睦月 30日 (土曜日) 午前01時 48分 00秒
+
2010年2月28日 3:36:00        西暦2010年 如月 28日 (日曜日) 午前03時 36分 00秒
+
2010年3月29日 5:24:00        西暦2010年 弥生 29日 (月曜日) 午前05時 24分 00秒
+
2010年4月27日 7:12:00        西暦2010年 卯月 27日 (火曜日) 午前07時 12分 00秒
+
2010年5月26日 9:00:00        西暦2010年 皐月 26日 (水曜日) 午前09時 00分 00秒
+
2010年6月24日 10:48:00       西暦2010年 水無月 24日 (木曜日) 午前10時 48分 00秒
+
2010年7月23日 12:36:00       西暦2010年 文月 23日 (金曜日) 午後12時 36分 00秒
+
2010年8月21日 14:24:00       西暦2010年 葉月 21日 (土曜日) 午後02時 24分 00秒
+
2010年9月19日 16:12:00       西暦2010年 長月 19日 (日曜日) 午後04時 12分 00秒
+
2010年10月18日 18:00:00      西暦2010年 神無月 18日 (月曜日) 午後06時 00分 00秒
+
2010年11月16日 19:48:00      西暦2010年 霜月 16日 (火曜日) 午後07時 48分 00秒
+
2010年12月15日 21:36:00      西暦2010年 師走 15日 (水曜日) 午後09時 36分 00秒
+
}}
+

          
+
ほとんど(すべて?)のカルチャでは、デフォルトでグレゴリオ暦が使用されます。 使用する暦を変更する必要がある場合は、&msdn(netfx,member,System.Globalization.DateTimeFormatInfo.Calendar){DateTimeFormatInfo.Calendarプロパティ};を変更します。 また、月名は第十三月が存在する暦に対応するため要素が13個の配列を指定する必要があります。 [[暦(Calendar)について>#Calendar]]は後ほど詳しく解説します。
+

          
+
----
+

          
+
*&aname(string_texts){カルチャとテキスト処理};
+
書式と同様、ニュートラルでないカルチャには固有の文字列比較・変換の規則が割り当てられています。 例えば、大文字小文字の変換規則や、文字の並べ替えの規則などです。
+

          
+
**スレッドのカルチャとテキスト処理
+
Array.Sortなどのメソッドで文字列を比較する場合、String.Compareメソッドが呼び出されます。 String.Compareにオプションを指定しなかった場合のデフォルトの動作では、現在のスレッドのカルチャに固有な規則に基づいて比較が行われます。 同様に、String.ToUpperやString.ToLowerなどのメソッドでもカルチャ固有の規則で変換されます。 そのため、スレッドのカルチャを変更するとこれらのメソッドの結果にも影響します。
+

          
+
次のコードでは、スレッドのカルチャを変更し、Array.Sortメソッドを使って文字列の配列をソートした場合の結果を出力しています。 なお、この例で使用しているCultureInfo.TextInfo.ListSeparatorはカルチャ固有のリスト区切り文字を取得するプロパティです。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    string[] words1 = new string[] {"coté", "côte", "cote"};
+
    string[] words2 = new string[] {"亜", "井", "宇"};
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      Thread.CurrentThread.CurrentCulture = culture;
+

          
+
      Array.Sort(words1);
+
      Array.Sort(words2);
+

          
+
      string separator = CultureInfo.CurrentCulture.TextInfo.ListSeparator;
+

          
+
      Console.WriteLine("{0,-6}| {1,-20} {2,-20}",
+
                        CultureInfo.CurrentCulture.Name,
+
                        string.Join(separator, words1),
+
                        string.Join(separator, words2));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    Dim words1() As String = New String() {"coté", "côte", "cote"}
+
    Dim words2() As String = New String() {"亜", "井", "宇"}
+

          
+
    For Each culture As CultureInfo In cultures
+
      Thread.CurrentThread.CurrentCulture = culture
+

          
+
      Array.Sort(words1)
+
      Array.Sort(words2)
+

          
+
      Dim separator As String = CultureInfo.CurrentCulture.TextInfo.ListSeparator
+

          
+
      Console.WriteLine("{0,-6}| {1,-20} {2,-20}", _
+
                        CultureInfo.CurrentCulture.Name, _
+
                        String.Join(separator, words1), _
+
                        String.Join(separator, words2))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
ja-JP | cote,coté,côte       亜,井,宇               
+
en-US | cote,coté,côte       井,亜,宇               
+
en-GB | cote,coté,côte       井,亜,宇               
+
fr-FR | cote;côte;coté       井;亜;宇               
+
es-ES | cote;coté;côte       井;亜;宇               
+
      | cote,coté,côte       井,亜,宇  
+
}}
+

          
+
**文字列の比較 (CompareInfo)
+
&msdn(netfx,type,System.Globalization.CompareInfo){CompareInfoクラス};は、文字列の並べ替え(大小関係)と等価性の規則を提供するクラスで、特定のカルチャでの規則に基づいた文字列の検索・比較を行うことが出来ます。
+

          
+
このクラスのインスタンスを作成するには、&msdn(netfx,member,System.Globalization.CompareInfo.GetCompareInfo){GetCompareInfoメソッド};でカルチャの名前もしくはIDを指定するか、&msdn(netfx,member,System.Globalization.CultureInfo.CompareInfo){CultureInfo.CompareInfoプロパティ};からカルチャに対応するCompareInfoを取得することが出来ます。
+

          
+
次のコードでは、いくつかのカルチャでのCompareInfoを取得し、&msdn(netfx,member,System.Globalization.CompareInfo.Compare){CompareInfo.Compareメソッド};を使って文字列の比較を行っています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("en-GB"),
+
      CultureInfo.GetCultureInfo("fr-FR"),
+
      CultureInfo.GetCultureInfo("es-ES"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    string[] pair1 = new string[] {"coté", "côte"};
+
    string[] pair2 = new string[] {"亜", "井"};
+
    string[] pair3 = new string[] {"abc", "ABC"};
+

          
+
    Console.WriteLine("{0,-6}| {1,-14}| {2,-14}| {3,-14}",
+
                      "code",
+
                      pair1[0] + "<=>" + pair1[1],
+
                      pair2[0] + "<=>" + pair2[1],
+
                      pair3[0] + "<=>" + pair3[1]);
+

          
+
    Console.WriteLine(new string('-', 60));
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      CompareInfo ci = culture.CompareInfo;
+

          
+
      Console.WriteLine("{0,-6}| {1,-14}| {2,-14}| {3,-14}",
+
                        culture.Name,
+
                        ci.Compare(pair1[0], pair1[1]),
+
                        ci.Compare(pair2[0], pair2[1]),
+
                        ci.Compare(pair3[0], pair3[1], CompareOptions.IgnoreCase | CompareOptions.IgnoreWidth));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("en-GB"), _
+
      CultureInfo.GetCultureInfo("fr-FR"), _
+
      CultureInfo.GetCultureInfo("es-ES"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    Dim pair1() As String = New String() {"coté", "côte"}
+
    Dim pair2() As String = New String() {"亜", "井"}
+
    Dim pair3() As String = New String() {"abc", "ABC"}
+

          
+
    Console.WriteLine("{0,-6}| {1,-14}| {2,-14}| {3,-14}", _
+
                      "code", _
+
                      pair1(0) + "<=>" + pair1(1), _
+
                      pair2(0) + "<=>" + pair2(1), _
+
                      pair3(0) + "<=>" + pair3(1))
+

          
+
    Console.WriteLine(New String("-"c, 60))
+

          
+
    For Each culture As CultureInfo In cultures
+
      Dim ci As CompareInfo = culture.CompareInfo
+

          
+
      Console.WriteLine("{0,-6}| {1,-14}| {2,-14}| {3,-14}", _
+
                        culture.Name, _
+
                        ci.Compare(pair1(0), pair1(1)), _
+
                        ci.Compare(pair2(0), pair2(1)), _
+
                        ci.Compare(pair3(0), pair3(1), CompareOptions.IgnoreCase Or CompareOptions.IgnoreWidth))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
code  | coté<=>côte   | 亜<=>井         | abc<=>ABC     
+
------------------------------------------------------------
+
ja-JP | -1            | -1            | 0             
+
en-US | -1            | 1             | 0             
+
en-GB | -1            | 1             | 0             
+
fr-FR | 1             | 1             | 0             
+
es-ES | -1            | 1             | 0             
+
      | -1            | 1             | 0             
+
}}
+

          
+
なお、CompareInfoやCompareOptionsを指定した文字列の検索・比較は[[programming/netfx/string/2_comparison]]でも詳しく解説しているのでご覧ください。
+

          
+
**文字列の変換 (TextInfo)
+
TextInfoクラスは、文字列の変換の規則を提供するクラスで、特定のカルチャでの規則に基づいた大文字小文字の変換やコードページの取得などを行うことが出来ます。
+

          
+
このクラスのコンストラクタは公開されていないため、カルチャに対応するTextInfoのインスタンスを取得するには、&msdn(netfx,member,System.Globalization.CultureInfo.TextInfo){CultureInfo.TextInfoプロパティ};を参照します。
+

          
+
次のコードでは、いくつかのカルチャでのTextInfoを取得し、TextInfoのメソッドを使って文字列を大文字化・小文字化・タイトルケース化しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("tr-TR"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    string text = "tHe inTERnet";
+

          
+
    Console.WriteLine("{0,-6}| {1,-15}| {2,-15}| {3,-15}",
+
                      "code",
+
                      "ToUpper",
+
                      "ToLower",
+
                      "ToTitleCase");
+

          
+
    Console.WriteLine(new string('-', 60));
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      TextInfo ti = culture.TextInfo;
+

          
+
      Console.WriteLine("{0,-6}| {1,-15}| {2,-15}| {3,-15}",
+
                        culture.Name,
+
                        ti.ToUpper(text),
+
                        ti.ToLower(text),
+
                        ti.ToTitleCase(text));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("tr-TR"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    Dim text As String = "tHe inTERnet"
+

          
+
    Console.WriteLine("{0,-6}| {1,-15}| {2,-15}| {3,-15}", _
+
                      "code", _
+
                      "ToUpper", _
+
                      "ToLower", _
+
                      "ToTitleCase")
+

          
+
    Console.WriteLine(New String("-"c, 60))
+

          
+
    For Each culture As CultureInfo In cultures
+
      Dim ti As TextInfo = culture.TextInfo
+

          
+
      Console.WriteLine("{0,-6}| {1,-15}| {2,-15}| {3,-15}", _
+
                        culture.Name, _
+
                        ti.ToUpper(text), _
+
                        ti.ToLower(text), _
+
                        ti.ToTitleCase(text))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
code  | ToUpper        | ToLower        | ToTitleCase    
+
------------------------------------------------------------
+
ja-JP | THE INTERNET   | the internet   | The Internet   
+
en-US | THE INTERNET   | the internet   | The Internet   
+
tr-TR | THE İNTERNET   | the internet   | The İnternet   
+
      | THE INTERNET   | the internet   | The Internet  
+
}}
+

          
+
なお、StringクラスのToLower/ToUpper/ToUpperInvariant等のメソッドとの違いは[[programming/netfx/string/1_operations]]で詳しく解説しているのでご覧ください。
+

          
+
また、文字列の変換の他に、特定のカルチャで使用されるコードページの取得を行うことも出来ます。 次の例では、いくつかのカルチャでのTextInfoを取得し、TextInfoに設定されているコードページを表示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Text;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    CultureInfo[] cultures = new CultureInfo[] {
+
      CultureInfo.GetCultureInfo("ja-JP"),
+
      CultureInfo.GetCultureInfo("en-US"),
+
      CultureInfo.GetCultureInfo("ru-RU"),
+
      CultureInfo.GetCultureInfo("zh-TW"),
+
      CultureInfo.GetCultureInfo("zh-CN"),
+
      CultureInfo.InvariantCulture,
+
    };
+

          
+
    Console.WriteLine("{0,-6}| {1,-8}| {2,-20}| {3,-8}| {4,-8}| {5,-8}",
+
                      "code",
+
                      "ANSI",
+
                      "Encoding.WebName",
+
                      "EBCDIC",
+
                      "OEM",
+
                      "Macintosh");
+

          
+
    Console.WriteLine(new string('-', 72));
+

          
+
    foreach (CultureInfo culture in cultures)
+
    {
+
      TextInfo ti = culture.TextInfo;
+

          
+
      Console.WriteLine("{0,-6}| {1,-8}| {2,-20}| {3,-8}| {4,-8}| {5,-8}",
+
                        culture.Name,
+
                        ti.ANSICodePage,
+
                        Encoding.GetEncoding(ti.ANSICodePage).WebName,
+
                        ti.EBCDICCodePage,
+
                        ti.OEMCodePage,
+
                        ti.MacCodePage);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim cultures() As CultureInfo = New CultureInfo() { _
+
      CultureInfo.GetCultureInfo("ja-JP"), _
+
      CultureInfo.GetCultureInfo("en-US"), _
+
      CultureInfo.GetCultureInfo("ru-RU"), _
+
      CultureInfo.GetCultureInfo("zh-TW"), _
+
      CultureInfo.GetCultureInfo("zh-CN"), _
+
      CultureInfo.InvariantCulture _
+
    }
+

          
+
    Console.WriteLine("{0,-6}| {1,-8}| {2,-20}| {3,-8}| {4,-8}| {5,-8}", _
+
                      "code", _
+
                      "ANSI", _
+
                      "Encoding.WebName", _
+
                      "EBCDIC", _
+
                      "OEM", _
+
                      "Macintosh")
+

          
+
    Console.WriteLine(New String("-"c, 72))
+

          
+
    For Each culture As CultureInfo In cultures
+
      Dim ti As TextInfo = culture.TextInfo
+

          
+
      Console.WriteLine("{0,-6}| {1,-8}| {2,-20}| {3,-8}| {4,-8}| {5,-8}", _
+
                        culture.Name, _
+
                        ti.ANSICodePage, _
+
                        Encoding.GetEncoding(ti.ANSICodePage).WebName, _
+
                        ti.EBCDICCodePage, _
+
                        ti.OEMCodePage, _
+
                        ti.MacCodePage)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
code  | ANSI    | Encoding.WebName    | EBCDIC  | OEM     | Macintosh
+
------------------------------------------------------------------------
+
ja-JP | 932     | shift_jis           | 20290   | 932     | 10001   
+
en-US | 1252    | Windows-1252        | 37      | 437     | 10000   
+
ru-RU | 1251    | windows-1251        | 20880   | 866     | 10007   
+
zh-TW | 950     | big5                | 500     | 950     | 10002   
+
zh-CN | 936     | gb2312              | 500     | 936     | 10008   
+
      | 1252    | Windows-1252        | 37      | 437     | 10000   
+
}}
+

          
+
*&aname(Calendar){カルチャと暦 (Calendar)};
+
&msdn(netfx,member,System.Globalization.Calendar){Calendarクラス};およびその派生クラスを使うことで、特定の暦を使った年数の計算・日時の変換を行うことが出来ます。 また、いくつかのCalendarの派生クラスはカルチャに設定することが出来、数値の時刻のフォーマットとは別に特定の暦に対応した表記に変更することも出来ます。
+

          
+
例えば、和暦を表す&msdn(netfx,member,System.Globalization.JapaneseCalendar){JapaneseCalendarクラス};をカルチャに設定すると、年の表記に西暦ではなく年号が用いられるようになります。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    // ja-JPのカルチャを作成
+
    CultureInfo jajp = new CultureInfo("ja-JP");
+

          
+
    DateTime dateTime = new DateTime(2010, 1, 23, 4, 5, 6);
+

          
+
    Console.WriteLine(dateTime.ToString("F", jajp));
+

          
+
    // 暦をJapaneseCalendarに変更
+
    jajp.DateTimeFormat.Calendar = new JapaneseCalendar();
+

          
+
    Console.WriteLine(dateTime.ToString("F", jajp));
+

          
+
    // スレッドのカルチャを、暦をJapaneseCalendarに変更したja-JPに変更
+
    Thread.CurrentThread.CurrentCulture = jajp;
+

          
+
    Console.WriteLine(dateTime.ToString("F"));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ja-JPのカルチャを作成
+
    Dim jajp As New CultureInfo("ja-JP")
+

          
+
    Dim dateTime As New DateTime(2010, 1, 23, 4, 5, 6)
+

          
+
    Console.WriteLine(dateTime.ToString("F", jajp))
+

          
+
    ' 暦をJapaneseCalendarに変更
+
    jajp.DateTimeFormat.Calendar = new JapaneseCalendar()
+

          
+
    Console.WriteLine(dateTime.ToString("F", jajp))
+

          
+
    ' スレッドのカルチャを、暦をJapaneseCalendarに変更したja-JPに変更
+
    Thread.CurrentThread.CurrentCulture = jajp
+

          
+
    Console.WriteLine(dateTime.ToString("F"))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
2010年1月23日 4:05:06
+
平成 22年1月23日 4:05:06
+
平成 22年1月23日 4:05:06
+
}}
+

          
+
**日時の変換
+
DateTime型とCalendarクラスを組み合わせて使うことで、ある暦での日時を別の暦での日時に変換することが出来ます。 次の例は、&msdn(netfx,member,System.Globalization.JapaneseCalendar){JapaneseCalendarクラス};を使って和暦と西暦(グレゴリオ暦)での日付を相互に変換するものです。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Calendar japaneseCalendar = new JapaneseCalendar();
+
    CultureInfo jajp = new CultureInfo("ja-JP");
+

          
+
    jajp.DateTimeFormat.Calendar = japaneseCalendar;
+

          
+
    DateTime dateTime;
+

          
+
    // 和暦で(現在の年号での)1年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(1, 1, 1, 0, 0, 0, 0, Calendar.CurrentEra);
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"));
+

          
+
    // 和暦で(現在の年号での)1年1月8日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(1, 1, 8, 0, 0, 0, 0, Calendar.CurrentEra);
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"));
+

          
+
    // 和暦で平成(=年号4)2年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(2, 1, 1, 0, 0, 0, 0, 4);
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"));
+

          
+
    // 和暦で昭和(=年号3)2年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(2, 1, 1, 0, 0, 0, 0, 3);
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"));
+

          
+
    Console.WriteLine();
+

          
+
    // 西暦での日付に対応する和暦での年号と年を取得する
+
    string[] eraNames = new string[] {"(改元前)", "明治", "大正", "昭和", "平成"};
+

          
+
    foreach (DateTime dt in new DateTime[] {
+
      new DateTime(2000, 1, 1),
+
      new DateTime(1975, 1, 1),
+
      new DateTime(1950, 1, 1),
+
      new DateTime(1925, 1, 1),
+
      new DateTime(1900, 1, 1),
+
      new DateTime(1868, 9, 8),
+
      new DateTime(1868, 9, 7),
+
    })
+
    {
+
      Console.WriteLine("{0} => {1} {2}年",
+
                        dt.ToString("D"),
+
                        eraNames[japaneseCalendar.GetEra(dt)],
+
                        japaneseCalendar.GetYear(dt));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim japaneseCalendar As New JapaneseCalendar()
+
    Dim jajp As New CultureInfo("ja-JP")
+

          
+
    jajp.DateTimeFormat.Calendar = japaneseCalendar
+

          
+
    Dim dateTime As DateTime
+

          
+
    ' 和暦で(現在の年号での)1年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(1, 1, 1, 0, 0, 0, 0, Calendar.CurrentEra)
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"))
+

          
+
    ' 和暦で(現在の年号での)1年1月8日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(1, 1, 8, 0, 0, 0, 0, Calendar.CurrentEra)
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"))
+

          
+
    ' 和暦で平成(=年号4)2年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(2, 1, 1, 0, 0, 0, 0, 4)
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"))
+

          
+
    ' 和暦で昭和(=年号3)2年1月1日に相当する日のDateTimeを取得する
+
    dateTime = japaneseCalendar.ToDateTime(2, 1, 1, 0, 0, 0, 0, 3)
+

          
+
    Console.WriteLine("{0} = {1}", dateTime.ToString("D", jajp), dateTime.ToString("D"))
+

          
+
    Console.WriteLine()
+

          
+
    ' 西暦での日付に対応する和暦での年号と年を取得する
+
    Dim eraNames() As String = New String() {"(改元前)", "明治", "大正", "昭和", "平成"}
+

          
+
    For Each dt As DateTime In New DateTime() { _
+
      New DateTime(2000, 1, 1), _
+
      New DateTime(1975, 1, 1), _
+
      New DateTime(1950, 1, 1), _
+
      New DateTime(1925, 1, 1), _
+
      New DateTime(1900, 1, 1), _
+
      New DateTime(1868, 9, 8), _
+
      New DateTime(1868, 9, 7) _
+
    }
+
      Console.WriteLine("{0} => {1} {2}年", _
+
                        dt.ToString("D"), _
+
                        eraNames(japaneseCalendar.GetEra(dt)), _
+
                        japaneseCalendar.GetYear(dt))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
昭和 64年1月1日 = 1989年1月1日
+
平成 1年1月8日 = 1989年1月8日
+
平成 2年1月1日 = 1990年1月1日
+
昭和 2年1月1日 = 1927年1月1日
+

          
+
2000年1月1日 => 平成 12年
+
1975年1月1日 => 昭和 50年
+
1950年1月1日 => 昭和 25年
+
1925年1月1日 => 大正 14年
+
1900年1月1日 => 明治 33年
+
1868年9月8日 => 明治 1年
+

          
+
ハンドルされていない例外: System.ArgumentOutOfRangeException: 指定された時刻はこのカレンダーではサポートされていません。値は 09/08/1868 00:00:00 (グレゴリオ暦)から 12/31/9999 23:59:59 (グレゴリオ暦) までの間でなければなりません。
+
パラメータ名: time
+
   場所 System.Globalization.GregorianCalendarHelper.CheckTicksRange(Int64 ticks)
+
   場所 System.Globalization.GregorianCalendarHelper.GetDatePart(Int64 ticks, Int32 part)
+
   場所 System.Globalization.GregorianCalendarHelper.GetYear(DateTime time)
+
   場所 System.Globalization.JapaneseCalendar.GetYear(DateTime time)
+
   場所 Sample.Main()
+
}}
+

          
+
スローされている例外のメッセージにもあるとおり、JapaneseCalendarクラスで実装される暦ではグレゴリオ暦1868年9月8日より前の日付は定義されていません。
+

          
+
**日時の加減算
+
DateTime型ではグレゴリオ暦が用いられるため、1年が12ヶ月365日、1週が7日、グレゴリオ暦での閏年の定義に基づいて日時の加減算が行われます。 Calendarクラスを用いることで、特定の暦での年・月・週および置閏の規則に基づいた日時の加減算を行うことが出来ます。 次の例では、.NET Frameworkで実装されている暦を使って基準となる日から数年・数ヶ月・数週前後の日付を求めています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    Calendar[] calendars = new Calendar[] {
+
      new GregorianCalendar(),
+
      new JapaneseCalendar(),
+
      new JapaneseLunisolarCalendar(),
+
      new JulianCalendar(),
+
      new HebrewCalendar(),
+
      new HijriCalendar(),
+
    };
+

          
+
    // 書式指定文字"D"の書式を"yyyy-MM-dd"に変更
+
    Thread.CurrentThread.CurrentCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
+
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd";
+

          
+
    // 基準となる日付
+
    DateTime baseDateTime = new DateTime(2001, 1, 1);
+

          
+
    Console.WriteLine("{0,-25}|{1,-12}|{2,-12}|{3,-12}|{4,-12}|{5,-12}|{6,-12}|{7,-12}|{8,-12}|{9,-12}|{10,-12}|{11,-12}|{12,-12}|{13,-12}|{14,-12}|{15,-12}|",
+
                      "Calendar",
+
                      "-10 years", "-1 year", "-12months", "-3 months", "-1 month", "-4 weeks", "-1 week",
+
                      "0",
+
                      "+1 week", "+4 week", "+1 month", "+3 months", "+12 months", "+1 year", "+10 years");
+

          
+
    Console.WriteLine(new string('-', 220));
+

          
+
    foreach (Calendar calendar in calendars)
+
    {
+
      Console.WriteLine("{0,-25}|{1,-12:D}|{2,-12:D}|{3,-12:D}|{4,-12:D}|{5,-12:D}|{6,-12:D}|{7,-12:D}|{8,-12:D}|{9,-12:D}|{10,-12:D}|{11,-12:D}|{12,-12:D}|{13,-12:D}|{14,-12:D}|{15,-12:D}|",
+
                        calendar.GetType().Name,
+
                        calendar.AddYears(baseDateTime, -10),   // 10年前
+
                        calendar.AddYears(baseDateTime, -1),    // 1年前
+
                        calendar.AddMonths(baseDateTime, -12),  // 12ヶ月前
+
                        calendar.AddMonths(baseDateTime, -3),   // 3ヶ月前
+
                        calendar.AddMonths(baseDateTime, -1),   // 1ヶ月前
+
                        calendar.AddWeeks(baseDateTime, -4),    // 4週間前
+
                        calendar.AddWeeks(baseDateTime, -1),    // 1週間前
+
                        baseDateTime,
+
                        calendar.AddWeeks(baseDateTime, +1),    // 1週間後
+
                        calendar.AddWeeks(baseDateTime, +4),    // 4週間後
+
                        calendar.AddMonths(baseDateTime, +1),   // 1ヶ月後
+
                        calendar.AddMonths(baseDateTime, +3),   // 3ヶ月後
+
                        calendar.AddMonths(baseDateTime, +12),  // 12ヶ月後
+
                        calendar.AddYears(baseDateTime, +1),    // 1年後
+
                        calendar.AddYears(baseDateTime, +10));  // 10年後
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim calendars() As Calendar = New Calendar() { _
+
      New GregorianCalendar(), _
+
      New JapaneseCalendar(), _
+
      New JapaneseLunisolarCalendar(), _
+
      New JulianCalendar(), _
+
      New HebrewCalendar(), _
+
      New HijriCalendar() _
+
    }
+

          
+
    ' 書式指定文字"D"の書式を"yyyy-MM-dd"に変更
+
    Thread.CurrentThread.CurrentCulture = CType(CultureInfo.InvariantCulture.Clone(), CultureInfo)
+
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd"
+

          
+
    ' 基準となる日付
+
    Dim baseDateTime As New DateTime(2001, 1, 1)
+

          
+
    Console.WriteLine("{0,-25}|{1,-12}|{2,-12}|{3,-12}|{4,-12}|{5,-12}|{6,-12}|{7,-12}|{8,-12}|{9,-12}|{10,-12}|{11,-12}|{12,-12}|{13,-12}|{14,-12}|{15,-12}|", _
+
                      "Calendar", _
+
                      "-10 years", "-1 year", "-12 months", "-3 months", "-1 month", "-4 weeks", "-1 week", _
+
                      "0", _
+
                      "+1 week", "+4 week", "+1 month", "+3 months", "+12 months", "+1 year", "+10 years")
+

          
+
    Console.WriteLine(New String("-"c, 220))
+

          
+
    For Each calendar As Calendar In calendars
+
      Console.WriteLine("{0,-25}|{1,-12:D}|{2,-12:D}|{3,-12:D}|{4,-12:D}|{5,-12:D}|{6,-12:D}|{7,-12:D}|{8,-12:D}|{9,-12:D}|{10,-12:D}|{11,-12:D}|{12,-12:D}|{13,-12:D}|{14,-12:D}|{15,-12:D}|", _
+
                        calendar.GetType().Name, _
+
                        calendar.AddYears(baseDateTime, -10), _
+
                        calendar.AddYears(baseDateTime, -1), _
+
                        calendar.AddMonths(baseDateTime, -12), _
+
                        calendar.AddMonths(baseDateTime, -3), _
+
                        calendar.AddMonths(baseDateTime, -1), _
+
                        calendar.AddWeeks(baseDateTime, -4), _
+
                        calendar.AddWeeks(baseDateTime, -1), _
+
                        baseDateTime, _
+
                        calendar.AddWeeks(baseDateTime, +1), _
+
                        calendar.AddWeeks(baseDateTime, +4), _
+
                        calendar.AddMonths(baseDateTime, +1), _
+
                        calendar.AddMonths(baseDateTime, +3), _
+
                        calendar.AddMonths(baseDateTime, +12), _
+
                        calendar.AddYears(baseDateTime, +1), _
+
                        calendar.AddYears(baseDateTime, +10))
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
Calendar                 |-10 years   |-1 year     |-12months   |-3 months   |-1 month    |-4 weeks    |-1 week     |0           |+1 week     |+4 week     |+1 month    |+3 months   |+12 months  |+1 year     |+10 years   |
+
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
GregorianCalendar        |1991-01-01  |2000-01-01  |2000-01-01  |2000-10-01  |2000-12-01  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-02-01  |2001-04-01  |2002-01-01  |2002-01-01  |2011-01-01  |
+
JapaneseCalendar         |1991-01-01  |2000-01-01  |2000-01-01  |2000-10-01  |2000-12-01  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-02-01  |2001-04-01  |2002-01-01  |2002-01-01  |2011-01-01  |
+
JapaneseLunisolarCalendar|1990-12-23  |2000-01-13  |2000-01-13  |2000-10-04  |2000-12-02  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-01-30  |2001-03-31  |2001-12-21  |2001-12-21  |2011-01-10  |
+
JulianCalendar           |1991-01-01  |2000-01-01  |2000-01-01  |2000-10-02  |2000-12-02  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-02-01  |2001-04-01  |2002-01-01  |2002-01-01  |2011-01-01  |
+
HebrewCalendar           |1990-12-23  |1999-12-15  |2000-01-13  |2000-10-05  |2000-12-03  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-01-30  |2001-03-30  |2001-12-21  |2001-12-21  |2010-12-13  |
+
HijriCalendar            |1991-04-20  |2000-01-12  |2000-01-12  |2000-10-04  |2000-12-02  |2000-12-04  |2000-12-25  |2001-01-01  |2001-01-08  |2001-01-29  |2001-01-30  |2001-03-30  |2001-12-21  |2001-12-21  |2010-09-14  |
+
}}
+

          
+
結果からも分かるとおり、ユリウス暦(&msdn(netfx,member,System.Globalization.JulianCalendar){JulianCalendar};)、ヘブライ暦(&msdn(netfx,member,System.Globalization.HebrewCalendar){HebrewCalendar};)やイスラム歴(&msdn(netfx,member,System.Globalization.HijriCalendar){HijriCalendar};)では一年・一月の数え方がグレゴリオ暦(&msdn(netfx,member,System.Globalization.GregorianCalendar){GregorianCalendar};)とは異なるので、グレゴリオ暦での一年後・一月後とは異なる日付となります。
+

          
+
和暦(JapaneseCalendar)では年号が異なるだけでそれ以外はグレゴリオ暦と同じなので、加減算の結果は同じとなります。 なお、&msdn(netfx,member,System.Globalization.JapaneseCalendar){JapaneseLunisolarCalendar};は太陽年および太陰月に基づく太陰太陽暦を実装するクラスです。
+

          
+
#navi(..)
+

          

programming/netfx/locale/index.wiki.txt

current previous
1,17 1,641
 
${smdncms:title,ロケール(カルチャ)}
${smdncms:title,ロケール(カルチャ)}
+
${smdncms:header_title,ロケール/カルチャ (System.Globalization)}
+
${smdncms:keywords,ロケール,カルチャ,国,地域,言語,ローカライズ,System.Globalization}
 
${smdncms:meta,toc-amazonlivelink-keyword,books-jp,.net framework}
${smdncms:meta,toc-amazonlivelink-keyword,books-jp,.net framework}
-
System.Globalization名前空間にあるクラスを利用すれば、カレンダーや書式などの部分を国際化対応することができます。
-
#googleadunit
 

        

        
~
.NET Frameworkにおいて、使用される言語や数値・日時・通貨などの書式、年号・暦などのロケールに関する情報は&msdn(netfx,ns,System.Globalization){System.Globalization名前空間};にあるクラス群を通して取得・参照・設定することが出来ます。 .NET Frameworkでは、これらを表す場合''カルチャ''という用語が用いられ、''ロケール''はアンマネージでの実装を表すように使い分けがなされています。 ここでは''カルチャ''という用語を使って、ロケールに関するクラスとそれらを使った操作について解説します。
*現在のカルチャ情報を取得
-
ひとまず国際化というのを置いておいて、まずは自分の国(現在のカルチャ)の情報を取得することから始めます。 CultureInfoクラスは、カルチャに関する様々な情報を扱うためのクラスです。 このクラスの共有読み取り専用プロパティであるCurrentCultureを参照すれば、現在のカルチャ(OSが使用しているカルチャ)の情報を取得することができます。
 

        

        
~
-ページ一覧
#code(vb){{
~
#ls2_1(noroot,pathsort)
Imports System
~
-関連するページ
Imports System.Globalization
~
--[[programming/netfx/comparison]]

          
~
--[[programming/netfx/string]]
Module Globalization
~

          

          
~
注意1: この文章ではローカライズや国際化対応をする際に留意しておくべき事項については解説しますが、その具体的な手法については解説しません。 必要に応じて他のドキュメントを参照してください。
    Sub Main()
~
注意2: ブラウザで使用しているフォントによっては、この文章の一部で正しく表示されない文字があるかもしれません。

          
~
注意3: この文章にある実行結果の一部は、実行環境によっては異なる場合があるかもしれません。
        ' 現在のカルチャ
-
        Dim culture As CultureInfo = CultureInfo.CurrentCulture
-

          
-
        ' カルチャ名
-
        Console.WriteLine(culture.Name)
-
        Console.WriteLine(culture.DisplayName)
-
        Console.WriteLine(culture.EnglishName)
-
        Console.WriteLine(culture.NativeName)
-
        Console.WriteLine(culture.ThreeLetterISOLanguageName)
-

          
-
        ' カルチャ情報
-
        Console.WriteLine(culture.Calendar)
-
        Console.WriteLine(culture.DateTimeFormat.LongDatePattern)
-
        Console.WriteLine(culture.DateTimeFormat.LongTimePattern)
-
        Console.WriteLine(culture.DateTimeFormat.ShortDatePattern)
-
        Console.WriteLine(culture.DateTimeFormat.ShortTimePattern)
-
        Console.WriteLine(culture.TextInfo.ANSICodePage)
-
        Console.WriteLine(culture.NumberFormat.CurrencySymbol)
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
ja-JP
-
日本語 (日本)
-
Japanese (Japan)
-
日本語 (日本)
-
jpn
-
System.Globalization.GregorianCalendar
-
yyyy'年'M'月'd'日'
-
H:mm:ss
-
yyyy/MM/dd
-
H:mm
-
932
-
\
-
Press any key to continue
-
}}
-

          
-
前半のコードではカルチャ名に関する文字列を出力しています。 基本的なカルチャの名前は一行目の出力のように「xx-XX」となっています。 前の二文字は言語を表し、後の二文字は国(地域)を表します。 たとえば英語-米国の場合は「en-US」となります。 そのほかにも表記方法が数種類あり、前半の出力がそれを出力したものです。
-

          
-
後半のコードは、カルチャ特有の情報を取得し、表示するものです。 Calenderプロパティは使用するカレンダーを表し、 Calendarクラスの派生クラスになります。 この場合ではGregorianCalendarクラス、つまりグレゴリオ暦を使用していることがわかります。 DateTimeFormat、NumberFormatからは日時・数値などの表記に関する情報、TextInfoからはコードページなどに関する情報が取得できます。
-

          
-
*他のカルチャ情報を取得
-
このように現在のカルチャについての情報を取得できたわけですが、当然他のカルチャの情報を取得することもできます。 CultureInfoのインスタンスを生成する際に、コンストラクタにカルチャ名を指定することでそのカルチャの情報を記述したCultureInfoオブジェクトを取得できます。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        ' 他のカルチャ情報 (英語 - 米国)
-
        Dim culture As New CultureInfo("en-US")
-

          
-
        ' カルチャ名
-
        Console.WriteLine("{0}, {1}", culture.Name, culture.NativeName)
-

          
-
        ' カルチャ情報
-
        Console.WriteLine(culture.Calendar)
-
        Console.WriteLine(culture.DateTimeFormat.LongDatePattern)
-
        Console.WriteLine(culture.DateTimeFormat.LongTimePattern)
-
        Console.WriteLine(culture.DateTimeFormat.ShortDatePattern)
-
        Console.WriteLine(culture.DateTimeFormat.ShortTimePattern)
-
        Console.WriteLine(culture.TextInfo.ANSICodePage)
-
        Console.WriteLine(culture.NumberFormat.CurrencySymbol)
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
en-US, English (United States)
-
System.Globalization.GregorianCalendar
-
dddd, MMMM dd, yyyy
-
h:mm:ss tt
-
M/d/yyyy
-
h:mm tt
-
1252
-
$
-
Press any key to continue
-
}}
-

          
-
この例では特定のカルチャの情報を取得していますが、使用可能なすべてのカルチャ情報を取得するにはCultureInfo.GetCultures() メソッドを使用します。 この例では出力される文字の関係上、Debugに出力しています。 また、実行結果は CultureTypes.AllCulturesではなくCultureTypes.SpecificCulturesを指定して出力したものです。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Dim cultures() As CultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures)
-
        Dim culture As CultureInfo
-

          
-
        Debug.WriteLine("Cultures: " + cultures.Length.ToString())
-

          
-
        For Each culture In cultures
-

          
-
            Debug.WriteLine(culture.Name + ", " + culture.NativeName)
-

          
-
        Next
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(0.png,実行結果)
-

          
-
*カルチャに対応した書式
-
様々な国・地域のカルチャ情報を取得できたら、後はそれを活用するだけです。 次の例は、Decimal型の値を通貨として文字列化し、その際の書式をカルチャに依存した書式にするようにしているものです。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Dim currency As Decimal = 123456.78D
-

          
-
        ' 現在のカルチャ(日本)
-
        OutputCurrency(currency, CultureInfo.CurrentCulture)
-

          
-
        ' アメリカ
-
        OutputCurrency(currency, New CultureInfo("en-US"))
-

          
-
        ' カナダ
-
        OutputCurrency(currency, New CultureInfo("en-CA"))
-

          
-
        ' イギリス
-
        OutputCurrency(currency, New CultureInfo("en-GB"))
-

          
-
        ' フランス
-
        OutputCurrency(currency, New CultureInfo("fr-FR"))
-

          
-
        ' ドイツ
-
        OutputCurrency(currency, New CultureInfo("de-DE"))
-

          
-
        ' イタリア
-
        OutputCurrency(currency, New CultureInfo("it-IT"))
-

          
-
        ' ロシア
-
        OutputCurrency(currency, New CultureInfo("ru-RU"))
-

          
-
    End Sub
-

          
-
    Sub OutputCurrency(ByVal currency As Decimal, ByVal culture As CultureInfo)
-

          
-
        Debug.WriteLine(culture.DisplayName + ": " + currency.ToString("C", culture.NumberFormat))
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(1.png,実行結果)
-

          
-
この例ではG8各国のカルチャ情報から通貨形式の書式を取得しています。 ToString()メソッドには、カルチャ情報に依存した形式で出力するバージョンがあります。 今回はそれを用いています。 CultureInfo.NumberFormatプロパティはそのカルチャの数値に関する書式を記述したクラスです。 これをToString()メソッドに渡すことによってその書式に従って数値が文字列化されます。 ちなみに、一つ目の引数である"C"は、その数値を通貨として出力するように指定する数値書式指定文字列というものです。 この実行結果を見てわかるとおり、単なるDecimal型の数値を渡したにも関わらず、通貨文字がその国で用いられているものになったり、通貨文字が先頭に来るか末尾に来るかが変わっています。 また、日本円では通常小数点以下(銭に相当する部分)は扱わないので、この書式では小数点以下が四捨五入され出力されていません。
-

          
-
さらに、数値に関しても各国で表記方法が異なるので、その場合についても見てみることにします。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Dim intValue As Integer = 12345678
-
        Dim realValue As Double = 12345.678
-

          
-
        ' 現在のカルチャ(日本)
-
        OutputValue(intValue, realValue, CultureInfo.CurrentCulture)
-

          
-
        ' アメリカ
-
        OutputValue(intValue, realValue, New CultureInfo("en-US"))
-

          
-
        ' カナダ
-
        OutputValue(intValue, realValue, New CultureInfo("en-CA"))
-

          
-
        ' イギリス
-
        OutputValue(intValue, realValue, New CultureInfo("en-GB"))
-

          
-
        ' フランス
-
        OutputValue(intValue, realValue, New CultureInfo("fr-FR"))
-

          
-
        ' ドイツ
-
        OutputValue(intValue, realValue, New CultureInfo("de-DE"))
-

          
-
        ' イタリア
-
        OutputValue(intValue, realValue, New CultureInfo("it-IT"))
-

          
-
        ' ロシア
-
        OutputValue(intValue, realValue, New CultureInfo("ru-RU"))
-

          
-
    End Sub
-

          
-
    Sub OutputValue(ByVal i As Integer, ByVal r As Double, ByVal culture As CultureInfo)
-

          
-
        Debug.WriteLine(culture.DisplayName + ": " + _
-
         i.ToString("D", culture.NumberFormat) + _
-
         "  " + r.ToString("E", culture.NumberFormat) + _
-
         "  " + r.ToString("F", culture.NumberFormat) + _
-
         "  " + r.ToString("G", culture.NumberFormat) + _
-
         "  " + r.ToString("N", culture.NumberFormat))
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(2.png,実行結果)
-

          
-
まず始めに、数値書式指定文字列について説明すると、「D」は十進、「E」は指数形式、「F」は固定小数点、「G」は一般表記、「N」は数値として書式指定するものです。 この実行結果のように、小数点の表記について「 . (ピリオド)」を用いたり「 , (カンマ)」と国によって小数点の表記が異なります。 さらに、三桁毎の区切り文字も、使用したり使用しなかったりする場合があります。
-

          
-
通貨や数値だけでなく、日付・時刻の表記もローカライズすることができます。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Dim dtmNow As DateTime = DateTime.Now
-

          
-
        ' 現在のカルチャ(日本)
-
        OutputDateTime(dtmNow, CultureInfo.CurrentCulture)
-

          
-
        ' アメリカ
-
        OutputDateTime(dtmNow, New CultureInfo("en-US"))
-

          
-
        ' カナダ
-
        OutputDateTime(dtmNow, New CultureInfo("en-CA"))
-

          
-
        ' イギリス
-
        OutputDateTime(dtmNow, New CultureInfo("en-GB"))
-

          
-
        ' フランス
-
        OutputDateTime(dtmNow, New CultureInfo("fr-FR"))
-

          
-
        ' ドイツ
-
        OutputDateTime(dtmNow, New CultureInfo("de-DE"))
-

          
-
        ' イタリア
-
        OutputDateTime(dtmNow, New CultureInfo("it-IT"))
-

          
-
        ' ロシア
-
        OutputDateTime(dtmNow, New CultureInfo("ru-RU"))
-

          
-
        ' 韓国
-
        OutputDateTime(dtmNow, New CultureInfo("ko-KR"))
-

          
-
        ' 中国
-
        OutputDateTime(dtmNow, New CultureInfo("zh-CN"))
-

          
-
    End Sub
-

          
-
    Sub OutputDateTime(ByVal dtm As DateTime, ByVal culture As CultureInfo)
-

          
-
        Debug.WriteLine(culture.DisplayName + ": " + dtm.ToString(culture.DateTimeFormat))
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(3.png,実行結果)
-

          
-
*カルチャに対応した月・曜日
-
書式や通貨単位だけがカルチャに依存するものではありません。 暦もカルチャに依存します。 日本がそのよい例です。 日本では基本的にはグレゴリオ歴を採用していますが、同時に和暦というものも存在し、年号を用いて「平成〜年」とか「昭和〜年」という表記をします。
-

          
-
さらに、曜日の呼び方や月の名前などもカルチャによって異なります。 次の例ではカルチャ情報から日時に関する情報を取得し、そこから様々なカルチャ依存の情報を取り出しています。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        ' カルチャのインスタンスを生成
-
        Dim culture As New CultureInfo("ja-JP")
-

          
-
        ' カルチャから日時のフォーマット情報を取得
-
        Dim format As DateTimeFormatInfo = culture.DateTimeFormat
-

          
-
        ' 現在のカレンダ
-
        Debug.WriteLine(format.Calendar.ToString())
-

          
-
        ' 曜日名を列挙
-
        EnumerateDayNames(format)
-

          
-
        ' 月の名前を列挙
-
        EnumerateMonthNames(format)
-

          
-
        ' 時代(年号)を列挙
-
        EnumerateEras(format)
-

          
-

          
-

          
-
        ' 暦を和暦に設定
-
        format.Calendar = New JapaneseCalendar()
-

          
-
        ' 現在のカレンダ
-
        Debug.WriteLine(format.Calendar.ToString())
-

          
-
        ' 時代(年号)を列挙
-
        EnumerateEras(format)
-

          
-
    End Sub
-

          
-
    ' 曜日を表す文字列を列挙するメソッド
-
    Sub EnumerateDayNames(ByVal format As DateTimeFormatInfo)
-

          
-
        Dim dayName As String
-

          
-
        For Each dayName In format.DayNames
-

          
-
            Debug.Write(dayName + ", ")
-

          
-
        Next
-

          
-
        Debug.WriteLine("")
-

          
-
    End Sub
-

          
-
    ' 月を表す文字列を列挙するメソッド
-
    Sub EnumerateMonthNames(ByVal format As DateTimeFormatInfo)
-

          
-
        Dim monthName As String
-

          
-
        For Each monthName In format.MonthNames
-

          
-
            Debug.Write(monthName + ", ")
-

          
-
        Next
-

          
-
        Debug.WriteLine("")
-

          
-
    End Sub
-

          
-
    ' 時代(年号)を列挙するメソッド
-
    Sub EnumerateEras(ByVal format As DateTimeFormatInfo)
-

          
-
        Dim era As Integer
-

          
-
        For Each era In format.Calendar.Eras
-

          
-
            Debug.WriteLine(era.ToString() + " : " + format.GetEraName(era))
-

          
-
        Next
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(4.png,実行結果)
-

          
-
この例では曜日名、月名、年号などを取得しています。 またDateTimeFormatInfoクラスのCalendarプロパティに和暦を表す JapanezeCalendarクラスのインスタンスを代入してその違いを見ています。 実行結果から分かるとおり、初期状態では GregorianCalendarが代入されています。 グレゴリオ暦で年号を列挙した場合は「西暦」だけですが、和暦の場合は「平成」、「昭和」などが出力されます。 Calendarクラスについてはこの次以降で説明します。
-

          
-
これ以外の情報として、曜日名と月名を取得していますが、月名は十三項目存在しているかのような出力になっています。 これは、閏月などで第十三月が存在する暦を考慮したものと考えられます。 次のコードでは、各カルチャでは曜日・月の名前をどのように記述するかを調べることができます。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        ' カルチャのインスタンスを生成
-
        Dim cultures() As CultureInfo = { _
-
         New CultureInfo("ja-JP"), _
-
         New CultureInfo("en-US"), _
-
         New CultureInfo("de-DE"), _
-
         New CultureInfo("fr-FR"), _
-
         New CultureInfo("ru-RU"), _
-
         New CultureInfo("ko-KR"), _
-
         New CultureInfo("zh-CN")}
-

          
-
        Dim culture As CultureInfo
-

          
-
        Dim format As DateTimeFormatInfo
-

          
-
        For Each culture In cultures
-

          
-
            ' カルチャから日時のフォーマット情報を取得
-
            format = culture.DateTimeFormat
-

          
-
            Debug.WriteLine(culture.ToString())
-

          
-
            ' 曜日名を列挙
-
            EnumerateDayNames(format)
-

          
-
            ' 月の名前を列挙
-
            EnumerateMonthNames(format)
-

          
-
        Next
-

          
-
    End Sub
-

          
-
    ' 曜日を表す文字列を列挙するメソッド
-
    Sub EnumerateDayNames(ByVal format As DateTimeFormatInfo)
-

          
-
        ' 省略
-

          
-
    End Sub
-

          
-
    ' 月を表す文字列を列挙するメソッド
-
    Sub EnumerateMonthNames(ByVal format As DateTimeFormatInfo)
-

          
-
        ' 省略
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#ref(5.png,実行結果)
-

          
-
*カルチャに対応した暦(こよみ)
-
先程述べたように、曜日・月の名前のほかにも暦も当然カルチャに依存します。 世界にはグレゴリオ暦ではなくヘブライ暦や回教暦を採用している国・地域もあります。 そのために必ずしも「2003/01/01」が西暦(グレゴリオ暦)を表すとは限らなくなります。 そこで使用されるのがCalendarクラスです。 このクラス自体は抽象クラスですが、この派生クラスである GregorianCalendar や HebrewCalendar では一年の日数、一月の日数などの暦に関する処理が実装されています。
-

          
-
次のコードは和暦で表した日付をシステムが現在使用している暦(このコードを実行した環境ではグレゴリオ暦)になおして表示するコードです。 システムの暦を調べるには、「コントロールパネル」の「地域と言語のオプション」にある「地域オプション」タブで「カスタマイズ」をクリックし、表示されるダイアログの日付タブで調べることができます。 また、ここを変更することで異なる実行結果を得ることもできます。
-

          
-
#ref(6.jpg,暦の確認・変更)
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Dim japanese As New JapaneseCalendar()
-

          
-
        Dim gregorian As New GregorianCalendar()
-

          
-
        Dim gregDateTime As DateTime
-

          
-
        ' 和暦の平成15年2月7日をグレゴリオ暦(西暦)に直す
-
        gregDateTime = japanese.ToDateTime(15, 2, 7, 0, 0, 0, 0, japanese.CurrentEra)
-

          
-
        Console.WriteLine(gregDateTime)
-

          
-
        ' 西暦でその年を取得する
-
        Console.WriteLine("Gregorian: {0}", gregorian.GetYear(gregDateTime))
-

          
-
        ' 和暦でその年を取得する
-
        Console.WriteLine("Japanese: {0}", japanese.GetYear(gregDateTime))
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
2003/02/07 0:00:00
-
Gregorian: 2003
-
Japanese: 15
-
Press any key to continue
-
}}
-

          
-
実行した環境では西暦を使用していたので、ToDateTime()メソッドの戻り値は西暦になります。 次のコードは、システムの暦での2001年1月1日から、各暦での一年後および十年後の日付をシステムの暦で取得するものです。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        ' システムの暦での2001年1月1日
-
        Dim dtm As DateTime = New DateTime(2001, 1, 1)
-

          
-
        ' 和暦
-
        Dim japanese As New JapaneseCalendar()
-

          
-
        ' ヘブライ暦
-
        Dim hebrew As New HebrewCalendar()
-

          
-
        ' 回教暦
-
        Dim hijri As New HijriCalendar()
-

          
-
        ' 西暦
-
        Dim gregorian As New GregorianCalendar()
-

          
-

          
-
        ' システムの暦を表示
-
        Console.WriteLine("Using {0}", CultureInfo.CurrentCulture.Calendar)
-

          
-
        ' 日付を表示
-
        Console.WriteLine(dtm)
-

          
-
        ' 和暦での一年後、十年後
-
        Console.WriteLine("Japanese:  {0}, {1}", japanese.AddYears(dtm, 1), japanese.AddYears(dtm, 10))
-

          
-
        ' ヘブライ暦での一年後、十年後
-
        Console.WriteLine("Hebrew:    {0}, {1}", hebrew.AddYears(dtm, 1), hebrew.AddYears(dtm, 10))
-

          
-
        ' 回教暦での一年後、十年後
-
        Console.WriteLine("Hijri:     {0}, {1}", hijri.AddYears(dtm, 1), hijri.AddYears(dtm, 10))
-

          
-
        ' 西暦での一年後、十年後
-
        Console.WriteLine("Gregorian: {0}, {1}", gregorian.AddYears(dtm, 1), gregorian.AddYears(dtm, 10))
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
Using System.Globalization.GregorianCalendar
-
2001/01/01 0:00:00
-
Japanese:  2002/01/01 0:00:00, 2011/01/01 0:00:00
-
Hebrew:    2001/12/21 0:00:00, 2010/12/13 0:00:00
-
Hijri:     2001/12/21 0:00:00, 2010/09/14 0:00:00
-
Gregorian: 2002/01/01 0:00:00, 2011/01/01 0:00:00
-
Press any key to continue
-
}}
-

          
-
このように、ヘブライ暦や回教暦では一年の日数・一月の日数などがグレゴリオ暦とは異なるので、グレゴリオ暦での一年後・十年後とは異なった値になります。 また、和暦については年号だけが異なり、基本的にはグレゴリオ暦と同じなので日付のずれはありません。 この例ではAddYears()メソッドを使用しましたが、場合によっては月数や日数を加減算することもできます。
-

          
-
*現在のスレッドのカルチャを変更する
-
今まではシステムのカルチャ設定に基づいたコーディングをしてきましたが、場合によっては現在のカルチャを変更したくなる場合があります。 そのような場合に対応するため、現在のスレッドのカルチャを変えることが可能になっています。 次のコードではカルチャを途中で「en-US (英語・米国)」に変えています。
-

          
-
#code(vb){{
-
Option Strict On
-

          
-
Imports System
-
Imports System.Globalization
-
Imports System.Threading
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        Console.WriteLine("現在のカルチャ: {0}", CultureInfo.CurrentCulture.NativeName)
-

          
-
        ' 通貨の表示
-
        Console.WriteLine("{0:C}", 123456.789)
-

          
-
        ' 日時の表示
-
        Console.WriteLine("{0}", DateTime.Now)
-

          
-

          
-
        ' 現在のスレッドのカルチャを変更
-
        Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
-

          
-

          
-
        Console.WriteLine("現在のカルチャ: {0}", CultureInfo.CurrentCulture.NativeName)
-

          
-
        ' 通貨の表示
-
        Console.WriteLine("{0:C}", 123456.789)
-

          
-
        ' 日時の表示
-
        Console.WriteLine("{0}", DateTime.Now)
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
現在のカルチャ: 日本語 (日本)
-
\123,457
-
2003/12/14 2:40:53
-
現在のカルチャ: English (United States)
-
$123,456.79
-
12/14/2003 2:40:53 AM
-
Press any key to continue
-
}}
-

          
-
実際にカルチャを変更しているコードが21行目です。 CurrentThread.CurrentCultureプロパティに新しい CultureInfoクラスのインスタンスを指定することでカルチャを変更しています。 さらに、これを利用して暦を変えることも可能です。
-

          
-
#code(vb){{
-
Imports System
-
Imports System.Globalization
-
Imports System.Threading
-

          
-
Module Globalization
-

          
-
    Sub Main()
-

          
-
        ' 日時の表示
-
        Console.WriteLine("{0}", DateTime.Now)
-

          
-
        ' 新しいカルチャのインスタンスを生成
-
        Dim culture As New CultureInfo("ja-JP")
-

          
-
        ' カルチャに新しく和暦を指定 
-
        culture.DateTimeFormat.Calendar = New JapaneseCalendar()
-

          
-
        ' 現在のスレッドのカルチャを変更
-
        Thread.CurrentThread.CurrentCulture = culture
-

          
-
        ' 日時の表示
-
        Console.WriteLine("{0}", DateTime.Now)
-

          
-
    End Sub
-

          
-
End Module
-
}}
-

          
-
#prompt(実行結果){{
-
2003/12/14 2:41:23
-
平成 15/12/14 2:41:23
-
Press any key to continue
-
}}