AFF Education Construa seu Futuro

Aula 24 - Configuração Local de Separador de Decimais

Configuração local de separador de decimais

Ao instalar o Java no VSCode, ele automaticamente passa a usar as configurações locais de data e separador de decimais.

Importante:

Importância do Locale (erro ao digitar com ponto)

Se você usa o Java no Brasil ou outro país da América do Sul e deseja que o usuário coloque dados usando o padrão americano ou europeu, deve-se usar o método Locale().

Veja o que acontece quando o usuário digita número decimais separado por ponto no Brasil:

import java.util.Scanner;

public class ProblemaComSeparadorDecimal {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        
        System.out.print("Digite um valor decimal (ex: 10.5): ");
        
        try {
            double valor = entrada.nextDouble();
            System.out.println("Valor digitado: " + valor);
        } catch (Exception e) {
            System.out.println("Erro: " + e.getMessage());
            System.out.println("Provavelmente você usou o ponto como separador decimal");
            System.out.println("No Brasil, o separador decimal padrão é a vírgula (,)");
        }
        
        entrada.close();
    }
}

Execução no Brasil quando o usuário digita "10.5":

Digite um valor decimal (ex: 10.5): 10.5

Erro: java.util.InputMismatchException

Provavelmente você usou o ponto como separador decimal

No Brasil, o separador decimal padrão é a vírgula (,)

Se o usuário digitar "10,5" (com vírgula), funcionaria corretamente no Brasil.

Usando Locale para resolver o problema

Usando o método Locale(), agora o usuário pode digitar decimais separados por ponto sem ter o erro de código quando o Java é instalado no Brasil.

import java.util.Scanner;
import java.util.Locale;

public class CorrigindoComLocale {
    public static void main(String[] args) {
        // Configurando o Scanner para usar o padrão americano (ponto como separador decimal)
        Scanner entrada = new Scanner(System.in).useLocale(Locale.US);
        
        System.out.print("Digite um valor decimal (ex: 10.5): ");
        
        try {
            double valor = entrada.nextDouble();
            System.out.println("Valor digitado: " + valor);
            
            // Calculando o dobro do valor
            double dobro = valor * 2;
            System.out.println("O dobro é: " + dobro);
        } catch (Exception e) {
            System.out.println("Erro: " + e.getMessage());
        }
        
        entrada.close();
    }
}

Digite um valor decimal (ex: 10.5): 10.5

Valor digitado: 10.5

O dobro é: 21.0

Solução: Com scanner.useLocale(Locale.US), o Scanner irá aceitar o ponto como separador decimal, mesmo em sistemas configurados para usar a vírgula.

Formatação de Números

Além de afetar a entrada de dados, o Locale também afeta a formatação de números na saída:

import java.text.NumberFormat;
import java.util.Locale;

public class FormatacaoNumeros {
    public static void main(String[] args) {
        double valor = 1234567.89;
        
        // Formatando números para diferentes locales
        
        // Formatação para os EUA
        NumberFormat formatoEUA = NumberFormat.getInstance(Locale.US);
        String valorEUA = formatoEUA.format(valor);
        
        // Formatação para o Brasil
        NumberFormat formatoBrasil = NumberFormat.getInstance(new Locale("pt", "BR"));
        String valorBrasil = formatoBrasil.format(valor);
        
        // Formatação para a Alemanha
        NumberFormat formatoAlemanha = NumberFormat.getInstance(Locale.GERMANY);
        String valorAlemanha = formatoAlemanha.format(valor);
        
        // Exibindo os resultados
        System.out.println("Valor original: " + valor);
        System.out.println("Formato EUA: " + valorEUA);
        System.out.println("Formato Brasil: " + valorBrasil);
        System.out.println("Formato Alemanha: " + valorAlemanha);
        
        // Formatando moedas
        System.out.println("\nFormatação de moedas:");
        
        // Moeda dos EUA (dólar)
        NumberFormat moedaEUA = NumberFormat.getCurrencyInstance(Locale.US);
        String dolar = moedaEUA.format(valor);
        
        // Moeda do Brasil (real)
        NumberFormat moedaBrasil = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
        String real = moedaBrasil.format(valor);
        
        // Moeda da Alemanha (euro)
        NumberFormat moedaAlemanha = NumberFormat.getCurrencyInstance(Locale.GERMANY);
        String euro = moedaAlemanha.format(valor);
        
        System.out.println("EUA: " + dolar);
        System.out.println("Brasil: " + real);
        System.out.println("Alemanha: " + euro);
    }
}

Valor original: 1234567.89

Formato EUA: 1,234,567.89

Formato Brasil: 1.234.567,89

Formato Alemanha: 1.234.567,89


Formatação de moedas:

EUA: $1,234,567.89

Brasil: R$ 1.234.567,89

Alemanha: 1.234.567,89 €

Exercícios

Teste seus conhecimentos sobre configuração local de separador de decimais em Java:

1. Qual pacote contém a classe Locale em Java?

2. Qual é o separador decimal padrão no Brasil e em muitos países da América do Sul?

3. Como configurar um Scanner para aceitar números com ponto como separador decimal, mesmo em países que usam vírgula?

4. Complete o código para formatar um número no padrão brasileiro:

import java.text.NumberFormat;
import java.util.Locale;

public class Formatacao {
    public static void main(String[] args) {
        double valor = 1234.56;
        NumberFormat formato = ______________________;
        System.out.println(formato.format(valor));
    }
}

5. O que acontece quando um usuário brasileiro tenta digitar um número com ponto decimal (ex: 10.5) em um Scanner sem configuração de Locale?

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Em muitos locales (ex.: Brasil), o separador decimal exibido por padrão pode ser:

2. Para forçar o ponto como separador decimal independente do sistema, pode-se usar: