Zeile überprüfen

Status
Nicht offen für weitere Antworten.

insertcoin

Aktives Mitglied
Hey ho,

ich lese eine AsciiFile zeilenweise aus, und gebe bestimmt Teile an eine DB weiter. Bisher nur als String, ich möchte aber ein paar bestimmte Attribute als INT übergeben.
Mein Problem ist, dass ich nicht kontrollieren kann ob in meinem String jetzt wirklich nur Zahlen oder auch Buchstaben stehen.

Gibts irgendeine Abfrage, die mir versichert dass in meinem String nur ZAhlen stehen??

Schon mal danke!!

Greeetz insertcoin
 
danke, das ist nicht schlecht. aber mit der methode muss ich ja auch jedes zeichen einzeln testen.
ich hab gehofft, dass schon mal jemand eine methode geschrieben hat die die ganze zeile abfrägt..
dass heißt, ich übergebe nur den sting. und bekomme ein false, wenn ein anderes zeichen drin steckt.

sonst muss ich mir das teil eben selber schreiben, wär ja auch nicht so wild.
 
Wie wär's mit einer Schleife? So eine Methode zu schreiben ist ja nicht schwierig. Eine handvoll Zeilen (mit Exception-Handling).

Leute wollen heutzutage wirklich nix mehr selber machen. Anstatt in Foren zu posten, hättest du das doch viel schneller selbst aus dem Ärmel geschüttelt. Oder Google gefragt (isDigit, isNumeric) - da sind die paar Zeilen hunderte Male aufgelistet.
 
mach einfach ein chararray aus deiner zeile und iterier drüber..
das ist performant 🙂
 
das hat doch nichts damit zu tun, dass ich keine lust habe oder so. sondern einfach nciht etwas, dass ein anderer schon programmiert hat. nochmal schreiben möchte, ist ja auch unsinnig. in der zeit kann ich schon wieder was anderes schreiben, also bleib mal ganz locker.

ich machs ja jetzt auch selber..

Danke für eure Bemühungen!!
 
Wenn du hier eine eigene Funktion verwendest, solltest du dir noch überlegen, ob bestimmte Sonderfälle auftreten können. Den hier bereits angedeutete Weg, einfach über das char-Array zu iterieren und zu prüfen, ob alle Zeichen der Bedingung Character#isDigit genügen, könnte man ja so implementieren:
Code:
	public static boolean check1( String str) {
		for ( char c : str.toCharArray()) {
			if ( !Character.isDigit( c)) return false;
		}
		return true;
	}
Diese Methode liefert allerdings auch dann true, wenn a) ein Leerstring, b) ein String mit einer negativen Zahl oder c) ein String mit einem Wert größer Integer.MAX_VALUE übergeben wird.

Den ersten beiden Sonderfällen kann man so begegnen:
Code:
	public static boolean check2( String str) {
		if ( str.length() == 0) return false;
		char[] cc = str.toCharArray();
		for ( int i=0; i<str.length(); i++) {
			char c = cc[i];
			if ( !Character.isDigit( c)) return (i==0) && (c == '-');
		}
		return true;
	}

Beide Wege sind deutlich schneller als Integer#parseInt (grob gemessen liegt da der Faktor 35 dazwischen); allerdings stellt sich die Frage, ob du im Rahmen der Verarbeitung in der Datenbank den Wert nicht doch als int brauchst. Und dann musst du eben doch wieder Integer#parseInt aufrufen, so dass sich die vorgeschaltete eigene Prüfung nur noch dann lohnt, wenn der Wert wirklich falsch ist (denn dann spart man sich für diesen Wert die teure parse-Operation).
 
danke für den tip, werde das berücksichtigen.
den parseInt Befehl brauche ich nciht, ich nehm nur den Wert (String) und häng ihn an einen StringBuffer der den Befehl darstellt.
z.b.

Insert into tabelle (Attributnamen) value (hier wird nun der wert angehängt);

wichtig ist nur dass im string kein anderes zeichen ist, wenn ich das attribut auf der DB als INT abspeicher. Da meine Applikation sonst eine SQLException wirft.
 
insertcoin hat gesagt.:
wichtig ist nur dass im string kein anderes zeichen ist, wenn ich das attribut auf der DB als INT abspeicher. Da meine Applikation sonst eine SQLException wirft.
Dann ist aber auch wichtig, dass der Wert nicht zu groß ist - wie groß er sein kann, hängt AFAIK von der verwendeten Datenbank ab; der SQL-Standard überlässt das der konkreten Implementierung. I.d.R. sind es aber mindestens 32 Bit, so dass ein Java-int passt. Der Wert "12345678901234567890123456789012345678901234567890" wird aber im Zweifel nicht passen, was dann vermutlich auch eine SQL-Exception zur Folge haben wird.

Ich würde hier lieber Integer#parseInt verwenden, obwohl das deutlich länger dauert als die zeichenweise Iteration: im Vergleich zur anschließenden Datenbankoperation ist diese Zeit nämlich komplett vernachlässigbar.
 
hast recht, so kritisch hab ich das gar nciht betrachtet. aber immerhin sind das benutzereingaben, da könnte schon jeglicher blödsinn anfallen.
werds dann wohl doch so machen, danke nochmal für den tip.

hast wohl schon so deine erfahrungen gemacht, wenn du da gleich an alles denkst oder 🙂 !?
 
insertcoin hat gesagt.:
hast wohl schon so deine erfahrungen gemacht, wenn du da gleich an alles denkst oder 🙂 !?
An alles kann wohl keiner denken, aber ja - über das Problem, dass Anwender alles andere als kooperativ sind und den größten Schrott eingeben, bin ich auch schon gestolpert :wink:
 
stimmt, an alles kann man echt nie denken. aber wenigstens an möglichst viel ist immer schon super 🙂.
ist echt so, da ist man manchmal noch so überzeugt von seiner software. aber wenn der erste benutzer kommt, schafft der das trotzdem das ding abzuschießen. naja, muss man mit leben 🙂.
 
Also ich finde zwar auch, dass es viele Leute gibt, die einfach mal posten, anstatt selbst zu schauen, aber in Deinem Fall finde ich die Frage berechtigt. Etwas besser wäre es noch gewesen, wenn Du noch etwas mehr um Dein Problem herum gepostet hättest. Mich wundert, dass da jetzt noch keiner drauf hingewiesen hat:

insertcoin hat gesagt.:
ich nehm nur den Wert (String) und häng ihn an einen StringBuffer der den Befehl darstellt.
z.b.
Insert into tabelle (Attributnamen) value (hier wird nun der wert angehängt);

Dafür gibt es PreparedStatements. Mit denen erübrigen sich solche umständlichen Konstruktionen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben