nextDouble() não aceita ponto?

:smiley: Olá, estou iniciando meus estudos com Java mas já tenho experiencia em outras linguagens,
entretanto estou encontrando um problema esquizito.
Ao que suponho, nextDouble() serve para pegar um valor e convertê-lo para um double.
Entretanto, não é isto que esta acontecendo quando eu coloco um valor em double no input (com ponto).
:shock: Se eu colocar o valor com vírgula ele aceita.

[code]import java.util.Scanner;

class CalculaFrete
{
public static void main(String[] args)
{
Scanner input= new Scanner(System.in);
double valor;

	System.out.print("Qual o valor do produto? ");
	valor = input.nextDouble();
    valor = valor + 25.00;

	System.out.print(valor);
}

}[/code]
Exemplos de uso:
Qual o valor do produto? 80
Retorna 105.0
Qual o valor do produto? 80,50
Retorna 105.5
Qual o valor do produto? 80.50
Retorna uma exceção
Exception in thread “main” java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at CalculaFrete.main(CalculaFrete.java:11)

:roll: Estou entendendo algo errado?

Nossa! Tá dificil de alguem solucionar este problema…

Simples: o Scanner utiliza como padrão o Locale padrão da máquina, por isso ele não aceita o valor com ponto.

Tente isso após instanciar o Scanner:

input.useLocale(Locale.ENGLISH);
2 curtidas

Obrigado, Ataxexe.
Ja estava quase desistindo de aprender a programar em Java.
Mas como cada linguagem tem suas próprias loucuras…

Obs.: Só lembrando para quem está procurando a mesma resposta, que para o Locale funcionar,
é preciso importar a classe Locale primeiro, vejam como ficou meu código após a dica do Ataxexe:

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

class Teste
{
	public static void main(String[] args)
	{
		Scanner input= new Scanner(System.in);
		input.useLocale(Locale.ENGLISH);
		double valor;
		
		System.out.print("Qual o valor do produto? ");
		  
		valor = input.nextDouble();
        valor = valor + 25.00;

		System.out.print(valor);
	}
}
1 curtida

Queria te corrigir, o input.nextDouble(); que vc está usando serve para ler um valor double da entrada, e não para converter o valor para double como vc disse.

Por isso o fato de usar vírgula ou ponto faz toda diferença. Se vc usa errado a entrada não vai ser considerada um valor double e ocorrerá um InputMismatchException (se não me engano).

Okay, realmente rodpuc .
Entretanto, só fiz uma suposição: