# Doublewert auf korrektheit überprüfen



## headnut (12. Jul 2011)

Hallo

ich habe einen Double wert der sich immer folgendermassen zusammensetzten muss:

xxxxx.xx

Wie kann ich den kontrollieren? 

Das format ist wichtig, die zahlen nicht, und der punkt muss an dieser stelle sein..

Vielen Dank schonmal


----------



## eRaaaa (12. Jul 2011)

Z.B.

```
double d = 44444.44;//xxxxx.xx
		boolean isValid = String.valueOf(d).matches("\\d{5}\\.\\d{2}");
```

/edit: mhm stimmt, das habe ich natürlich nicht beachtet, die Nachkommazahl wird natürlich abgetrennt ....Ich würde direkt Strings benutzen, anders wirds nicht gehen imho! (auch nicht mit den unten stehenden Lösungen!)


----------



## headnut (12. Jul 2011)

Das funktionier fast perfekt ich wusste dass es eine einfache lösung gibt

Nur der fall wenn ich nach dem punkt zwei 00 habe geht nicht, hast du da auch noch was oder soll ich was zurecht basteln?


----------



## Pippl (12. Jul 2011)

Wenn du es mit 2 Nullen ausgeben willst dann 

```
DecimalFormat f = new DecimalFormat(#.####); //(entsprechend angepasst)
System.out.println("Double: " + f.format(myDouble));
```

aus einem Thread hier im Forum
http://www.java-forum.org/java-basi...ert-formatiert-ausgeben-vector-sortieren.html


----------



## Andi_CH (12. Jul 2011)

So ein Schnellschuss ...

```
double d = 44444.00;//xxxxx.xx
	String fmt = "%.2f";
	String str = String.format(fmt, d);
	System.out.println(str);
	System.out.println(str.matches("\\d{5}\\.\\d{2}"));
```

Wobei das wohl versagt wenn der double z.B. 44444.00003 ist.
Vielleicht musst du etwas kombinieren, wobei doubles ja nicht beliebig genau abgebildet werden, also immer was dahinter kommen kann ... also ist der Test in meinen Augen sowieso ein bisschen fraglich.


----------



## headnut (12. Jul 2011)

Ich will aber nichts ausgeben sondern kontrollieren...

und eine division durch null geht halt nun mal nicht so einfach, deshab hab ich nochmal gefragt


----------



## Ariol (12. Jul 2011)

Benutz lieber 
	
	
	
	





```
matches("\\d{5}[,\\.]\\d{2}")
```
.
Durch die Lokalisierung wird nämlich schnell ein Komma aus dem Punkt.


----------



## headnut (12. Jul 2011)

okey wird aber alles zu schwammig jetzt!

es müssen ein . un zwei zahlen hinter dem punkt sein! dies ist das wichtigste!

das erste ist immer noch top. jedoch geht es einfach mit zwei 00 nicht! was auch logisch ist eigentlich...


----------



## HoaX (12. Jul 2011)

Wenn man die richtigen Methoden nimmt findet keine Lokalisierung statt. Ob eine stattfindet steht in der Doku.


----------



## Andi_CH (12. Jul 2011)

headnut hat gesagt.:


> Ich will aber nichts ausgeben sondern kontrollieren...
> 
> und eine division durch null geht halt nun mal nicht so einfach, deshalb hab ich nochmal gefragt


Ich dividiere doch nirgends durch null???
Also wenn du den Schritt von Ausgabe eines booleans zum Test nicht schaffst, ist dir nicht mehr zu helfen - sorry, aber bei der Affenhitze bin ich immer SEHR direkt.

```
double d = 44444.00;//xxxxx.xx
	String fmt = "%.2f";
	String str = String.format(fmt, d);
	if (str.matches("\\d{5}\\.\\d{2}")) {
		System.out.println("Zahl in Ordnung");
	} else {
		System.out.println("Zahl nicht in Ordnung");
	}
```

Besser so ???:L


----------



## Ariol (12. Jul 2011)

```
String.format()
```
 führt eine Lokalisierung durch.



> es müssen ein . un zwei zahlen hinter dem punkt sein! dies ist das wichtigste!


Der Punkt brauch dich nicht zu interessieren, da das die String-Darstellung eines Double-Wertes ist.



