Formatação de Moedas com Java
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:
- String idioma — receberá a sigla do idioma de acordo com a ISO-639.
- String pais — receberá a sigla do país.
Então, para o Brasil, passaremos como:
- idioma, o código “pt”, para Língua Portuguesa.
- 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:
- Lista — Siglas dos Países;
- Norma ISO 639 — Códigos para nomes de diversas línguas;
- Documentação Java 8 — Classe Locale;
- Documentação Java 8 — Classe NumberFormat;
- Código fonte completo usado nesse post(Incluindo a formatação de algumas outras moedas) — Classe FormatarMoedas.java
E é isso aí!
Sugestões e críticas construtivas podem ser deixadas nos comentários!
Obrigada e até mais! 😊