Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zahlen in einem String finden (https://www.delphipraxis.net/171731-zahlen-einem-string-finden.html)

ATS3788 22. Nov 2012 09:13

Zahlen in einem String finden
 
Hallo
Gibt es eine elegante "procedure"
um Zahlen in einen String zu finden

Delphi-Quellcode:
str := 'abc1def6q3uz3sdd8as2';
Mir ist schon klar eine Schleife und dann mit ORD
sehen ob es eine ASCII Zahl ist.

Die Frage war aber ELEGANTE

Danke meine Delphifreunde

MrSpock 22. Nov 2012 09:23

AW: Zahlen in einem String finden
 
Man könnte mit der Delphi-Referenz durchsuchenPos Funktion explizit nach den Ziffern '0' .. '9' suchen, aber das ist nicht wirklich eleganter.

Bummi 22. Nov 2012 09:24

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.

Sir Rufo 22. Nov 2012 09:34

AW: Zahlen in einem String finden
 
Zitat:

Zitat von ATS3788 (Beitrag 1192323)
Hallo
Gibt es eine elegante "procedure"
um Zahlen in einen String zu finden

Nein, gibt es nicht. In einem String befinden sich nur Ziffern aber keine Zahlen.
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:
100
Kann als Zahlenwert bedeuten: 4, 64, 100, 256, ... und ich habe jetzt nur mal so Standard-Zahlensysteme zugrunde gelegt.

himitsu 22. Nov 2012 10:16

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

nuclearping 22. Nov 2012 10:20

AW: Zahlen in einem String finden
 
Zitat:

Zitat von ATS3788 (Beitrag 1192323)
Hallo
Gibt es eine elegante "procedure"
um Zahlen in einen String zu finden

Du kannst dir eine RegEx-Lib für Delphi besorgen und dann mit "/[0-9]{1,}(?:[\,\. ]?[0-9])*/" (oder so ähnlich) alle Zahlen extrahieren.

himitsu 22. Nov 2012 10:52

AW: Zahlen in einem String finden
 
Zitat:

Zitat von nuclearping (Beitrag 1192333)
Du kannst dir eine RegEx-Lib für Delphi besorgen

Die ist (ich glaub seit XE) schon im Delphi mit dabei.

ATS3788 22. Nov 2012 16:23

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.

Sir Rufo 22. Nov 2012 16:38

AW: Zahlen in einem String finden
 
Zitat:

Zitat von ATS3788 (Beitrag 1192428)
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.

Wenn du mal ein konkretes Beispiel geben würdest (was geht rein, was soll rauskommen) dann könnten wir dir auch etwas konkretes zeigen. So ist das aber zu schwammig.

ATS3788 22. Nov 2012 16:44

AW: Zahlen in einem String finden
 
Delphi-Quellcode:
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;
Also habe das so gemacht, geht echt gut
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

nuclearping 22. Nov 2012 16:44

AW: Zahlen in einem String finden
 
Zitat:

Zitat von ATS3788 (Beitrag 1192428)
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.

Im Grunde brauchst du nichtmal Ord. Du brauchst nur 'ne Schleife:
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;

shmia 22. Nov 2012 17:07

AW: Zahlen in einem String finden
 
Also Elegant wäre ein Callback (Event) zu verwenden.
Delphi-Quellcode:
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;
Das Argument von
Delphi-Quellcode:
TNumberEvent
könnte auch ein Integer sein, aber dann besteht die Gefahr des Überlaufs.

himitsu 22. Nov 2012 17:10

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

DeddyH 22. Nov 2012 17:10

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;

BoolString 23. Nov 2012 00:23

AW: Zahlen in einem String finden
 
Vielleicht so etwas?

Extract nth number from string

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

Furtbichler 23. Nov 2012 07:01

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:
for c in s do
  if IsDigit(c) Then
    result.add(ord(c)-48);
Wäre jetzt das "ELEGANT"este, was mir einfällt.

Sir Rufo 23. Nov 2012 07:57

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
  • Das Ausgabearray genausoviele Einträge hat, wie der String Stellen hat, aber es sind nicht unbedingt alle Elemente befüllt
  • obwohl mir Zahlen in einem String suggeriert werden bekomme ich aber nur die einzelnen Ziffern aus dem string als Zahl geliefert
Code:
a35s4 => (3,5,4,0,0)
Irgendwie hätte ich jetzt das erwartet
Code:
a35s4 => (35,4)
Evtl. kann mir mal jemand (der TE) eine Kerze anzünden und mich erleuchten

DeddyH 23. Nov 2012 08:15

AW: Zahlen in einem String finden
 
Anhand seines Beispielcodes gehe ich bislang davon aus, dass er ein Array aus Ziffern befüllen möchte.

Sir Rufo 23. Nov 2012 08:17

AW: Zahlen in einem String finden
 
Zitat:

Zitat von DeddyH (Beitrag 1192538)
Anhand seines Beispielcodes gehe ich bislang davon aus, dass er ein Array aus Ziffern befüllen möchte.

Das passt aber nicht zur Fragestellung (Zahlen in einem String finden) ;)
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

p80286 23. Nov 2012 10:16

AW: Zahlen in einem String finden
 
ich denke er möchte so etwas machen
Delphi-Quellcode:
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]);
Gruß
K-H

himitsu 23. Nov 2012 10:31

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:
array[0..255]
aka
Delphi-Quellcode:
array[Byte]
, sondern
Delphi-Quellcode:
array[Char]
, also ein Array mit Feldern für jeden Char-Wert.
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]);

p80286 23. Nov 2012 10:39

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:
array[char] of byte
? Mein alter TI konnte damit nicht mehr umgehen.

Gruß
K-H

himitsu 23. Nov 2012 11:01

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)

nuclearping 23. Nov 2012 11:22

AW: Zahlen in einem String finden
 
Die ganze Diskussion erinnert mich wieder an: http://www.zid.tuwien.ac.at/fileadmi...22/cartoon.jpg :mrgreen:

Sir Rufo 23. Nov 2012 11:30

AW: Zahlen in einem String finden
 
Zitat:

Zitat von nuclearping (Beitrag 1192572)
Die ganze Diskussion erinnert mich wieder an: http://www.zid.tuwien.ac.at/fileadmi...22/cartoon.jpg :mrgreen:

:thumb:

evtl. kommen wir ja noch zum konkreten Teil :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 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