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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
C# - Convertendo Números para valores Reais em ... - Macoratti.net
NET - Compreendendo o recurso da localização - Macoratti.net
Xamarin.Forms - Conversor de Moedas acessando um ... - Macoratti.net