Loading ...

O Blog de Tecnologia da Geofusion

Java money API – Trabalhando com moeda no java

Java money API – Trabalhando com moeda no java

 

Algumas aplicações podem precisar, em algum momento, trabalhar com dinheiro mesmo que não seja uma aplicação financeira, como softwares de bancos ou corretoras de investimentos. No mundo do Java, para facilitar o trabalho de manipular dados em moeda está disponível a Money and currency API, feita para trabalhar com moeda em diversas unidades monetárias, tirando uma complexidade e trabalho extra do time de desenvolvimento, assim o time pode abstrair algumas coisas e focar na regra de negócio do projeto. Em outras palavras, você não precisa fazer um martelo se o que você deseja é colocar um prego na parede. Vamos ver um pouco de como tudo funciona.

 

Primeiro nós precisamos criar uma moeda, e como estamos no Brasil, vamos usar o real. Vamos usar a classe estática Monetary e o método getCurrency. Esse método retorna um objeto CurrencyUnit, que vamos usar para guardar nosso objeto.

 

CurrencyUnit brl = Monetary.getCurrency(“BRL”);

 

 

Agora vamos criar um valor usando MonetaryAmount

 

MonetaryAmount valor = Money.of(100, brl);

 

 

Acabamos de criar um montante, ou valor, de cem reais.

Com isto já podemos realizar diversas operações, entre elas as mais básicas: somar valor, subtrair, multiplicar e dividir, através do métodos:

 

add() // recebe MonetaryAmount

subtract() // recebe MonetaryAmount

multiply()

divide()

 

Há outros recursos disponíveis, por exemplo, saber se o valor é positivo, negativo, se é zero ou comparar com outros valores para saber se é maior, menor ou igual.

Antes de usar o divide(), você pode usar o método isZero() para evitar uma divisão por zero, por exemplo. Tudo isso pode ser feito em qualquer outra unidade monetária, basta você passar como parâmetro qual unidade deseja:

 

Monetary.getCurrency(“USD”); // Trabalhando com doláres americanos.

 

 

Você pode usar como auxiliar a classe Locale para definir a unidade monetária

 

 

Monetary.getCurrency(Locale.CANADA);

Monetary.getCurrency(Locale.CHINA);

Monetary.getCurrency(Locale.JAPAN);

 

 

E diversas outras.

Legal, acabamos de ver que operações mais básicas podem ser feitas facilmente, mas e se for necessário converter um valor de real para dólar? E se for necessário somar um valor em real com um valor em dólar? Para resolver, precisamos usar ExchangeRateProvider. Vamos ver como resolver cada cenário.

 

-Cenário: Valor de dólar para real:

 

 

CurrencyUnit usd = Monetary.getCurrency(“USD”); // ou Monetary.getCurrency(Locale.US);

ExchangeRateProvider provider =   MonetaryConversions.getExchangeRateProvider(ExchangeRateType.ECB);

CurrencyConversion conversionToBRL = provider.getCurrencyConversion(“BRL”);

MonetaryAmount value = FastMoney.of(100, usd);

System.out.println(value.with(conversionToBRL));

 

 

Nesse trecho de código convertemos cem reais em cem dólares.

Criamos a unidade monetária, criamos um provider baseado na taxa de câmbio do banco central europeu, criamos um conversor em real, criamos um valor de cem dólares e na última linha imprimimos o valor em real equivalente aos cem dólares.

 

Considerações importantes:

– Na primeira linha, usamos a classe FastMoney ao invés da Money que vimos anteriormente. A diferença entre elas é que na Money, internamente, o valor é manipulado como BigDecimal e na FastMoney o valor é manipulado como Long. A diferença é que, como o nome já diz, a classe FastMoney é mais rápida e terá uma performance melhor. Como nós sabemos, até então era melhor usar BigDecimal para trabalhar com dinheiro no java pois tem uma precisão melhor, então, particularmente prefiro usar a classe Money, mas fica a critério do time ponderar os pontos: precisão dos resultados, se tem problema de performance ou não e tudo o que o time julgar necessário.

 

– O que é ExchangeRateType?

É um enum para você escolher qual taxa de câmbio deseja usar. As principais opções são: ECB ou IFM, sendo elas taxa de câmbio do banco central europeu ou fundo monetário internacional (FMI) respectivamente.

 

Voltando aos nosso cenários.

-Cenário: Somar um valor em dólar com um valor em real. (imagino que você já saiba como).

 

Imagine que você compra um produto de 50 dólares no EUA e tem de pagar 12 reais para os correios no Brasil, como fazer um código que resolva isso?

Crie as unidades monetárias e os valores:

 

 

CurrencyUnit dolar = Monetary.getCurrency(“USD”);

CurrencyUnit real = Monetary.getCurrency(“BRL”);

MonetaryAmount valorDoProdutoDolar = Money.of(50, dolar);

MonetaryAmount taxaCorreios = Money.of(12, real);

 

 

Crie o seu provider:

 

ExchangeRateProvider provider =   MonetaryConversions.getExchangeRateProvider(ExchangeRateType.ECB);

 

 

Obtenha a cotação:

 

CurrencyConversion conversionToBRL = provider.getCurrencyConversion(real);

 

 

Transforme o valor do produto em real

 

MonetaryAmount valorProdutoEmReal = conversionToBRL.apply(valorDoProdutoDolar);

 

 

Some os valores e terá o resultado

 

MonetaryAmount valorTotal = valorProdutoEmReal.add(taxaCorreios);

 

 

Para finalizar, como estamos trabalhando com dinheiro, precisamos exibir para nosso usuários os valores com duas casas decimais e podemos precisar de arredondamento.

Para arredondar os valores, usamos a classe MonetaryRounding.

 

 

MonetaryRounding defaultRounding = Monetary.getDefaultRounding();

System.out.println(valorTotal.with(defaultRounding));

 

 

Assim o seu valor já será retornado com duas casas decimais.

Você pode obter apenas o número também:

 

 

System.out.println(valorTotal.with(defaultRounding).getNumber());

 

 

Para formatar, usamos a classe MonetaryAmountFormat

 

 

MonetaryAmountFormat germanyFormat = MonetaryFormats.getAmountFormat(Locale.GERMANY);

System.out.println(germanyFormat.format(valorDoProdutoDolar));

 

 

Essa API deve estar disponível no Java 9, ela está em evolução mas já podemos utilizar a partir de agora e facilitar nossas vidas focando nas nossas regras de negócio, você pode obter ela no seu projeto por aqui: https://mvnrepository.com/artifact/org.javamoney/moneta

 

Basta pegar a versão mais recente e sair usando.

 

Valeu galera, até o próximo artigo.

 

Leandro Thiers.

 

Geofusion.tech

2016 todos os direitos reservados.

www.geofusion.com.br