Ich finde die Aufgabenstellung etwas seltsam. Kann es sein, dass du String-Darstellungen von Double-Werten überprüfen sollst? Alles andere ist ziemliche Auslegungssache:

Welche davon sind denn korrekt?
00123.00?
00123.0?
00123?

Oder hiervon:
123.00?
123?
123.0?

Oder davon:
12345.00?
12345.0?
12345?


Wie dir auffällt sind die Zahlen innerhalb einer Gruppe die selben in verschiedenen Darstellungen.

Hast du ein Code-Stück oder ähnliches?
Wozu dient diese Überprüfung?

Es gibt außerdem verschiedene Arten das Thema anzugehen:

```
double d = 44444.44;//xxxxx.xx
boolean isValid = (d>=10000.00 && d<=99999.99) && ((d*100.0)-(int)(d*100.0)==0);
```


----------



## Ariol (12. Jul 2011)

Andi_CH hat gesagt.:


> ...
> 
> ```
> double d = 44444.00;//xxxxx.xx
> ...



Nö: 
	
	
	
	





```
Zahl nicht in Ordnung
```
Liegt daran, dass 
	
	
	
	





```
str="44444,00"
```
 ist.


```
double d = 44444.00;//xxxxx.xx
	String fmt = "%.2f";
	String str = String.format(fmt, d);
	if (str.matches("\\d{5}[,\\.]\\d{2}")) {
		System.out.println("Zahl in Ordnung");
	} else {
		System.out.println("Zahl nicht in Ordnung");
	}
```

So geht's bei mir.


----------



## eRaaaa (12. Jul 2011)

Ariol hat gesagt.:


> So geht's bei mir.



Nö

```
44444.0;
```
 ist bei dir ja auch in Ordnung 

Ich würde Strings benutzen ^^


----------



## headnut (12. Jul 2011)

Eben jetzt hat mich einer verstanden

das Format *muss* xxxxx.xx sein

Es spielt keine Rolle welchen wert sondern das format muss stimmen!

und eine letzte Version:



> double d = 44444.00;//xxxxx.xx
> String fmt = "%.2f";
> String str = String.format(fmt, d);
> if (str.matches("\\d{5}\\.\\d{2}")) {
> ...



funktioniert eben nicht!

Es ist nicht ganz so einfach, deshalbt hab ich auch nachgefragt


----------



## Ariol (12. Jul 2011)

Es ist schon ganz einfach, wenn du wirklich sagst was du willst.
Du hast keinen Double-Wert, sondern dessen String-Darstellung.

```
String value="12345.32";
boolean valid=value.matches("\\d{5}\\.\\d{2}");
```


----------



## headnut (12. Jul 2011)

Mittlerweile funktioniert die Sache. Vielen Dank an alle ich habe es nun zusätzlich über die länge gelöst!

Ich durfte nur nicht zuerst in einen double wert parsen, da für diesen .00 und .0 daselbe ist!


```
if (artikelnummer.matches("\\d{5}\\.\\d{2}")) {			
				System.out.println(artikelnummer.length());
	    	if (artikelnummer.length() == 8) {
				System.out.println("Artikelnummer OK");
				ok = true;
			} else {	
				System.out.println("Artikelnummer NOK");
				ok = false;
			}
		} else {
			ok = false;
		}
	    return ok;
	}
```

so gehts perfekt


----------



## Michael... (12. Jul 2011)

headnut hat gesagt.:


> ```
> if (artikelnummer.matches("\\d{5}\\.\\d{2}")) {
> ```


Wenn dieser RegEx passt, dann ist artikelnummer 8 Zeichen lang und die anschließende Überprüfung 
	
	
	
	





```
if (artikelnummer.length() == 8) {
```
 überflüssig.

Und da hier von "artikelnummer" die Rede ist, ist es merkwürdig warum Du die ganze Zeit von Doublewerten gesprochen hast, wenn es sich doch gar nicht um double Werte handelt??


----------



## Gast2 (12. Jul 2011)

wenn der Regex matcht dann hat dein String immer die Länge 8, deine if-abfrage ist da also nutzlos.


----------



## headnut (12. Jul 2011)

Ah ja das stimmt! hatte ich als test drin

Vielen Dank


----------

