# String auf Ziffern prüfen



## Guest (11. Jan 2008)

Gibt es eine elegantere Möglichkeit einen String auf Ziffern zu überprüfen (0-9) ohne gleich eine riesen Switch-Case anweisung oder 10 if-Abfragen zu implementieren?


----------



## Jonnsn (11. Jan 2008)

das könnte interessant für dich sein
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

bzw. iA. zumindest die Regular Expressions

Beispiel: mind. eine oder mehrere zahlen?

```
if("2132341".matches("\\d+")){
			System.out.println("zahlen");
		}
```


----------



## Niki (11. Jan 2008)

```
String s = "1232";
if(s.matches("^[\\d]*$")){
  //String ist gültig
} else {
  //String ist ungültig
}
```


----------



## Guest (11. Jan 2008)

Zunächst mal danke, aber wie mache ich das wenn es kein reiner Zahlenstring ist sondern auch andere Zeichen enthält?

Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen. Das mit den Klein- und Großbuchstaben hatte ich schon anders gelöst, aber scheinbar kann man ja auch alle drei Abfragen in eine einzige Anweisung packen.


```
String test1 = "Dies ist der 2. Test."; // soll true ergeben
String test2 = "dies ist der zweite test"; // soll false ergeben
String test3 = "Dies ist der zweite Test"; // soll false ergeben
```
[/code]


----------



## Verjigorm (11. Jan 2008)

Anonymous hat gesagt.:
			
		

> Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen. Das mit den Klein- und Großbuchstaben hatte ich schon anders gelöst, aber scheinbar kann man ja auch alle drei Abfragen in eine einzige Anweisung packen.




```
string.matches("[a-zA-z0-9]*")
```
würde dir anzeigen ob der String nur aus Klein/Großbuchstaben und Zahlen besteht.
sobald ein anderes Zeichen im String vorkommt, wird false zurückgegeben


----------



## Niki (11. Jan 2008)

so gehts auch, ist ein wenig kürzer:

```
"1223sadfasf32ASFasf".matches("[\\w]*");
```


----------



## Backwardsman (11. Jan 2008)

ich verteidigere mal wieder die alternative methode (ohne reguläre ausdrücke und abwärtskompatibel ;-) ):

```
String s = "...";
char c;
for (int i=0; i<s.length(); i++) {
    c = s.charAt(i);
    if (c < 58 && c > 47) System.out.println("Zeichen "+i+" ist eine Ziffer");
    if (c < 123 && c > 96) System.out.println("Zeichen "+i+" ist ein Kleinbuchstabe");
    if (c < 91 && c > 64) System.out.println("Zeichen "+i+" ist ein Großbuchstabe");
}
```


----------



## Guest (11. Jan 2008)

Danke für die Hilfe


----------



## Jonnsn (11. Jan 2008)

das sollte doch auch gehen oder?


```
String[] test = new String[3];
		test[0] = "Dies ist der 2. Test."; // soll true ergeben
		test[1] = "dies ist der zweite test"; // soll false ergeben
		test[2] = "Dies ist der zweite Test"; // soll false ergeben 
		for (int i=0;i<3;i++){
			if(test[i].matches(".*[\\d+].*")){
				System.out.println("zahlen");
			}else{
				System.out.println("keine zahlen");
			}	
		}
```


----------



## lhein (11. Jan 2008)

Backwardsman hat gesagt.:
			
		

> ich verteidigere mal wieder die alternative methode (ohne reguläre ausdrücke und abwärtskompatibel ;-) ):
> 
> ```
> String s = "...";
> ...



Ich würde mal sehr stark bezweifeln, daß dieser Vorschlag eine vernünftige Alternative ist, zumal ich ja Plattformunabhängigkeit haben möchte. Und die geprüften Bereiche müssen nicht immer das enthalten, was Du darin vermutest.

lr


----------



## Niki (11. Jan 2008)

Jonnsn hat gesagt.:
			
		

> das sollte doch auch gehen oder?
> 
> 
> ```
> ...



Dein Pattern gibt an dass irgendwo im String mindestens eine Ziffer vorkommen muss, das kann daher das auch sein:
asfasf1asfasdf


----------



## Backwardsman (11. Jan 2008)

LR hat gesagt.:
			
		

> Ich würde mal sehr stark bezweifeln, daß dieser Vorschlag eine vernünftige Alternative ist, zumal ich ja Plattformunabhängigkeit haben möchte. Und die geprüften Bereiche müssen nicht immer das enthalten, was Du darin vermutest.


na dann zeig mir mal bitte eine plattform, welche nicht mit ascii arbeitet!


----------



## Verjigorm (11. Jan 2008)

Niki hat gesagt.:
			
		

> so gehts auch, ist ein wenig kürzer:
> 
> ```
> "1223sadfasf32ASFasf".matches("[\\w]*");
> ```



da ist noch der "Unterstrich" dabei, davon war keine Rede 

außerdem sieht er bei meinem Beispiel besser, wie er sowas aufbauen kann ^^


----------



## Jonnsn (11. Jan 2008)

Niki hat gesagt.:
			
		

> Dein Pattern gibt an dass irgendwo im String mindestens eine Ziffer vorkommen muss, das kann daher das auch sein:
> asfasf1asfasdf


war doch auch gefragt?!


----------



## lhein (11. Jan 2008)

Backwardsman hat gesagt.:
			
		

> LR hat gesagt.:
> 
> 
> 
> ...



IBM z/OS arbeitet z.B. auf ebcdic Basis 

lr


----------



## Backwardsman (11. Jan 2008)

Verjigorm hat gesagt.:
			
		

> außerdem sieht er bei meinem Beispiel besser, wie er sowas aufbauen kann ^^


 boah, stinkts hier nach eigenlob ;-)


----------



## Niki (11. Jan 2008)

Verjigorm hat gesagt.:
			
		

> Niki hat gesagt.:
> 
> 
> 
> ...



Ohh, da hast du recht, das hab ich übersehen dass beim \w auch _ dabei ist. a-zA-Z0-9 ist sicher besser  :toll:


----------



## Niki (11. Jan 2008)

Jonnsn hat gesagt.:
			
		

> Niki hat gesagt.:
> 
> 
> 
> ...



Nein, er will prüfen ob ein String nur aus Ziffern besteht


----------



## Jonnsn (11. Jan 2008)

will er das?


			
				Anonymous hat gesagt.:
			
		

> Zunächst mal danke, aber wie mache ich das wenn es* kein reiner Zahlenstring* ist sondern auch andere Zeichen enthält?
> 
> Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen. Das mit den Klein- und Großbuchstaben hatte ich schon anders gelöst, aber scheinbar kann man ja auch alle drei Abfragen in eine einzige Anweisung packen.
> 
> ...


 :###  :?


----------



## Backwardsman (11. Jan 2008)

LR hat gesagt.:
			
		

> IBM z/OS arbeitet z.B. auf ebcdic Basis


na, dann werd ich auch noch ein bisschen klugscheißen 


> Als eine der größten Hürden bei der Portierung des C-Teils der Referenzimplementierung
> erwies sich die Tatsache, daß OS/390 intern EBCDIC benutzt, um Character-
> Daten zu kodieren. So wurde entschieden, die C-Strings in ASCII zu kodieren, welches
> von den meisten (anderen) Plattformen verwendet wird. Dieser Ansatz machte es notwendig,
> ...


noch fragen? ;-)


----------



## Niki (11. Jan 2008)

ja, aber du hast .* in deinem Pattern und das steht für jedes Zeichen, also auch Sonderzeichen.

Ui, 1:0 für Backwardsman


----------



## Jonnsn (11. Jan 2008)

Niki hat gesagt.:
			
		

> ja, aber du hast .* in deinem Pattern und das steht für jedes Zeichen, also auch Sonderzeichen.


"noch andere zeichen enthält" schließt auch Sonderzeichen nicht aus oder?


----------



## Niki (11. Jan 2008)

*Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen*


----------



## Jonnsn (11. Jan 2008)

