C# - Convertendo valores para o formato monetário em diferentes culturas


 Neste artigo veremos como converter valores numéricos para o formato monetário em diferentes culturas na linguagem C#.

Quando queremos exibir um número no formato de moeda para o respectivo país, formatamos a string no formato de moeda e obtemos o símbolo de moeda de um país específico usando a classe "CultureInfo" disponível na plataforma .Net. Para usar a classe CultureInfo, precisamos incluir o namespace "System.Globalization".

O especificador de formato "C" converte um número para uma string que representa um valor em moeda. O especificador de precisão indica o número desejado de casas decimais na cadeia de resultados. Se o especificador de precisão for omitido, a precisão padrão é usada (o valor padrão é 2).

Se o valor a ser formatado tiver mais do que o número de casas decimais especificado ou do que o padrão, o valor fracionário será arredondado no resultado. Se o valor à direita do número das casas decimais especificadas for 5 ou superior, o último dígito da seqüência de resultados será arredondado a partir de zero.

Neste artigo irei abordar como podemos fazer essa conversão

Recursos Usados:

LINQ - Usando a sintaxe de consulta

Abra o VS 2017 Community e crie um projeto do tipo Console Application com o nome CShp_ConverteFormatoMoeda.

Vou iniciar com um exemplo básico que mostra como converter um número para o seu correspondente formato monetário para alguns países:

using System.Globalization;
using static System.Console;
namespace CShp_ConverteFormatoMoeda
{
    class Program
    {
        static void Main(string[] args)
        {
            double valor = 7342587.5891;

            //Cultura atual
            WriteLine("\n--------- Exibindo Moeda na cultura atual ---------------\n");
            // Por padrão, o especificador de formato "C" exibe a mode até duas casas decimais
            WriteLine(valor.ToString("C", CultureInfo.CurrentCulture));
            // C2 exibe a moeda até dois digitos
            WriteLine(valor.ToString("C2", CultureInfo.CurrentCulture));
            // C3 exibe a moeda até 3 digitos
            WriteLine(valor.ToString("C3", CultureInfo.CurrentCulture));
            // C4 exibe a moeda até 4 digitos
            WriteLine(valor.ToString("C4", CultureInfo.CurrentCulture));
            // C5 exibe a moeda até 5 digitos
            WriteLine(valor.ToString("C5", CultureInfo.CurrentCulture));
            //Para o Japão
            WriteLine("\n--------- Exibe a moeda para o Japão ---------------\n");
            WriteLine(valor.ToString("C", CultureInfo.CreateSpecificCulture("ja-JP")));
            //Para a Suécia
            WriteLine("\n--------- Exibe a moeda para a Suécia---------------\n");
            WriteLine(valor.ToString("C",CultureInfo.CreateSpecificCulture("se-SE")));
            //Para a Argentina
            WriteLine("\n--------- Exibe a moeda para a Argentina  --------------\n");
            WriteLine(valor.ToString("C",CultureInfo.CreateSpecificCulture("es-AG")));
            Read();
        }
    }
}
 

O resultado é afetado pela informação de formatação do objeto NumberFormatInfo atual cujas propriedades são as seguintes :

Propriedade NumberFormatInfo Descrição
CurrencyPositivePattern Define a localização do símbolo da moeda para valores positivos
CurrencyNegativePattern Define a localização do símbolo da moeda para valores negativos, e especifia se o sinal negativo esta representando por parênteses ou pela propriedade NegativeSign.
NegativeSign Define o sinal negatio usado se CurrencyNegativePattern indicar que os parenteses não são usados
CurrencySymbol Define o símbolo da moeda
CurrencyDecimalDigits Define o número padrão dos digitos decimais na moeda atual. Este valor pode ser sobrescrito usando o especificador de precisão;
CurrencyDecimalSeparator Define a string que separa os digitos inteiros e decimais
CurrencyGroupSeparator Define a string que separa os grupos dos número inteiros
CurrencyGroupSizes Define o número de digitos inteiros que aparece no grupo

Vejamos a seguir como aplicar algumas propriedades de NumberFormatInfo na prática.

Como agrupar os números usando a propriedade NumberFormatInfo.CurrencyGroupSizes

Esta propriedade é usada para obter ou definir o número de digitos em cada grupo à esquerda do decimal em valores de moeda. Ela é usada para obter ou definir o número de dígitos em cada grupo à esquerda do decimal em valores monetários.

Para definir o agrupamento em um número, atribuímos esta propriedade a uma matriz de números inteiros com um agrupamento necessário.

Por exemplo, se a matriz contiver {2, 4, 3}, os dígitos são agrupados de forma semelhante a $ 55, 555, 555, 554, 4443, 33,00, semelhante a $ 55555555554, 4443, 33,00.

Isso significa que o agrupamento de dígitos começa a partir da esquerda correspondente aos elementos da matriz. Se os dígitos em um número forem maiores que a soma dos elementos da matriz, os dígitos restantes do número serão agrupados (da esquerda para a direita) para o valor do último elemento na matriz, desde que o elemento não seja zero. Se o último elemento na matriz for zero, o agrupamento não ocorrerá para os dígitos restantes.

No código abaixo temos um exemplo de aplicação da propriedade CurrencyGroupSizes :

using static System.Console;
using System.Globalization;
using System;
namespace CShp_ConverteFormatoMoeda2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Obtem o NumberFormatInfo associado com a cultura USA
            NumberFormatInfo mNumberFormatInfo = new CultureInfo("en-US", false).NumberFormat;  
            // Exibe o valor com separador padrão
            long valor = 33333333334444222;
            WriteLine("Valor : " + valor);
            WriteLine("\nExibe o valor com o separador padrão : 'C' ");
            WriteLine(valor.ToString("C", mNumberFormatInfo));
            // exibe o mesmo valor usando diferentes agrupamentos
            int[] mTamGrupo1 = { 2, 4, 3 };
            int[] mTamGrupo2 = { 2, 4, 0 };
            mNumberFormatInfo.CurrencyGroupSizes = mTamGrupo1;
            WriteLine("\nExibe o mesmo valor com grupo diferente {2,4,3}  ");
            WriteLine(valor.ToString("C", mNumberFormatInfo));
            mNumberFormatInfo.CurrencyGroupSizes = mTamGrupo2;
            WriteLine("\nExibe o mesmo valor com grupo diferente {2,4,0}  ");
            WriteLine(valor.ToString("C", mNumberFormatInfo));
            Read();
        }
    }
}
   

Podemos usar as demais propriedades e continuar formatando o valor monetário. Por exemplo vamos alterar o separador usando a propriedade CurrencyGroupSeparator e definindo o separador como sendo o símbolo ; .

Veja como deve ficar o código :

mNumberFormatInfo.CurrencyGroupSeparator = ";";
WriteLine("\nExibe o mesmo valor usando um outro símbolo separador : ';' ");
WriteLine(valor.ToString("C", mNumberFormatInfo));

O resultado seria o seguinte:

Se você precisar saber o código do país para usar na cultura pode consultar neste link:  http://azuliadesigns.com/list-net-culture-country-codes/

Se desejar pode também listar as culturas disponíveis no seu ambiente usando o código abaixo:

        static void ExibirCulturas()
        {
            CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
            foreach (CultureInfo culture in cultures)
            {
                WriteLine(String.Format("{0, -15}{1}",
                    culture.Name, culture.EnglishName));
            }
        }

E até o próximo artigo.

Pegue o código do projeto aqui : CShp_ConverteFormatoMoeda.zip

Antes, como ministros de Deus, tornando-nos recomendáveis em tudo; na muita paciência, nas aflições, nas necessidades, nas angústias,Como contristados, mas sempre alegres; como pobres, mas enriquecendo a muitos; como nada tendo, e possuindo tudo. 
2 Coríntios 6:4,10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti