![]() |
Re: Isalpha, IsNum, IsNumeric als eine Function
Zitat:
Zitat:
Zitat:
![]() Außerdem ist meine Einrückung ein wenig an das case angelehnt (das hier ja nicht geht weil Mengen verglichen werden) man könnte also noch ein paar andere Fälle abdecken, ohne dass der letzte Fall ganz weit rechts steht (weil er 10 mal eingerückt wurde) Wenns dich interessiert können wir ja einen neuen Thread aufmachen (evtl. mit Abstimmung) :mrgreen: |
Re: Isalpha, IsNum, IsNumeric als eine Function
Hi,
mach dich ruhig lustig über meine Anregungen. Nimm mal Code mit 1 Mio Zeilen und versuch den zu verstehen wenn er so geschrieben ist wie deiner. Soll ich bei jeder verschachtelten if then Konstruktion eine 1/4 Stunde suchen? Ich habe keinerlei Lust mit dem Rest der Gemeinde darüber zu diskutieren. Meine Meinung dazu ist: Es ist eine Unverschämtheit nichtformatierten Code in die DP zu schmeissen und dann zu erwarten, dass sich andere durchfummeln. Auch du musst lernen, dass Ordnung zum Leben dazugehört. Viel Grüsse (und antworte nicht mehr das bringt nichts) |
Re: Isalpha, IsNum, IsNumeric als eine Function
Wenn man das String jetzt auf Delphi2009 bezieht und/oder dieses auf Unicode umdenkt, dann wird es noch etwas aufwendiger, denn da gibt es nicht mehr nur die Buchstaben und Zahlen im ASCII-Bereich
siehe TXMLFile.CheckChar (TXMLFile.CheckString könnte Teilweise noch interessant sein) in ![]() da vorallem xtLetter für Buchstaben und xtDigit für Zahlen. das sind aber nur etwas vereinfachtere bzw. leicht abgeänderte Char-Listen nach XML-Standard ... wer das ganz genau haben möchte, muß sich wohl oder übel mal die Unicode-Dokumentationen vornehmen. PS: warum da keine Set-of-Char, sondern Case verwendet wurde ... tja ... Set-of-Char geht bei uncode nicht und die offizielle alternative Implementation für Unicode-Char-Sets ist mit zu langsam/aufwendig/umständlich. |
Re: Isalpha, IsNum, IsNumeric als eine Function
@jfheins
Die Lösung ist ja interessant, unabhängig davon, das immer 1 als Ergebnis gezeigt wird. Insbesondere hier ein Beispiel für die Verwendung von Include. Hier der Code (von jfheins) lauffähig mit den/dem Fehler/n:
Delphi-Quellcode:
@R2009 + @Neutral General:
program test3;
{$APPTYPE CONSOLE} uses SysUtils; // Dies ist unser ErgebnisTyp: type TCharTyp = (Ziffer, Zeichen, Andere); type TStringTyp = set of TCharTyp; function CheckStr(Str:string):TStringTyp; var i:Integer; begin // "Fehlerbehandlung" if Str = '' then begin Result := []; exit; end; for i:=1 to Length(Str) do begin if str[i] in ['0'..'9'] then Include(Result, Ziffer) else if str[i] in ['a'..'z','A'..'Z'] then Include(Result, Zeichen) else Include(Result, Andere); if Result = [Ziffer, Zeichen, Andere] then break; end; end; begin //Zum Testen: Writeln(Ord(checkstr('') = []));readln; Writeln(Ord(Ziffer in checkstr('190')));readln; writeln(Ord(Zeichen in checkstr('az')));readln; Writeln(Ord([Zeichen, Ziffer] = checkstr('az10')));readln; Writeln(Ord([Zeichen, Ziffer] <= checkstr('az10 !?.,;:-_<>')));readln; end. EXIT ist wohl die bessere Wahl. (Bin aus der Übung) Styleguide lesen? Ok. Aber dies sei erlaubt: Niemand wird gezungen einen Kommantar abzugeben oder sich meines kurzen Codes anzunehmen. Seid so nett, bleibt beim Thema. Danke! |
Re: Isalpha, IsNum, IsNumeric als eine Function
Zitat:
ICH würde es so machen...und jetzt vergleich mal, bei welchem Code man nur einmal gucken muss.
Delphi-Quellcode:
Jetzt kommt die Frage, "Muss das sein bei einer Zeile einen begin end zu haben?".
for i:=1 to Length(Str) do
begin if str[i] in ['0'..'9'] then begin Include(Result, Ziffer); end else if str[i] in ['a'..'z','A'..'Z'] then begin Include(Result, Zeichen); end else begin Include(Result, Andere); end; if Result = [Ziffer, Zeichen, Andere] then begin break; end; end; Meiner Meinung nach eindeutig JA! 1. Es ist auf dem ersten Blick klar, wo ein Block anfängt und aufhört. 2. Wenn man den Code erweitert muss man nicht genau gucken wo die Erweiterung hingehört und alles neu formatieren. 3. Der Code sieht überall gleich aus -> besser lesbar. Code Formatierung sollte, meiner Meinung nach, konsequent sein. IMMER! |
Re: Isalpha, IsNum, IsNumeric als eine Function
Problem ist dann nur bei "längeren Prozeduen, daß man diese dann nicht mehr überschauen kann, da sie so statt z.B. nur einer Bildschirm-Seite/Höhe gleich mal 2 bis 3 Mal so lang wird
21 Zeilen
Delphi-Quellcode:
13 Zeilen
for i:=1 to Length(Str) do
begin if str[i] in ['0'..'9'] then begin Include(Result, Ziffer); end else if str[i] in ['a'..'z','A'..'Z'] then begin Include(Result, Zeichen); end else begin Include(Result, Andere); end; if Result = [Ziffer, Zeichen, Andere] then begin break; end end;
Delphi-Quellcode:
na gut ... nur 12 Zeilen
for i:=1 to Length(Str) do
begin if str[i] in ['0'..'9'] then Include(Result, Ziffer); else if str[i] in ['a'..'z','A'..'Z'] then Include(Result, Zeichen); else Include(Result, Andere); if Result = [Ziffer, Zeichen, Andere] then break; end;
Delphi-Quellcode:
6 Zeiler (so sieht's meißt bei mir aus ... die Codes muß aber meißt eh nur ich verstehn)
for i:=1 to Length(Str) do
begin if str[i] in ['0'..'9'] then Include(Result, Ziffer); else if str[i] in ['a'..'z','A'..'Z'] then Include(Result, Zeichen); else Include(Result, Andere); if Result = [Ziffer, Zeichen, Andere] then break; end;
Delphi-Quellcode:
aber ist nun fast 4 Mal so lang ... stell dir das nun mal bei einer 50-zeiligen Prozedur vor, welche jetzt plötzlich 200 Zeilen wäre ... also übersichticher ist soein begin-end-überfluteter Code dann nicht wirklich.
For i := 1 to Length(Str) do Begin
If str[i] in ['0'..'9'] Then Include(Result, Ziffer); Else If str[i] in ['a'..'z','A'..'Z'] Then Include(Result, Zeichen); Else Include(Result, Andere); If Result = [Ziffer, Zeichen, Andere] Then Break; End; so, aber ich glaub hier ging es eh um was anderes :roll: |
Re: Isalpha, IsNum, IsNumeric als eine Function
Ein letztes Wort noch zur Formatierung.
Wenn eine Funktion/Methode 40-50 Zeilen hat, dann bin ich mir sicher, daß sie in mehrere neue Funktionen aufgeteilt werden kann. Und genau das mach ich dann, womit mein Code wieder ein Stück lesbarer wird. Edit: In den letzten 4-6 Monaten, habe ich keine einzige Methode/Funktion geschrieben, die mehr als 20 Zeilen hatte. Dafür hab ich halt sehr viele Methoden/Funktionen....meist wird aus einer Klasse durch Erweiterungen gleich drei Klassen usw....bin eigentlich am Dauerrefactoren....und ja ich bin überzeugt, daß mein Code seit dieser Zeit lesbarer, wiederverwendbarer und wartbarer geworden ist und ich trotz Dauerrefactoren richtig viel Zeit spare. |
Re: Isalpha, IsNum, IsNumeric als eine Function
Vorläufige Endversion, Dank Eurer Hilfe, meiner Funktion:
Delphi-Quellcode:
Zum Thema Formatierung:
program test;
{$APPTYPE CONSOLE} uses SysUtils; // Dies ist unser ErgebnisTyp: type r=(Leer,Ziffer,Zeichen,AlphaNum); function CheckStr(Str:string):r; type typ=set of Char; var i:Integer; ZiffernSet:typ; ZeichenSet:typ; ZiffernFlag:Boolean; ZeichenFlag:Boolean; begin // "Fehlerbehandlung" If Str='' then begin Result:=Leer;Exit;end;//<- Ergebnis: LEER // Sets zuweisen ZiffernSet:=['0'..'9']; ZeichenSet:=['a'..'z','A'..'Z']; // Flags initialisieren ZiffernFlag:=False; ZeichenFlag:=False; //// Hauptteil for i:=1 to Length(Str) do begin if str[i] in ZiffernSet then ZiffernFlag:=True; //.. nur Ziffern... if str[i] in ZeichenSet then ZeichenFlag:=True; // .. nur Zeichen... if Zeichenflag and ZiffernFlag then begin result:=AlphaNum; Exit;end;// <- Ergebnis: AlphaNum end; // ...die restlichen Results if ZiffernFlag then Result:=Ziffer; // <- Ergebnis: Ziffer if ZeichenFlag then Result:=Zeichen; // <- Ergebnis: Zeichen end; begin //Zum Testen: Writeln(Ord(checkstr('')));readln; Writeln(Ord(checkstr('190')));readln; writeln(Ord(checkstr('az')));readln; Writeln(Ord(checkstr('az10')));readln; // Als Ergebnisse werden 0, 1, 2, und 3 angezeigt. // Entspricht dem Code: type r=(Leer,Ziffer,Zeichen,AlphaNum); end. Ich schließe mich himitsu an: So wie den 6. Zeiler kann ich meinen Code auch nach Jahren noch lesen. und... "if..then..begin und end" schreibe ich wie oben in eine Zeile, wenn die Zeile kurz ist. Vielen Dank für Eure Beiträge, sie waren, wie man am Ergebnis sieht, sehr hilfreich. |
Re: Isalpha, IsNum, IsNumeric als eine Function
Was passiert, wenn man der Prozedur jetzt einen String übergibt, in dem weder Ziffern noch Zeichen drin sind?
Also sowas wie Zitat:
|
Re: Isalpha, IsNum, IsNumeric als eine Function
@Jheins
Dann gibt die Funktion als Antwort: "Achtung, falsche Zeichen übergeben. Bitte korrigieren Sie Ihre Eingabe. Danke." :-D Erweitere die Funktion selbst:
Delphi-Quellcode:
Voilá! Das wars.
ZeichenSet:=['a'..'z','A'..'Z',';','-',')']; // ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz