![]() |
StringList Buchstaben verbieten?
Guten Morgen zusammen:-D,
ich lese alle Ordernamen in eine StringList ein. Nun möchte ich mit diesen weiter arbeiten, jedoch nur mit denen, die numerisch sind. Gibt es irgendwie eine Möglichkeit, mit der man bei einer StringListe nur numerische Einträge zulasssen kann? Oder muss ich im nachhinein die nicht numerischen Einträge irgendwie raussuchen und dann löschen?:pale: Schon mal vielen Dank für eure Antworten:wink: |
AW: StringList Buchstaben verbieten?
Moin...:P
Zitat:
Zitat:
Zitat:
Sichwort: TSringList.Delete, Copy oder RexEx... |
AW: StringList Buchstaben verbieten?
Oder du machst dir eine Ableitung der TStringList und überschreibst die Add Methode. Hier kannst du direkt filtern was du zulassen möchtest und was nicht. Halte ich persönlich für die einfachste Variante ohne mir jetzt irgendwelchen SourceCode ausgedacht zu haben.
|
AW: StringList Buchstaben verbieten?
Danke für eure schnellen Antworten :)
Zitat:
Ich probier es nun mal so: Zitat:
|
AW: StringList Buchstaben verbieten?
Für ersteren Vorschlag hab ich mal schnell etwas zusammengedengelt. Es geht auch eleganter, aber ich denke, so ist es halbwegs verständlich:
Delphi-Quellcode:
Wenn ich keinen Denkfehler gemacht habe, sollten nur noch Strings hinzugefügt werden, die komplett aus Ziffern bestehen.
type
TMyStringList = class(TStringList) public function Add(const S: string): Integer; override; end; ... { TMyStringList } function TMyStringList.Add(const S: string): Integer; function IsNumeric(const s: string): Boolean; const NUMBERS = ['0'..'9']; var i: integer; begin Result := true; for i := 1 to Length(s) do if not (s[i] in NUMBERS) then begin Result := false; Exit; end; end; begin if IsNumeric(S) then Result := inherited Add(S) else Result := -1; end; |
AW: StringList Buchstaben verbieten?
Moin Jörn,
bitte denke dran: Da Du, aller Voraussicht nach, Zeilen aus der Strlngliste löschen wirst, solltest Du diese rückwärts durchgehen, also von StringList.Count-1 to 0, da Du ansonsten auf einen Fehler laufen wirst. (Index out of bounds) |
AW: StringList Buchstaben verbieten?
downto ;)
|
AW: StringList Buchstaben verbieten?
Zitat:
Entweder Inc(Idx) oder SL.Delete(Idx) :stupid: So, genug verwirrt ... viel Spaß noch damit. |
AW: StringList Buchstaben verbieten?
Zitat:
Delphi-Quellcode:
und
'0'
Delphi-Quellcode:
vergleicht.
'9'
Zur Erklärung grob vereinfacht: Jedes Zeichen entspricht einem numerischen Wert (also Strings sind eigentlich Zahlenketten; jede Zahl hat dann eine standardisierte Entsprechung). So weiß dann Windows oder dein Textzeichner deiner Wahl, welche Glyphe verwendet werden soll, die es zeichnen soll. So. Und jetzt ist das Schöne, dass die Zeichencodes von 0 bis 9 zufällig (?) ![]()
Delphi-Quellcode:
im entsprechenden Zahlenabschnitt ist. Dadurch, dass du nur mit '0' und '9' vergleichen musst, wird die Prüfung ein wenig effizienter, als wenn du in einem
s[i]
Delphi-Quellcode:
Feld nachschaust (der
NUMBERS
Delphi-Quellcode:
-Operator macht nach dem Übersetzen eine lineare Suche durch das Feld -> Aufwand ist multiplikativ mit der Länge des
in
Delphi-Quellcode:
-Feldes verknüpft)
NUMBERS
Wenn du natürlich auf beliebige bestimmte Zeichen testen musst, dann funktioniert dieser Trick unter Umständnen nicht mehr... :o Hoffe, ich habe nicht mehr verwirrt, als geholfen. Im Zweifel diesen Post einfach ignorieren :P Brighty |
AW: StringList Buchstaben verbieten?
Zitat:
(wie sehen noch mal die UNC-Angaben aus?) Gruß K-H |
AW: StringList Buchstaben verbieten?
Wow vielen Danke für den ganzen Input:-D
Hab es jetzt so gemacht: Zitat:
|
AW: StringList Buchstaben verbieten?
Moin Zusammen,
um die Verwirrung zu komplettieren: Wenn es sich um reine Ordnernamen handelt, also ohne Pfadtrenner könnte man auch TryStrToInt verwenden |
AW: StringList Buchstaben verbieten?
Aber auch nur, solange die Zahl nicht zu groß ist.
|
AW: StringList Buchstaben verbieten?
Das ist doch mal eine Möglichkeit einen Enumerator zu verwenden:
Delphi-Quellcode:
type
TNumericEnumerator = record constructor Create(AList: TStrings); private FIndex: Integer; FList: TStrings; function Accept(const AItem: string): Boolean; inline; function GetCurrent: string; inline; public function MoveNext: Boolean; inline; property Current: string read GetCurrent; function GetEnumerator: TNumericEnumerator; end; { TNumericEnumerator } function TNumericEnumerator.Accept(const AItem: string): Boolean; const NUMBERS = ['0'..'9']; var i: Integer; begin for i := 1 to Length(AItem) do begin if not (AItem[i] in NUMBERS) then begin Result := False; Exit; end; end; Result := True; end; constructor TNumericEnumerator.Create(AList: TStrings); begin FList := AList; end; function TNumericEnumerator.GetCurrent: string; begin Result := FList[FIndex]; end; function TNumericEnumerator.GetEnumerator: TNumericEnumerator; begin Result := Self; end; function TNumericEnumerator.MoveNext: Boolean; var i: Integer; begin for i := FIndex + 1 to FList.Count - 1 do begin if Accept(FList[i]) then begin FIndex := i; Result := True; Exit; // ==> end; end; Result := False; end; { Anwendung} procedure TuWas(AList: TStrings); var s: string; begin for s in TNumericEnumerator.Create(AList) do TuWasMitNumeric(s); end; |
AW: StringList Buchstaben verbieten?
Hallo,
TryStrToInt wäre auch meine erste Wahl. Ich nehme mal an, dass die Ziffern dann wohl noch ein Rolle spielen (Sortierung?), dann spielt das Argument "Länge" (max. 4Mrd.) keine Rolle, weil ja eh in Integer umgeformt werden muss. |
AW: StringList Buchstaben verbieten?
Zitat:
|
AW: StringList Buchstaben verbieten?
Zitat:
dann könnte man sie auch direkt als Text/String vergleichen. |
AW: StringList Buchstaben verbieten?
Es gibt auch "TryStrToInt64()", wenn es ein par Ziffern mehr sein dürfen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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