Csharp/CSharp Tutorial/I18N Internationalization/Culture Format

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

An culture-friendly money matching expression

<source lang="csharp">using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Text.RegularExpressions; using System.Reflection; public class MainClass{

  public static void Main(){
       string[] money = new string[] { "$0.99", "$0,99", "$1000000.00", "$10.25", "$90,000.00", "$90.000,00", "$1,000,000.00", "$1,000000.00" };
       NumberFormatInfo info = CultureInfo.CurrentCulture.NumberFormat;
       Regex moneyint = new Regex(String.Format(@"\{0}(\dШаблон:1,3\{0})*\d+\{1}\dШаблон:2",
           info.CurrencyGroupSeparator, info.CurrencyDecimalSeparator));
       foreach (string m in money)
       {
           Console.WriteLine("{0}: {1}", m, moneyint.IsMatch(m));
       }
  }

}</source>

$0.99: False
$0,99: False
$1000000.00: False
$10.25: False
$90,000.00: True
$90.000,00: False
$1,000,000.00: True
$1,000000.00: True

Culture formatting: en-GB

<source lang="csharp">using System; using System.Globalization; class MainClass {

 public static void Main() 
 {
   DateTime dtNow = DateTime.Now;
   Double curOriginal = 12345.67;
   CultureInfo ci2 = new CultureInfo("en-GB");
   string sLocalizedDate2 = dtNow.ToString("d", ci2);
   string sLocalizedCur2 = curOriginal.ToString("c", ci2);
   Console.WriteLine(sLocalizedDate2);
   Console.WriteLine(sLocalizedCur2);
 }

}</source>

25/03/2007
?12,345.67

Culture formatting: en-US

<source lang="csharp">using System; using System.Globalization; class MainClass {

 public static void Main() 
 {
   DateTime dtNow = DateTime.Now;
   Double curOriginal = 12345.67;
   CultureInfo ci = new CultureInfo("en-US");
   string sLocalizedDate = dtNow.ToString("d", ci);
   string sLocalizedCur = curOriginal.ToString("c", ci);
   // print them out
   Console.WriteLine(sLocalizedDate);
   Console.WriteLine(sLocalizedCur);
 }

}</source>

3/25/2007
$12,345.67

Culture information: Currency Format

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               double number = -100299.55;
               sw.WriteLine("    Currency: {0}", number.ToString("C", ci.NumberFormat));
           }
       }
   }

}</source>

Currency: ($100,299.55)
    Currency: -?100,299.55
    Currency: -$100,299.55
    Currency: -100.299,55 �
    Currency: -?100,300

Culture information: Days

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               sw.Write("    Days: ");
               foreach (string d in ci.DateTimeFormat.DayNames)
                   sw.Write(", {0}", d);
               sw.WriteLine();
           }
       }
   }

}</source>

Days: , Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
    Days: , Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
    Days: , domingo, lunes, martes, mi�rcoles, jueves, viernes, s�bado
    Days: , Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag
    Days: , ???, ???, ???, ???, ???, ???, ???

Culture information: DisplayName, NativeName and LCID

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               sw.WriteLine("{0}: {1}", ci.Name, ci.DisplayName);
               sw.WriteLine("    English Name: {0}", ci.EnglishName);
               sw.WriteLine("    Native Name: {0}", ci.NativeName);
               sw.WriteLine("    LCID: {0}", ci.LCID);
           }
       }
   }

}</source>

en-US: English (United States)
    English Name: English (United States)
    Native Name: English (United States)
    LCID: 1033
en-GB: English (United Kingdom)
    English Name: English (United Kingdom)
    Native Name: English (United Kingdom)
    LCID: 2057
es-MX: Spanish (Mexico)
    English Name: Spanish (Mexico)
    Native Name: Espa?ol (M�xico)
    LCID: 2058
de-DE: German (Germany)
    English Name: German (Germany)
    Native Name: Deutsch (Deutschland)
    LCID: 1031
ja-JP: Japanese (Japan)
    English Name: Japanese (Japan)
    Native Name: ??? (??)
    LCID: 1041

Culture information: Long Date Format and Short Date Format

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               DateTime dt = new DateTime(1980, 9, 12, 0, 30, 55);
               sw.WriteLine("Short Date Example: {0}", dt.ToString(ci.DateTimeFormat.ShortDatePattern, ci.DateTimeFormat));
               sw.WriteLine("Long Date Example: {0}", dt.ToString(ci.DateTimeFormat.LongDatePattern, ci.DateTimeFormat));
           }
       }
   }

}</source>

Short Date Example: 9/12/1980
Long Date Example: Friday, September 12, 1980
Short Date Example: 12/09/1980
Long Date Example: 12 September 1980
Short Date Example: 12/09/1980
Long Date Example: viernes, 12 de septiembre de 1980
Short Date Example: 12.09.1980
Long Date Example: Freitag, 12. September 1980
Short Date Example: 1980/09/12
Long Date Example: 1980?9?12?

Culture information: Months

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               sw.Write("    Months: ");
               foreach (string m in ci.DateTimeFormat.MonthNames)
                   sw.Write(", {0}", m);
               sw.WriteLine();
           }
       }
   }

}</source>

Months: , January, February, March, April, May, June, July, August, September, October, November
, December,
    Months: , January, February, March, April, May, June, July, August, September, October, November
, December,
    Months: , enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviemb
re, diciembre,
    Months: , Januar, Februar, M?rz, April, Mai, Juni, Juli, August, September, Oktober, November, D
ezember,
    Months: , 1?, 2?, 3?, 4?, 5?, 6?, 7?, 8?, 9?, 10?, 11?, 12?,

Culture information: Number Format

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               double number = -100299.55;
               sw.WriteLine("    Number Format: {0}", number.ToString(ci));
           }
       }
   }

}</source>

Number Format: -100299.55
    Number Format: -100299.55
    Number Format: -100299.55
    Number Format: -100299,55
    Number Format: -100299.55

Culture information: Number Group Separator

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               sw.WriteLine(ci.NumberFormat.NumberGroupSeparator);
           }
       }
   }

}</source>

,
,
,
.
,

Culture information: primary Calendar and optional Calendar

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
      string[] cultures = new string[] { "en-US", "en-GB", "es-MX", "de-DE", "ja-JP" };
       using (TextWriter sw = Console.Out)
       {
           foreach (string c in cultures)
           {
               CultureInfo ci = new CultureInfo(c);
               sw.Write("    Calendars: ");
               sw.Write("      {0} (primary)", ci.Calendar.GetType().Name);
               foreach (Calendar cal in ci.OptionalCalendars)
                   sw.Write(", {0}", cal.GetType().Name);
               sw.WriteLine();
           }
       }
   }

}</source>

Calendars:       GregorianCalendar (primary), GregorianCalendar, GregorianCalendar
    Calendars:       GregorianCalendar (primary), GregorianCalendar, GregorianCalendar
    Calendars:       GregorianCalendar (primary), GregorianCalendar
    Calendars:       GregorianCalendar (primary), GregorianCalendar
    Calendars:       GregorianCalendar (primary), GregorianCalendar, JapaneseCalendar, GregorianCale
ndar

Culture-specific formatting: en-US, en-GB, ja, ar

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Resources; using System.Text; using System.Threading; using System.Globalization; public class MainClass {

   public static void Main()
   {
       decimal money = 1250.75m;
       string[] cultures = { "en-US", "en-GB", "ja", "ar" };
       Console.OutputEncoding = Encoding.UTF8;
       foreach (string culture in cultures)
       {
           CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(culture);
           Console.WriteLine("{0} = {1}", cultureInfo.DisplayName,money.ToString("C", cultureInfo));
       }
   }

}</source>

Get datetime formatting info from a CultureInfo

<source lang="csharp">using System; using System.Globalization; class MainClass {

 public static void Main() 
 {
   CultureInfo ci = new CultureInfo("nl-BE");
   
   DateTimeFormatInfo dtfi = ci.DateTimeFormat;
   Console.WriteLine("Long date pattern: " + dtfi.LongDatePattern);
 }

}</source>

Long date pattern: dddd d MMMM yyyy

Get numeric formatting info from a CultureInfo

<source lang="csharp">using System; using System.Globalization; class MainClass {

 public static void Main() 
 {
   CultureInfo ci = new CultureInfo("nl-BE");
   NumberFormatInfo nfi = ci.NumberFormat;
   Console.WriteLine("Currency symbol: " + nfi.CurrencySymbol);
   Console.WriteLine("Decimal seperator: " + nfi.NumberDecimalSeparator);
 }

}</source>

Currency symbol: 
Decimal seperator: ,

Implement Format for different Culture Information

<source lang="csharp">using System; using System.Globalization; public sealed class ComplexNumber : IFormattable {

   public ComplexNumber( double real, double imaginary ) {
       this.real = real;
       this.imaginary = imaginary;
   }
   public override string ToString() {
       return ToString( "G", null );
   }
   public string ToString( string format, IFormatProvider formatProvider ) {
       string result = "(" + real.ToString(format, formatProvider) + " " + real.ToString(format, formatProvider) + ")";
       return result;
   }
  
   private readonly double real;
   private readonly double imaginary;

} public sealed class MainClass {

   static void Main() {
       ComplexNumber num1 = new ComplexNumber( 1.12345678, 2.12345678 );
       
       Console.WriteLine( "US format: {0}", num1.ToString( "F5", new CultureInfo("en-US") ) );
       Console.WriteLine( "DE format: {0}", num1.ToString( "F5", new CultureInfo("de-DE") ) );
       Console.WriteLine( "Object.ToString(): {0}",num1.ToString() );
   }

}</source>

Save CultureInfo, its DateTimeFormatInfo and NumberFormatInfo to a text file

<source lang="csharp">using System; using System.Globalization; using System.IO; class MainClass {

 public static void Main() 
 {
   CultureInfo ci = new CultureInfo("nl-BE");
   FileStream outStream = File.Create("CultureInfo.txt");
   StreamWriter sw = new StreamWriter(outStream);
   sw.WriteLine("Native Name: " + ci.NativeName);
   sw.WriteLine("English Name: " + ci.EnglishName);
   DateTimeFormatInfo dtfi = ci.DateTimeFormat;
   sw.WriteLine("Long date pattern: " + dtfi.LongDatePattern);
   NumberFormatInfo nfi = ci.NumberFormat;
   sw.WriteLine("Currency symbol: " + nfi.CurrencySymbol);
   sw.WriteLine("Decimal seperator: " + nfi.NumberDecimalSeparator);
   sw.Flush();
   sw.Close();
 }

}</source>

Use current culture to format currency

<source lang="csharp">using System; using System.Globalization; using System.Windows.Forms; public class MainClass {

   static void Main() {
       CultureInfo current  = CultureInfo.CurrentCulture;
       double money = 123.45;
       string localMoney = money.ToString( "C", current );
       MessageBox.Show( localMoney, "Local Money" );
   }

}</source>