# Double in komma und Punkt akzeptieren -> Robusteeingabe



## Zidinjo (20. Okt 2014)

Hallo liebe Community,

ich brauch mal wieder eure Hilfe. Undzwar klappt das Programm aber wenn ich 6,5 und 6,3 eigeben kommt die Ausgabe Fläche 0 Umfang 0. Wenn ich ein Punkt benutzt klappt alles. Kann mir wer helfen?


```
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class PunktKomma 
{
	public static void main(String[] args)
	{
		Locale.setDefault(Locale.US);
		DecimalFormat df = new DecimalFormat("###,###.###");
		String titel = "Berechnen der Quadratwertes";
		String willko = "Willkommen mein Freund";
		String eingabeFenster = "Bitte geben Sie den ersten Wert ein";
		String zweitesFenster = "Bitte geben Sie den zweiten Wert ein";
		
		JOptionPane.showMessageDialog(null, willko, titel, JOptionPane.CLOSED_OPTION);
		
		double var=0; double var2=0;
		
		Scanner eingabe = new Scanner(JOptionPane.showInputDialog(null,eingabeFenster, titel, JOptionPane.PLAIN_MESSAGE));
		while(eingabe.hasNextDouble())
		{
		if(eingabe.hasNextDouble())
		{
			Locale.setDefault(Locale.US);
			 var = eingabe.nextDouble();
		}
		else
		{
			Locale.setDefault(Locale.GERMAN);
			var = eingabe.nextDouble();
		}
		}
		eingabe.close();
		
		eingabe = new Scanner(JOptionPane.showInputDialog(null,zweitesFenster, titel, JOptionPane.PLAIN_MESSAGE));
		while(eingabe.hasNextDouble())
		{
		if(eingabe.hasNextDouble())
		{
			Locale.setDefault(Locale.US);
			var2 = eingabe.nextDouble();
		}
		else
		{
			Locale.setDefault(Locale.GERMAN);
			var2 = eingabe.nextDouble();
		}
		}
		
		eingabe.close();
	
		double umfang = var + var2;
		double flaeche = var * var2;
		
		JOptionPane.showMessageDialog(null,"Der Umfang: " + df.format(umfang) + " Die Flaeche: " + df.format(flaeche), titel, JOptionPane.PLAIN_MESSAGE);	
		
	
	}
}
```


----------



## Natac (20. Okt 2014)

```
while(eingabe.hasNextDouble())
{
if(eingabe.hasNextDouble())
{
Locale.setDefault(Locale.US);
var2 = eingabe.nextDouble();
}
else
{
Locale.setDefault(Locale.GERMAN);
var2 = eingabe.nextDouble();
}
}
```
Dir ist klar, dass das schief gehen MUSS? Wenn das nächste ein Double ist, dann englisch (6.3), wenn nicht dann trotzdem nextDouble()!?

Möchtest du die Eingaben in englischer oder in deutscher Notation machen!? Ich denke du solltest dich entscheiden und dann den Code entsprechend umbauen. Meinetwegen speichere das Locale irgendwo weg, dass du es über einen weiteren Befehl ändern kannst.


----------



## Zidinjo (20. Okt 2014)

Ja, normalerweise nutze ich auch US. aber haben an der Uni diese aufgabe  und bekomme die nicht gescheid hin.

Soll ich dies als String speichern  oder was soll ich machen.


----------



## Natac (20. Okt 2014)

Mach doch einfach folgendes:

Schmeiß alle Locale.setDefault(...) raus. Schmeiß auch das if(eingabe.hasNextDouble()){...} raus und ließ die Zahlen ganz normal aus. Ohne zwischendurch irgendwann am Locale rumzufummeln.

Wenns dann nicht geht, meld dich hier nochmal.


----------



## Zidinjo (20. Okt 2014)

Natac hat gesagt.:


> Mach doch einfach folgendes:
> 
> Schmeiß alle Locale.setDefault(...) raus. Schmeiß auch das if(eingabe.hasNextDouble()){...} raus und ließ die Zahlen ganz normal aus. Ohne zwischendurch irgendwann am Locale rumzufummeln.
> 
> Wenns dann nicht geht, meld dich hier nochmal.




So gemacht. Jetzt klappt natürlich die eingabe mit dem Komma. aber wenn ich jetzt mit dem Punkt mache, dann meckert er natürlich wieder .)


```
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class PunktKomma 
{
	public static void main(String[] args)
	{
		DecimalFormat df = new DecimalFormat("###,###.###");
		String titel = "Berechnen der Quadratwertes";
		String willko = "Willkommen mein Freund";
		String eingabeFenster = "Bitte geben Sie den ersten Wert ein";
		String zweitesFenster = "Bitte geben Sie den zweiten Wert ein";
		
		JOptionPane.showMessageDialog(null, willko, titel, JOptionPane.CLOSED_OPTION);
		
		Scanner eingabe = new Scanner(JOptionPane.showInputDialog(null,eingabeFenster, titel, JOptionPane.PLAIN_MESSAGE));
		double var = eingabe.nextDouble();
		eingabe.close();
		
		eingabe = new Scanner(JOptionPane.showInputDialog(null,zweitesFenster, titel, JOptionPane.PLAIN_MESSAGE));
		double var2 = eingabe.nextDouble();
		eingabe.close();
	
		double umfang = var + var2;
		double flaeche = var * var2;
		
		JOptionPane.showMessageDialog(null,"Der Umfang: " + df.format(umfang) + " Die Flaeche: " + df.format(flaeche), titel, JOptionPane.PLAIN_MESSAGE);
	}
}
```


----------



## Zidinjo (20. Okt 2014)

Push / help ^


----------



## Thallius (20. Okt 2014)

Dann ersetze doch einfach nach der Eingabe des Strings alle vorhandene Punkte durch ein Komma. Dafür gibt es einen String.replace()

Gruss

Claus


----------



## Zidinjo (20. Okt 2014)

Yeahhh klappt :d !!!!

Lösung:


```
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class PunktKomma 
{
	public static void main(String[] args)
	{
		Locale.setDefault(Locale.US);
		DecimalFormat df = new DecimalFormat("###,###.###");
		String titel = "Berechnen der Quadratwertes";
		String willko = "Willkommen mein Freund";
		String eingabeFenster = "Bitte geben Sie den ersten Wert ein";
		String zweitesFenster = "Bitte geben Sie den zweiten Wert ein";
 
		JOptionPane.showMessageDialog(null, willko, titel, JOptionPane.CLOSED_OPTION);
 
		Scanner eingabe = new Scanner(JOptionPane.showInputDialog(null,eingabeFenster, titel, JOptionPane.PLAIN_MESSAGE));
		String var = eingabe.next();
		String neu = var.replace(",", ".");
		double zahl1 = Double.parseDouble(neu);
		eingabe.close();
 
		eingabe = new Scanner(JOptionPane.showInputDialog(null,zweitesFenster, titel, JOptionPane.PLAIN_MESSAGE));
		String var2 = eingabe.next();
		String neu2 = var2.replace(",", ".");
		double zahl2 = Double.parseDouble(neu2);
		eingabe.close();
		
		
 
		double umfang = zahl1 + zahl2;

		double flaeche = zahl1 * zahl2;
 
		JOptionPane.showMessageDialog(null,"Der Umfang: " + df.format(umfang) + " Die Flaeche: " + df.format(flaeche), titel, JOptionPane.PLAIN_MESSAGE);
	}
}
```


----------