ich versteh zwar nicht wieso du so darauf rumreitest aber:
String test1 = "Dies ist der 2*.* Test."; // soll true ergeben
 enthält einen Punkt = Punkt-Zeichen = Sonderzeichen ... oder? und das beispiel kam - denke ich doch - vom Thread ersteller...


----------



## Verjigorm (11. Jan 2008)

Niki hat gesagt.:
			
		

> *Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen*



siehe mein Code oben und ignoriere die Laberein hier


----------



## Jonnsn (11. Jan 2008)

deine variante war doch die:

```
string.matches("[a-zA-z0-9]*")
```
?
schonmal mit den gewünschten beispielen getestet?

```
"Dies ist der 2. Test.".matches("[a-zA-z0-9]*");
```
 -> false


edit: ach was soll das hier - führt doch zu nix  :lol: genug beispiele gibts jetzt jedenfalls...


----------



## lhein (11. Jan 2008)

Backwardsman hat gesagt.:
			
		

> LR hat gesagt.:
> 
> 
> 
> ...



Das Klugscheißen ist Dir hiermit eindeutig gelungen, oder wie Niki zu sagen pflegte: 1:0 für Dich  
Das oben angesprochene war mir tatsächlich neu und ich finds sehr interessant zu wissen. Danke für den Tipp.

Aber:
Dennoch finde ich die Art, in der Du die Prüfung machst, unsauber. 
In dem Fall mag es noch funktionieren, aber wenn es mal über ASCII Zeichen hinausgeht (ich weiss, daß es hier nicht gefragt war), ist es unbrauchbar. 

lr


----------



## Backwardsman (11. Jan 2008)

naja, aber so lange ein char in Java den ascii-wert eines zeichens repräsentiert funktioniert das ganze. 

reguläre ausdrücke gibt es in java auch erst seit version "1.4" und ich glaube nicht, dass man bis zu dieser version solche abfragen nur "unsauber" machen konnte!? ich nehme sogar stark an, dass reguläre ausdrücke, text-parser etc. intern alle nach diesem prinzip arbeiten und die codierung der einzelnen zeichen auswerten... wie auch sonst!?

ich bin einfach kein freund von regulären ausdrücken, weil man sie nur benutzen sollte wenn man sich richtig gut damit auskennt... und gerade an diesem thread sieht man doch, welche unstimmigkeiten und unsicherheiten über die verwendung regulären ausdrücke existiert!

... vielleicht hängt das auch damit zusammen, dass ich an der uni viel zu intensiv mit formalen sprachen, regulären ausdrücken etc. gequält wurde ;-)


----------



## lhein (11. Jan 2008)

Jupp, RegExp sind nicht so einfach zu verwenden. Muß da selbst auch immer erst suchen und probieren, da ich es extrem selten verwende.  Und verständlich sind sie auch nicht unbedingt.

Bei der Art Prüfung mit c > ... && c < .. hab ich mich einfach an Codepassagen aus dem C erinnert, wo auch irgendwelche Leute wild chars mit Werten verglichen haben, ohne sich bewusst zu machen, dass es neben ASCII auch noch anderes gibt.

lr


----------



## Guest (11. Jan 2008)

1. Java verwendet nicht ASCII, sondern Unicode

2. Warum kryptische Zahlen verwenden, wenn man auch mit char vergleichen kann?

```
if (c >= '0' && c <= '9')
```

Fred


----------



## Backwardsman (11. Jan 2008)

Anonymous hat gesagt.:
			
		

> 1. Java verwendet nicht ASCII, sondern Unicode


oh mann, was ist das denn für ein klugscheißer-thread :-D ... ich weiß ja nicht, was du in deine Strings so reinschreibst... bei mir sind das typischerweise nur die zeichen 32 bis 126... und die juckt es nicht ob sie jetzt ascii oder unicode zugeordnet werden!



> 2. Warum kryptische Zahlen verwenden, wenn man auch mit char vergleichen kann?
> 
> ```
> if (c >= '0' && c <= '9')
> ```


das stimmt natürlich... wurde aber bereits als "unsauber" abgestempelt ;-)


----------

