Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zahlen aus String extrahieren (https://www.delphipraxis.net/154901-zahlen-aus-string-extrahieren.html)

youuu 30. Sep 2010 08:20

Zahlen aus String extrahieren
 
Hi,

wie kann ich z.B bei "asj231k1-.21oa=" alle Zahlen extrahieren, existietr dafür schon eine Methode oder muss ich mich ran setzen und eine selber dafür schreiben?

scrat1979 30. Sep 2010 08:36

AW: Zahlen aus String extrahieren
 
Mal schnell zusammengeflickt....

Delphi-Quellcode:
function ExtractNumbers(s : String) : String;
var i : Integer;
begin
 Result := '';
 for i := 1 to length(s) do
  if s[i] in ['0'..'9'] then Result := Result + s[i]
end;
Könntest auch zuerst alle Nicht-Zahlen aus dem String löschen und dann den "Reststring" dem Result zuordnen.

himitsu 30. Sep 2010 14:30

AW: Zahlen aus String extrahieren
 
Was meinst du mit alle Zahlen extrahieren?
- einen String ohne Fremdzeichen "231121"
- alle Zahlen(gruppen) einzeln "231", "1" und "21"
- ...

Daniela.S 30. Sep 2010 14:34

AW: Zahlen aus String extrahieren
 
Hatten wir da nicht unlängst was...?

http://www.delphipraxis.net/153869-s...ml#post1043095

youuu 30. Sep 2010 17:36

AW: Zahlen aus String extrahieren
 
Sorry für die späte antwort.
Himitsu alle Zahlen meinte ich nicht gruppiert oder sonstiges.

Ich versuch nachher gleich einmal scrat1979 Code.

xZise 30. Sep 2010 17:53

AW: Zahlen aus String extrahieren
 
Moin,
Zitat:

Zitat von youuu (Beitrag 1053006)
[...]Himitsu alle Zahlen meinte ich nicht gruppiert oder sonstiges.[...]

Das sollte dann funktionieren. Der Code von scrat ergibt Himitsus erste Variante (231121). Den musst du nur noch in einen Integer umwandeln.

Zitat:

Zitat von Daniela.S (Beitrag 1052961)
Hatten wir da nicht unlängst was...?

http://www.delphipraxis.net/153869-s...ml#post1043095

Das ist ein andere Level (allgemein die Funktionen die da stehen). Die hier genannte Funktion geht jedes Zeichen durch, guckt ob es valid ist und fügt es zusammen.

Nichts gegen dich youuu.

MfG
Fabian

scrat1979 30. Sep 2010 21:18

AW: Zahlen aus String extrahieren
 
Zitat:

Zitat von xZise (Beitrag 1053010)
Das ist ein andere Level (allgemein die Funktionen die da stehen). Die hier genannte Funktion geht jedes Zeichen durch, guckt ob es valid ist und fügt es zusammen.

Nichts gegen dich youuu.

MfG
Fabian

Ich persönlich halte die dort genannte Funktion für etwas Overkill, um "nur" z.B. bei einer Eingabe die ungültigen Zahlen herauszufilter. Ich denke, da merkt man den Geschwindigkeitsunterschied bestimmt nicht. Warum einfach wenn's auch kompliziert geht. Auch wenn ich sagen muss, dass die dort genannte Funktion "schon was hat" :) Aber ich denke, meine Funktion ist übersichtlich, leicht verständlich und tut ihren Zweck...

himitsu 1. Okt 2010 01:32

AW: Zahlen aus String extrahieren
 
Zitat:

Zitat von scrat1979 (Beitrag 1053074)
Ich persönlich halte die dort genannte Funktion für etwas Overkill, um "nur" z.B. bei einer Eingabe die ungültigen Zahlen herauszufilter.

Na gut, dort drüben war's auch 'ne etwas andere Anforderung.
- schneller
- öfters
- anderes Extraktionsmuster

Also kann man es sich nun aussuchen:
- "lösche alles, was keine Zahl ist"
Delphi-Quellcode:
function GetNum(S: String): Integer;
var i: Integer;
begin
  for i := Length(S) downto 1 do
    if not (S[i] in ['0'..'9']) then Delete(S, i, 1);
  Result := IntToStr(S);
end;
- "hänge alle Zahlen an einen neuen String an"
(siehe scrat1979)
- "füge alle Zahlen in einen neuen String ein", bzw. "... einem neuen String zusammen"
function ExtractNumbers(s : String) : String;
Delphi-Quellcode:
var i : Integer;
begin
  Result := '';
  for i := 1 to length(s) do
    if s[i] in ['0'..'9'] then Insert(S[i], Result, MaxInt);
end;
Von den letzen beiden Varianten ist Michaels zwar 'nen "Hauch" langsamer, aber dafür bissl verständlicher.

Schneller geht es dann nur noch (wenn man es denn unbedingt braucht), indem man
- bei langen Strings alles Gewünschte/Erlaubte via PChar in einen String mit maximal zu erwartender Länge kopiert und den String dann kürzt
- bei "kurzen" Strings alles Gewünschte/Erlaubte zählt, den neuen String mit passender Länge erstellt und dann die gewünschten Teile da reinkopiert.
jenachdem was schneller geht
- die zusätzliche String- und Speicheroperation
- alles zusätzlich nochmal durchzugehn und mitzuzählen

Codix32 21. Apr 2013 20:22

AW: Zahlen aus String extrahieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo himitsu,

nehmen wir an, daß ich aus einer Webseite Lotoozahlen kopiere und in ein Editfeld eingebe.
Dabei habe ich ein paar Zeichen mitkopiert.

Nun möchte ich gern die Lottozahlen (ein- und zweistellig) extrahieren und in ein IntegerArray schreiben...:oops:

Ich habe da was hingebogen, das auch funktioniert nicht ganz, denn bei der letzten zweistelligen Zahl wird nur die erste Ziffer angezeigt...
Gibt es da einen anderen Ansatz?

Ich füge es mal ein.
Delphi-Quellcode:
USES...
{Zahlen und Zeichen von der Zwischenablage ins Edit eingeben und bei Enter nur die Zahlen
 ausgeben. Es werden die Zahlen als Integerwerte in ein IntegerArray mit 6 Indexes gespeichert
 Die Zahlengröße ist auf 2 Stellen begrenzt.}


Type
  TLottoresult = array of Integer;


//----------------------------------------------
function TForm1.IsZahl(AChar:char):boolean;
begin
  result := AChar in ['0'..'9'];
end;
//----------------------------------------------

function TForm1.LZahlen(kopStr:string):TLottoresult;
var i,a:integer;
    t:string[2];
   flag:boolean;
begin
setLength(Result, 6); a := -1;
 for i:= 1 to length(kopStr) do
  begin
   if isZahl(kopstr[i])and (a < high(Result))then
    begin
     if (flag = false) {and (a < high(Result)) }then inc(a);
     t:=t+kopStr[i];
     result[a]:=strtoint(t);
     flag:=true;
    end else
    begin
      flag:=false; t:='';
    end;
  end;
Label2.Caption:= 'IntegerArrayIndexes: '+ inttostr(a);
Label3.caption:=' Es fehlen noch '+ inttostr((high(Result)- a))+ ' Zahlen';
end;

//----------------------------------------------



procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
 Lottoresult:TLottoresult;
 i:integer;
 str:string;
begin
{bei Enter das Array auslesen und die Zahlen mit Leerzeichen ausgeben}
 if Key = VK_Return then
   begin
    LottoResult := LZahlen(Edit1.text);
     for i := 0 to high(LottoResult) do
       str := str + ' ' + IntToStr(LottoResult[i]);
    Label1.Caption:='String mit Zahlen: '+str;
   end;
end;
Im Anhang ein Schnappschuss, das den Fehler zeigt

p80286 21. Apr 2013 21:43

AW: Zahlen aus String extrahieren
 
Delphi-Quellcode:
begin
  t:='';
  flag:=false;
  setLength(Result, 6); a := -1;
  for i:= 1 to length(kopStr) do
   begin
    if isZahl(kopstr[i])and (a <= high(Result))then
    begin
      if not(flag) {and (a < high(Result)) }then inc(a);
      t:=t+kopStr[i];
      result[a]:=strtoint(t);
      flag:=true;
     end else
     begin
       flag:=false;
       t:='';
     end;
   end;
Tip am Rande mit [F7]/[F8] eine Kleinigkeit.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Seite 1 von 2  1 2      

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