Formatação de Moedas com Java

Van Ribeiro
5 min readAug 24, 2018

--

Oi, gente! Tudo bem?

Por causa do desafio do #100DiasDeCódigo, tenho aprendido algumas coisas bem legais e, na medida do possível, quero compartilhar com vocês! (Vai que vocês estão com a mesma dificuldade?…).

Além disso, é uma oportunidade de ter disponível para futuras consultas e, também, para memorização. Então, vamos lá…

Há alguns dias atrás, resolvi um desafio/problema sobre formatação de moedas de diferentes nacionalidades. Então decidi escrever um post sobre isso!

Quais classes vamos usar para formatar nossas moedas?

Para iniciarmos a formatação, precisaremos importar as classes responsáveis por nos proporcionar essa facilidade:

Declarando as variáveis com as quais iremos trabalhar aqui:

Chamaremos essa classe de “Formatar Moedas” e dentro do método main() atribuiremos as seguintes variáveis:

Usando a Classe NumberFormat para nos ajudar nesse serviço

Para utilizar essa classe não é necessário criar um objeto usando a palavra reservada new, pois ela é do tipo abstrata(para saber mais sobre isso: leia esse post.). Sendo assim, basta criar uma variável e fazer as devidas atribuições.

E, no nosso caso, já criamos. Para cada país que queremos formatar à moeda corrente, atribuiremos o nome dessa classe seguido de alguns comandos:

O que temos nessa linha de código?

eua — nome da String que críamos para receber essa formatação.

NumberFormat — aqui estamos dizendo que queremos usar essa classe e seus respectivos recursos.

getCurrencyInstance() — é um método da classe NumberFormat e que utilizamos quando queremos formatar moedas. Aqui ele recebeu como argumento a classe Locale, seguida do país desejamos (É só usar as constantes para as localidades disponíveis. Vou falar dessa classe daqui a pouco!). Nesse caso, US para Estados Unidos.

format() — recebe a variável valor como argumento e se encarrega da formatação.

Ok! Mas somos do Brasil, correto? É claro, e até meio óbvio, que queremos formatar a moeda corrente de nosso país, certo?! Certo!

Então vamos consultar a documentação Java para ver a constante que iremos usar para isso!

Não! Péra! Não tem Brasil na lista de constantes fornecidas pela classe Locale? E agora? (Rsrsrs…)

Significa que vamos ter que “construir” uma! Sério? Sim! Para isso, também usaremos a classe Locale!

Agora vamos falar da Classe Locale!

A documentação Java disponibiliza uma listagem de contantes no formato correto para alguns países como é o caso do Japão e do Canadá, por exemplo. (Para ver a lista completa, veja a documentação). Contudo, ela é muito limitada.

Nesse caso, se precisarmos dar suporte à moedas de diversas nacionalidades precisaremos “construir” uma localidade! E para isso usaremos o método construtor da Classe Locale!

É um processo bem simples. (Bom, agora vejo como algo simples, porém levei algum tempo para enxergar essa solução… Rsrs);

Basta criarmos um objeto para Classe Locale, que já importamos lá no inicio.

Se a deixarmos assim, nada irá acontecer, pois além da variável “localBrasil”, que é do tipo Locale, não existe mais nada que diga que queremos a formatação do Brasil. Para isso, é preciso informamos ao construtor o que estamos querendo fazer.

O construtor dessa classe pode receber até três argumentos em seus parâmetros, entretanto, aqui trataremos apenas de dois, pois é o que atende a nossa necessidade:

Locale(String idioma, String pais), onde:

  1. String idioma — receberá a sigla do idioma de acordo com a ISO-639.
  2. String pais — receberá a sigla do país.

Então, para o Brasil, passaremos como:

  1. idioma, o códigopt”, para Língua Portuguesa.
  2. país, a sigla “BR”, para Brasil.

Sendo assim, teremos:

Agora é só formatar, como estávamos fazendo antes. Nossa linha ficará assim:

O que muda em relação ao formato anterior?

Apenas que o método getCurrencyInstance(), que receberá como argumento nosso objeto localBrasil;

Agora é só fazer o mesmo para os outros países que declaramos anteriormente:

Como vocês devem ter observado, eu criei um objeto para cada moeda. Por quê? Porque o construtor da Classe Locale só permite passar um argumento por vez para cada parâmetro estabelecido.

Então, sim! Se tivermos que dar suporte à alguns/muitos idiomas é provável que tenhamos que fazer isso. Não sei se existe outra forma mais fácil ou simples para isso, contudo foi o que descobri e funciona para mim.

E nossas moedas formatadas ficam assim:

Apenas uma observação: se você, assim como eu, costuma usar CMD/Terminal para compilar e executar seu código Java, é possível que tenha problemas com a exibição de caracteres especiais, como o Euro (€), por exemplo.

Nesse caso, sugiro executar esse tipo de código usando o Eclipse, configurando o encoding do Workspace para UTF-8, caso já não esteja, para que a saída possa ser exibida como na imagem acima.

Outra opção seria cria uma caixa de dialogo, como me sugeriram aqui e conforme vemos na imagem a seguir.

Perceba que ainda não funciona corretamente, pois o “ç” da palavra França não saiu de forma correta, mas pelo menos dá para ter uma idéia dos caracteres especias que são utilizados pelas nações desejadas.

Outras dicas e coisas que acho importante compartilhar!

Talvez seja meio óbvio, contudo sugiro uma pesquisa no Google para cada país que precise formatar, já que cada nacionalidade possui sua própria moeda e idioma oficiais (em alguns casos mais de um).

Links e referências que usei aqui e que podem te ajudar:

E é isso aí!

Sugestões e críticas construtivas podem ser deixadas nos comentários!

Obrigada e até mais! 😊

--

--