1
resposta

Mesmo utilizando o Locale ainda dá InputMismatchException

Eu segui as instruções do professor, mas mesmo colocando o "useLocale(Locale.US)" continua dando a Exceção InputMismatchException.

Código:

public class LeituraScanner {

    public static void main(String[] args) throws Exception {

        Scanner sc = new Scanner(new File("contas.csv"));
        Locale ptbrLocale = new Locale("pt", "BR");

        while(sc.hasNextLine()){            
            String linha = sc.nextLine();
            System.out.println(linha);

            Scanner linhaScanner = new Scanner(linha);
            //            linhaScanner.useLocale(ptbrLocale);
            linhaScanner.useLocale(Locale.US);
            linhaScanner.useDelimiter(",");

            String valor1 = linhaScanner.next();
            int valor2 = linhaScanner.nextInt();
            int valor3 = linhaScanner.nextInt();
            String valor4 = linhaScanner.next();
            double valor5 = linhaScanner.nextDouble();

            System.out.println(valor1 +" "+ valor2 +" "+ valor3 +" "+ valor4 +" "+ valor5);

            linhaScanner.close();
        }
        sc.close();

    }

}

Saída no Console:

CC,22,33,Nico Steppat,210.1
CC 22 33 Nico Steppat 210.1
CP,11,55,Luan Silva, 1300.98
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
    at br.com.vinicius.java.io.fluxos.OutrosTiposDeEntradaESaida.LeituraScanner.main(LeituraScanner.java:39)

No caso, essa linha 39 do LeituraScanner se refere a linha:

double valor5 = linhaScanner.nextDouble();

Eu também já tentei criar um Locale com as configurações de português brasileiro, mas ainda assim não resolveu o problema.

1 resposta

Olá,

Se o arquivo CSV estiver utilizando a vírgula como separador decimal:

Locale ptbrLocale = new Locale("pt", "BR");
DecimalFormatSymbols symbols = new DecimalFormatSymbols(ptbrLocale);
symbols.setDecimalSeparator(',');
DecimalFormat format = new DecimalFormat("#.0#", symbols);
format.setParseBigDecimal(true);

Scanner linhaScanner = new Scanner(linha);
linhaScanner.useLocale(ptbrLocale);
linhaScanner.useDelimiter(",");

String valor1 = linhaScanner.next();
int valor2 = linhaScanner.nextInt();
int valor3 = linhaScanner.nextInt();
String valor4 = linhaScanner.next();
BigDecimal valor5 = format.parse(linhaScanner.next()).setScale(2, RoundingMode.HALF_EVEN).doubleValue();