![]() |
Zahlen in einem String finden
Hallo
Gibt es eine elegante "procedure" um Zahlen in einen String zu finden
Delphi-Quellcode:
Mir ist schon klar eine Schleife und dann mit ORD
str := 'abc1def6q3uz3sdd8as2';
sehen ob es eine ASCII Zahl ist. Die Frage war aber ELEGANTE Danke meine Delphifreunde |
AW: Zahlen in einem String finden
Man könnte mit der
![]() |
AW: Zahlen in einem String finden
was meinst Du mit finden?
-Die erste Position (gegf. ab Position) die eine Ziffer ist -extrahieren der Ziffern in einen String -extrahieren in eine Liste mit Position/Ziffer -etc. |
AW: Zahlen in einem String finden
Zitat:
Wären es Zahlen, wäre es kein String ;) Man kann versuchen aus dem String eine Zahl zu interpretieren. Dabei ist es aber wichtig in welchem Kontext.
Code:
Kann als Zahlenwert bedeuten: 4, 64, 100, 256, ... und ich habe jetzt nur mal so Standard-Zahlensysteme zugrunde gelegt.
100
|
AW: Zahlen in einem String finden
Oder sind doch Ziffern gemeint?
Also einfach nur eine Matrix, welche Ziffern (0-9) drin vorkommen. Wenn es doch um Zahlen geht, dann gibt es dazu auch schon ein paar Threads, mit vielen Lösungen. "abc123def45xy9" > 123, 45 und 9 |
AW: Zahlen in einem String finden
Zitat:
|
AW: Zahlen in einem String finden
Zitat:
|
AW: Zahlen in einem String finden
Danke, Danke
Gut zu wissen das es leider nicht elegant geht. Manchmal sieht mir hier so geniale Lösungen wo man sich sagt, Oh das war aber klug. |
AW: Zahlen in einem String finden
Zitat:
|
AW: Zahlen in einem String finden
Delphi-Quellcode:
Also habe das so gemacht, geht echt gut
function CountNumber(const Str: string): tNumArray;
var i,a : integer; begin FillChar(Result , SizeOf(tNumArray) , 0); a := 0; for i := 1 to length(Str) do if (ord(Str[i]) >= 48) and (ord(Str[i]) <= 57) then begin Result[a] := StrToInt(Str[i]); inc(a); end; end; ist aber nicht "ELEGANT" Wie komme ich darauf. In C++ geht vieles, laßt mich sagen anders. Manches dort ist "ELEGANT" anderes einfach schwer zu lesen, dedewegen liebe ich Delphi |
AW: Zahlen in einem String finden
Zitat:
Delphi-Quellcode:
var
sInput, sOutput: String; i: Integer; begin sInput := 'abc1def6q3uz3sdd8as2'; sOutput := ''; for i := 1 to Length(sInput) do if sInput[i] in ['0'..'9'] then sOutput := sOutput + sInput[i]; end; |
AW: Zahlen in einem String finden
Also Elegant wäre ein Callback (Event) zu verwenden.
Delphi-Quellcode:
Das Argument von
TNumberEvent = procedure(const number:string) of object;
procedure ExtractNumbers(const s : string; callback :TNumberEvent); begin if not Assigned(callback) then Exit; // Rest ist Hausaufgabe end;
Delphi-Quellcode:
könnte auch ein Integer sein, aber dann besteht die Gefahr des Überlaufs.
TNumberEvent
|
AW: Zahlen in einem String finden
Wobei ich mich erstmal gefragt hatte, was tNumArray sein soll.
PS:
Delphi-Quellcode:
if (ord(Str[i]) >= 48) and (ord(Str[i]) <= 57) then begin
if (Str[i] >= '0') and (Str[i] <= '9') then begin if CharInSet(Str[i], ['0'..'9']) then begin // früher if Str[i] in ['0'..'9'] then begin |
AW: Zahlen in einem String finden
Einen hab ich auch noch (im Editor getippt, daher ohne jede Gewähr):
Delphi-Quellcode:
function CountNumber(const Str: string): tNumArray;
const MIN_NUMINDEX = $30; var ArrIndex: integer; p: PChar; begin SetLength(Result, Length(Str)); ArrIndex := 0; p := PChar(Str); if Assigned(p) then begin while p^ <> #0 do begin {$IFDEF UNICODE} if CharInSet(p^, ['0'..'9']) then {$ELSE} if p^ in ['0'..'9'] then {$ENDIF} begin Result[ArrIndex] := Ord(p^) - MIN_NUMINDEX; inc(ArrIndex); end; p := CharNext(p); end; SetLength(Result, ArrIndex); end; end; |
AW: Zahlen in einem String finden
Vielleicht so etwas?
![]() Ist sicherlich nicht ganz nah dran an elegant, aber war mal mehr für Ausbildungszwecke gedacht im Bereich Zustände/Zustandsmaschinen... Bietet aber die Option Integer und Floatwerte zu extrahieren, optional negative Zahlen zuzulassen, etc... Jan |
AW: Zahlen in einem String finden
Was versteht der Fragesteller eigentlich unter 'ELEGANT'?
Wo ist der Unterschied zu 'elegant' (klein geschrieben) Meint er 'Kompakt'?
Delphi-Quellcode:
Wäre jetzt das "ELEGANT"este, was mir einfällt.
for c in s do
if IsDigit(c) Then result.add(ord(c)-48); |
AW: Zahlen in einem String finden
Ich muss beim Schreiben anscheinend eine Wolldecke im Mund haben :roll:
Bislang habe ich noch nicht gesehen, was rein- und rauskommen soll. Nur irgendwelchen Code, wo die Typbezeichnungen etwas anderes suggerieren als der Code wirklich liefern kann (ich beziehe mich auf den TE). Wenn ich als Eingabeparameter einen String habe und die Funktion CountNumber heißt, dann würde ich als Ergebnis ein Integer erwarten der mir die Anzahl der Zahlen in dem String liefert. Diese Funktion liefert aber ein NumArray (ein Array von Zahlen) zurück. Ok, es sollen also Zahlen zurückgegeben werden. Schaue ich mir den Code an, dann stelle ich fest, dass
Code:
Irgendwie hätte ich jetzt das erwartet
a35s4 => (3,5,4,0,0)
Code:
Evtl. kann mir mal jemand (der TE) eine Kerze anzünden und mich erleuchten
a35s4 => (35,4)
|
AW: Zahlen in einem String finden
Anhand seines Beispielcodes gehe ich bislang davon aus, dass er ein Array aus Ziffern befüllen möchte.
|
AW: Zahlen in einem String finden
Zitat:
TNumArray passt zur Fragestellung, aber das darin enthaltene Ergebnis wiederum in keinster Weise Es kann doch nicht zuviel verlangt sein, wenn man eine kleine Textzeile als Erklärung erwartet. Die Vorlage habe ich ja gegeben |
AW: Zahlen in einem String finden
ich denke er möchte so etwas machen
Delphi-Quellcode:
Gruß
myarray = array [0..255] of integer;
fillchar(myarray,sizeof(myarray),#0); for i:=1 to length(mystring) do inc(myarray[byte(mystring[i]),1)]; for i:=byte('0') to i:=byte('9') do writeln(char(i)+' '+inttostr(myarray[i]); K-H |
AW: Zahlen in einem String finden
Nja, bei Unicode macht der Code eventuell nicht ganz, was er soll. (aber zumindestens gibt es keine Zugriffsverletzungen)
Aber am Sichersten ist hier nicht
Delphi-Quellcode:
aka
array[0..255]
Delphi-Quellcode:
, sondern
array[Byte]
Delphi-Quellcode:
, also ein Array mit Feldern für jeden Char-Wert.
array[Char]
Und man kommt beim Char auch ohne Konvertierung aus, da es ja schon Chars sind.
Delphi-Quellcode:
myarray = array[Char] of Integer;
FillChar(myarray, SizeOf(myarray), 0); for i := 1 to Length(mystring) do Inc(myarray[mystring[i]]); // mit Forin sieht es auch ganz nett aus (wenn das Delphi sowas schon kann) for C in mystring do Inc(myarray[C]); for C := '0' to '9' do WriteLn(C, ' ', myarray[C]); // man kann die Typumwandlungen vom Write/Writeln auch benutzen, wenn man mag bzw. nur das, was man braucht
Delphi-Quellcode:
myarray = array['0'..'9'] of Integer;
FillChar(myarray, SizeOf(myarray), 0); for i := 1 to Length(mystring) do if mystring[i] in ['0'..'9'] then Inc(myarray[mystring[i]]); for C in mystring do if CharInset(mystring[i], ['0'..'9']) then Inc(myarray[C]); for C := '0' to '9' do // for C := Low(myarray) to High(myarray) do WriteLn(C, ' ', myarray[C]); |
AW: Zahlen in einem String finden
Jetzt sei mal nicht so pingelig, beachte bitte, daß ich ein Array of Integer und nicht of Byte genutzt habe.
Ernsthaft, wie groß wird eigentlich dieses
Delphi-Quellcode:
? Mein alter TI konnte damit nicht mehr umgehen.
array[char] of byte
Gruß K-H |
AW: Zahlen in einem String finden
256, bzw. 131072 Bytechen (ANSI/Unicode)
Der kleine latainische Buchstabe Kra (#$0138) oder der arabische Buchstabe Zah (#$0638) ist als "Byte" eine 8 (#$0038) |
AW: Zahlen in einem String finden
Die ganze Diskussion erinnert mich wieder an:
![]() |
AW: Zahlen in einem String finden
Zitat:
evtl. kommen wir ja noch zum konkreten Teil :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 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