C# - Usando Culture e RegionInfo
Hoje veremos como usar alguns dos recursos das classes CultureInfo e RegionInfo da plataforma  .NET.

A plataforma .NET trabalha com o conceito de culture para a linguagem alvo das aplicações.

Esse conceito é um código simples que contém uma string com dois caracteres que representam a linguagem e dois caracteres que representam o país, separados por um hífen.

Assim 'pt-BR' representa a língua portuguesa falada no Brasil, e, representa não só a linguagem escrita mas tudo que envolve a mesma como campos numéricos, monetários, datas, horários, etc.

Além disso existe dois conceitos importantes na plataforma .NET que são :

1 - neutral culture, ou cultura neutra, que é usado para formatar a linguagem de forma genérica sem definir o pais. Assim para formatar a aplicação para português sem definir o país basta usar a string 'pt'.

2 - culture invariant, ou cultura invariante, permite formatar strings com as escrevemos no código, independente da cultura.

No namespace System.Globalization temos duas classes importantes :

CultureInfo - Fornece informações sobre uma cultura específica (chamada de localidade para o desenvolvimento de código não gerenciado). As informações incluem os nomes da cultura, o sistema de escrita, o calendário usado, a ordem de classificação das cadeias de caracteres e a formatação de datas e números;

RegionInfo - Que contém informações sobre o país/região, e, não depende do idioma ou da cultura do usuário;

Nota: Lembrando que é a thread da aplicação que controla as informações de cultura da aplicação.

Para obter a lista de culturas disponíveis podemos usar o código abaixo:

        static void Main(string[] args)
        {
            CultureInfo[] specificCultures = 
                CultureInfo.GetCultures(CultureTypes.SpecificCultures);
            foreach (CultureInfo ci in specificCultures)
                Console.WriteLine(ci.DisplayName);
            Console.WriteLine("Total: " + specificCultures.Length);
            Console.ReadLine();
        }

Aqui usamos o método estático GetCultures na classe CultureInfo para obter uma lista de culturas. Ele requer o parâmetro CultureTypes, que especifica que tipo de cultura que você está procurando. Nesse caso, solicitei culturas específicas,  que, são as que estão ligadas a um idioma e a um país/região.

Para obter uma lista de cultura neutras podemos usar o código a seguir:

       private static void CulturasNeutras()
        {
            CultureInfo[] neutralCultures = 
                CultureInfo.GetCultures(CultureTypes.NeutralCultures);
            foreach (CultureInfo ci in neutralCultures)
                Console.WriteLine(ci.DisplayName);
            
            Console.WriteLine("Total: " + neutralCultures.Length);
        }

Para definir uma cultura basta obter uma instância da classe CultureInfo e você vai ter acesso a uma ampla variedade de propriedades e métodos:

private static void cultureInfo1()
        {
            CultureInfo ptBR = new CultureInfo("pt-BR");
            foreach (string nomeDia in ptBR.DateTimeFormat.DayNames)
                Console.WriteLine(nomeDia);
            Console.WriteLine("Hoje é : " + 
                ptBR.DateTimeFormat.GetDayName(DateTime.Now.DayOfWeek));
        }

Resultado:

Ou ainda:

        private static void cultureInfo2()
        {
            CultureInfo ptBR = new CultureInfo("pt-BR");
            foreach (string nomeMes in ptBR.DateTimeFormat.MonthNames)
                Console.WriteLine(nomeMes);
            Console.WriteLine("Mês atual: " + 
                ptBR.DateTimeFormat.GetMonthName(DateTime.Now.Month));
        }

Resultado:

Um recurso importante é a propriedade NumberFormat que obtém ou define um NumberFormatInfo que define o formato culturalmente apropriado de exibição de números, moeda e percentual.

As informações de como a cultura trata a formatação númerica pode ser obtida usando as propriedades e os métodos na propriedade NumberFormat :

        private static void FormatoNumerico()
        {
            CultureInfo enUs = new CultureInfo("en-US");
            Console.WriteLine(enUs.DisplayName + ":");
            Console.WriteLine("SeparadorGrupoNumerico: " + enUs.NumberFormat.NumberGroupSeparator);
            Console.WriteLine("SeparadorNumeroDecimal: " + enUs.NumberFormat.NumberDecimalSeparator);
            CultureInfo deDe = new CultureInfo("de-DE");
            Console.WriteLine(deDe.DisplayName + ":");
            Console.WriteLine("SeparadorGrupoNumerico: " + deDe.NumberFormat.NumberGroupSeparator);
            Console.WriteLine("SeparadorNumeroDecimal: " + deDe.NumberFormat.NumberDecimalSeparator);
            CultureInfo ptBR = new CultureInfo("pt-BR");
            Console.WriteLine(ptBR.DisplayName + ":");
            Console.WriteLine("SeparadorGrupoNumerico: " + ptBR.NumberFormat.NumberGroupSeparator);
            Console.WriteLine("SeparadorNumeroDecimal: " + ptBR.NumberFormat.NumberDecimalSeparator);
        }

 

Resultado:

Além disso, podemos usar a cultura neutra e a cultura invariante que podem ser úteis em certos cenários.

Veja um exemplo de cultura neutra usando o idioma 'pt' :

        private static void Exemplo1()
        {
            var valor = 1.78;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt");
            Console.WriteLine($"Cultura atual : {Thread.CurrentThread.CurrentCulture}" );
            Console.WriteLine($"Data: {DateTime.Now}");
            Console.WriteLine($"Moeda: {valor} ");
        }

Resultado obtido:

Para poder formatar o número como ele foi definido basta usar a cultura invariante:

        private static void Exemplo1()
        {
            var valor = 1.78;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt");
            Console.WriteLine($"Cultura atual : {Thread.CurrentThread.CurrentCulture}" );
            Console.WriteLine($"Data: {DateTime.Now}");
            Console.WriteLine($"Moeda (pt) : {valor} ");
            Console.WriteLine($"Moeda (invariant) : {valor.ToString(CultureInfo.InvariantCulture)} ");
        }

Resultado:

A classe RegionInfo traz recursos importantes ao desenvolvedor como informar se a região  ou país usa o sistema métrico, nome e símbolo da moeda da região e outras informações.

Abaixo temos a tabela mostrando as principais propriedades da classe RegionInfo:

Nome Descrição
CurrencyNativeName Nome nativo da moeda local
CurrentEnglishName Nome, em inglês da moeda local
CurrencySymbol Símbolo da moeda Local
IsMetric Indica se região ou país usa o sistema métrico
ISOCurrencySymbol Símbolo da moeda local conforme a norma ISO 4217
TreeLetterISORegionName Código do país/região em 3 letras conforme norma ISO 3166
NativeName Nome, na linguagem nativa , no país ou região

Exemplo :

        private static void ExemploRegionInfo1()
        {
            var regiaoInfo = new RegionInfo("pt-BR");
            var hoje = DateTime.Now;
            Console.WriteLine($"Moeda  - {regiaoInfo.CurrencySymbol} {"34,67"}");
            Console.WriteLine($"Moeda 34,67 - {regiaoInfo.CurrencyNativeName}");
            Console.WriteLine($"{regiaoInfo.ThreeLetterISORegionName} ");
            Console.WriteLine($"{regiaoInfo.ISOCurrencySymbol} ");
            Console.WriteLine($"Usa sistema métrico - {regiaoInfo.IsMetric} ");
            Console.WriteLine(hoje.ToString());
            Console.WriteLine(hoje.ToShortDateString());
            Console.WriteLine(hoje.ToLongDateString());
            Console.WriteLine(hoje.ToShortTimeString());
            Console.WriteLine(hoje.ToLongTimeString());
        }

Resultado:

E estamos conversados.

Pegue o projeto aqui:  CShp_CultureInfo1.zip

"E, chegando-se Jesus, falou-lhes, dizendo: É-me dado todo o poder no céu e na terra."
Mateus 28:18

Referências:


José Carlos Macoratti