AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Isalpha, IsNum, IsString als eine Funktion

Isalpha, IsNum, IsString als eine Funktion

Ein Thema von Go2EITS · begonnen am 3. Apr 2009 · letzter Beitrag vom 11. Apr 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#11

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:36
Zitat von R2009:
selbst auf die Gefahr hin zum Dauermeckerer zuwerden,
Kein Problem
Zitat:
ich kann hier keinerlei Zuordnung der elses zu irgenwelchen if's erkennen.
Das ist der Sinn des Delphi Styleguides. Code soll so leserlich wie möglich gehalten werden.
Das ist bei dir nicht der Fall.
Verwundert mich ein wenig aber okay
Zitat:
Delphi-Quellcode:
   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;
korrekt: (hier kann man den Code wenigstens lesen)
Delphi-Quellcode:
   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;
Hach, ich vermisse das "elseif"-Schlüsselwort aus PHP - in Delphi muss man dafür "else if" schreiben

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)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:43
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)
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#13

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 11:04
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 Hier im Forum suchenhimXML.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#14

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 13:13
@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:
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.
@R2009 + @Neutral General:
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!
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 14:05
Zitat von R2009:
...

korrekt: (hier kann man den Code wenigstens lesen)
Delphi-Quellcode:
   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;
...du sagst das kann man gut lesen, ich habe 2 mal genau hingucken müssen, was mich zu der Annahme, nein, Überzeugung bringt, auch dein Code ist nicht wirklich vernünftig formatiert


ICH würde es so machen...und jetzt vergleich mal, bei welchem Code man nur einmal gucken muss.

Delphi-Quellcode:
   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;
Jetzt kommt die Frage, "Muss das sein bei einer Zeile einen begin end zu haben?".
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!
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#16

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 14:19
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:
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;
13 Zeilen
Delphi-Quellcode:
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;
na gut ... nur 12 Zeilen
Delphi-Quellcode:
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;
6 Zeiler (so sieht's meißt bei mir aus ... die Codes muß aber meißt eh nur ich verstehn)
Delphi-Quellcode:
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;
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.


so, aber ich glaub hier ging es eh um was anderes
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 14:27
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#18

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 16:00
Vorläufige Endversion, Dank Eurer Hilfe, meiner Funktion:
Delphi-Quellcode:
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.
Zum Thema Formatierung:
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#19

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 16:26
Was passiert, wenn man der Prozedur jetzt einen String übergibt, in dem weder Ziffern noch Zeichen drin sind?

Also sowas wie
Zitat:
;-)
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#20

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 17:09
@Jheins
Dann gibt die Funktion als Antwort:
"Achtung, falsche Zeichen übergeben. Bitte korrigieren Sie Ihre Eingabe. Danke."

Erweitere die Funktion selbst:
ZeichenSet:=['a'..'z','A'..'Z',';','-',')']; // ;-) Voilá! Das wars.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz