AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zahlen aus String parsen

Ein Thema von lbccaleb · begonnen am 8. Mai 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 11:09
Hier eine Funktion die eine Zahl ermittelt. Mit leichter Anpassung kann man auch alle Zahlen eines Strings ermitteln, bzw. um Tausender Zeichen erweitern.

Delphi-Quellcode:
    //Prüft auf Zahl im Strings, wie "Neuer Text (2)". Bei vorhanden sein
    //gibt StrB den Teil vor der Zahl, StrN die Zahl, StrE den Rest.
    function IsNumIn(Str: String; var StrB, StrNum, StrE: String): Boolean;
    var
      k: Integer;
    begin
      StrB := ''; // Text vor Zahl
      StrNum := ''; // Zahl
      StrE := ''; // Text nach Zahl

      k := 1;
      while k <= Length(Str) do
        if Pos(Str[k], '0123456789') = 0 then
        begin
          StrB := StrB + Str[k];
          Inc(k);
        end else Break;

      while k <= Length(Str) do
        if Pos(Str[k], '0123456789') > 0 then
        begin
          StrNum := StrNum + Str[k];
          Inc(k);
        end else Break;

      StrE := Copy(Str, k, Length(Str));
      Result := StrNum <> '';
    end;
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 12:32
hi,

[EDIT]Hatte das mit dem NON-VCL überlesen... Hier einmal überarbeitet [/EDIT]


Delphi-Quellcode:
unit Unit2;

interface

type
  TStringArray = array of string;

procedure GetNums(AString: string; var AStrArray: TStringArray);

implementation

procedure GetNums(AString: string; var AStrArray: TStringArray);
var
  ndx: Integer;
  sHelp: string;
begin
  sHelp := '';
  SetLength(AStrArray, 0);
  for ndx := 1 to Length(AString) do
  begin
    if (AString[ndx] in ['0'..'9']) then
    begin
      sHelp := sHelp + AString[ndx];
    end
    else if (sHelp <> '') then
    begin
      SetLength(AStrArray, Length(AStrArray)+1);
      AStrArray[High(AStrArray)] := sHelp;
      sHelp := '';
    end;
  end;

  // Edit Ihr habt ja recht.
  if (sHelp <> '') then
  begin
    SetLength(AStrArray, Length(AStrArray)+1);
    AStrArray[High(AStrArray)] := sHelp;
    sHelp := '';
  end;
end;

end.
Ansgar

Geändert von angos ( 8. Mai 2012 um 14:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 13:18
Was sind Zahlen?
z.B. inklusive Vorzeichen, Komma, Tausenderseparator und womöglich noch mit Exponent.

TStringArray ... falls es im D7 das schon gibt, dann besser Delphi-Referenz durchsuchenTStringDynArray verwenden, für eine bessere Typkompatibilität.

@angos: Wenn AString mit einer Zahl endet, dann wird diese vergessen.
Also nach der Schleife dieses besser nochmals beachten.
Delphi-Quellcode:
  if sHelp <> 'then
  begin
    SetLength(AStrArray, Length(AStrArray)+1);
    AStrArray[High(AStrArray)] := sHelp;
  end;
Mit Vorzeichen:
Delphi-Quellcode:
function GetNums(const Text: string): TIntegerDynArray;
var
  L, i: Integer;
begin
  SetLength(Result, 1);
  Result[0] := '';
  L := 0;
  for i := 1 to Length(Text) do
    if (Text[i] in ['0'..'9']) or ((Result[L] = '') and (Text[i] in ['+', '-'])
        and (i < Length(Text)) and (Text[i + 1] in ['0'..'9'])) then
      Insert(Text[i], Result[L], Length(Result[L]) + 1) // Result[L] := Result[L] + Text[i]
    else if Result[L] <> 'then begin
      Inc(L);
      SetLength(Result, L + 1);
    end;
  if Result[L] = 'then
    SetLength(Result, L);
end;

// ab D2006/TDE
function GetNums(const Text: string): TIntegerDynArray;
var
  C, V: Char;
  L: Integer;
begin
  SetLength(Result, 1);
  Result[0] := '';
  L := 0;
  V := #0;
  for C in Text do begin
    if C in ['0'..'9'] then begin
      if V in ['+', '-'] then
        Result[L] := V;
      Insert(C, Result[L], Length(Result[L]) + 1);
    end else if Result[L] <> 'then begin
      Inc(L);
      SetLength(Result, L + 1);
    end;
    V := C;
  end;
  if Result[L] = 'then
    SetLength(Result, L);
end;
ohne Vorzeichen
Delphi-Quellcode:
function GetNums(const Text: string): TIntegerDynArray;
var
  L, i: Integer;
begin
  SetLength(Result, 1);
  Result[0] := '';
  L := 0;
  for i := 1 to Length(Text) do
    if Text[i] in ['0'..'9'] then
      Insert(Text[i], Result[L], Length(Result[L]) + 1)
    else if Result[L] <> 'then begin
      Inc(L);
      SetLength(Result, L + 1);
    end;
  if Result[L] = 'then
    SetLength(Result, L);
end;

// ab D2006/TDE
function GetNums(const Text: string): TIntegerDynArray;
var
  C: Char;
  L: Integer;
begin
  SetLength(Result, 1);
  Result[0] := '';
  L := 0;
  for C in Text do
    if C in ['0'..'9'] then
      Insert(C, Result[L], Length(Result[L]) + 1)
    else if Result[L] <> 'then begin
      Inc(L);
      SetLength(Result, L + 1);
    end;
  if Result[L] = 'then
    SetLength(Result, L);
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Mai 2012 um 12:35 Uhr)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 13:43
Was sind Zahlen?
z.B. inklusive Vorzeichen, Komma, Tausenderseparator und womöglich noch mit Exponent.
Eben, genau.
Und da frage ich mich doch, wozu denn alle diese derartigen Codes eigentlich gut sein sollen, wenn mit denen bei einem String wie z.B. 'xxxx2.098yyyy' herauskommt, dass solch ein String angeblich die zwei Zahlen 2 und 098 enthalte, wobei doch tatsächlich darin nur die eine einzige Zahl 2.098 enthalten ist....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 14:18
hi,

[EDIT]Hatte das mit dem NON-VCL überlesen... Hier einmal überarbeitet [/EDIT]


Delphi-Quellcode:
unit Unit2;

interface

type
  TStringArray = array of string;

procedure GetNums(AString: string; var AStrArray: TStringArray);

implementation

procedure GetNums(AString: string; var AStrArray: TStringArray);
var
  ndx: Integer;
  sHelp: string;
begin
  sHelp := '';
  SetLength(AStrArray, 0);
  for ndx := 1 to Length(AString) do
  begin
    if (AString[ndx] in ['0'..'9']) then
    begin
      sHelp := sHelp + AString[ndx];
    end
    else if (sHelp <> '') then
    begin
      SetLength(AStrArray, Length(AStrArray)+1);
      AStrArray[High(AStrArray)] := sHelp;
      sHelp := '';
    end;
  end;
end;

end.
Das hier ist übrigens fehlerhaft, denn, was passiert bei solch einem String "abc1"?
Erst bei i = length(string) (letzter Durchlauf) wird sHelp gesetzt, das Speichern der Zahl geschieht aber nur, wenn es sich <beim nächsten Zeichen> nicht um eine Zahl handelt (hier gibt es kein nächstes Zeichen (letzter Schleifendurchlauf))
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 14:29
Vielleicht sollten wir keine weiteren Codes liefern bis der Threadersteller ganz genau mitteilt was er unter Zahl versteht, denn je komplexer die Zahl, desto komplexer der Code. Einfacher Integer ist kein Problem, aber wenn schon Tausender Zeichen beachtet werden müssen, dann gehe ich von Real Zahlen aus, dann vielleicht auch -1.23e45. Bevor also der Threadersteller nicht genauer wird, ist es Rätselraten.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 15:21
Es handelt sich in meinem Fall nur um Zahlen im positiven Bereich.

Allerdings haben die Zahlen keine genaue Art, wie schon geschrieben mit 1000ender Trennzeichen oder aber auch ohne.
Und dann kommt noch dazu, das in dem Text Zahlen in Form von Zeiten und Datumsangaben hervorkommen die im üblichen Format sind sprich 08.05.2012 oder halt 09:30:45.

Ich mach es im mom so, das ich jede Zeile für Zeile durch gehe. Mal sehen bis her komm ich da langsam ran
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: Zahlen aus String parsen

  Alt 8. Mai 2012, 19:45
Hier habe ich meine obere Funktion um das Tausenderzeichen erweitert. Zusätzlich habe ich noch auf die Schnelle eine Funktion zur Prüfung auf Tausenderzeichen geschrieben und eingefügt. Wie du siehst, es kann einen unendlich langen Text durchsuchen und auf Fehler prüfen.

Delphi-Quellcode:
//Prüft auf Zahl im Strings, wie "Neuer Text (2)". Bei vorhanden sein
//gibt StrB den Teil vor der Zahl, StrN die Zahl, StrE den Rest.
function IsNumIn(Str: String; var StrB, StrNum, StrE: String): Boolean;
var
  k: Integer;
begin
  StrB := ''; // Text vor Zahl
  StrNum := ''; // Zahl
  StrE := ''; // Text nach Zahl

  k := 1;
  while k <= Length(Str) do
    if Pos(Str[k], '0123456789') = 0 then
    begin
      StrB := StrB + Str[k];
      Inc(k);
    end else Break;

  while k <= Length(Str) do
    if Pos(Str[k], '0123456789.') > 0 then //Anpassung durch '.' Erweiterung
    begin
      StrNum := StrNum + Str[k];
      Inc(k);
    end else Break;

  StrE := Copy(Str, k, Length(Str));
  Result := StrNum <> '';
end;

//Prüft den Zahl-String auf korrekte Schreibweise des Tausender Trenners
function IsTSNumOk(Str: String): Boolean;
begin
  Result := True;

  while Pos('.', Str) > 0 do
    if LastDelimiter('.', Str) = (Length(Str) - 3) then
      Delete(Str, Length(Str) - 3, MaxInt)
    else
    begin
      Result := False;
      Exit;
    end;
end;

//Ein Beispiel
procedure TForm1.Button1Click(Sender: TObject);
var
  Str, StrB, StrNum, StrE: String;
begin
  Str := 'Ich verdiente mal 10000DM, dann 27.990 DM, dann mal 17.000 Euro, ' +
    'aber auch mal 1.273.000Lira, jedoch nie 125.00 Euro';

  while LastDelimiter('0123456789', Str) > 0 do
  begin
    if IsNumIn(Str, StrB, StrNum, StrE) then
    begin
      if IsTSNumOk(StrNum) then
        ShowMessage('Zahl ist ok, ' + StrNum)
      else
        ShowMessage('Fehler, ' + StrNum);

      Str := StrE;
    end;
  end;
end;
Bei der letzten Zahl kommt ein Fehler wegen falscher Schreibweise des Tausender Trenners.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Zahlen aus String parsen

  Alt 9. Mai 2012, 09:44
Ich habe gerade mal die Versionen von himitsu durchprobiert.
Die funktionieren echt gut, mit nur einer Ausnahme, er schneidet die erste Zahl ab, und packt Sie ans Ende. Also aus zb. 1234567890 macht er 0123456789.

Und das sowohl bei der Version ohne als auch mit Vorzeichen.

Edit:

+1 vergessen, so funktioniert es wie es soll Danke :

Delphi-Quellcode:
function GetNums(const Text: string): TIntegerDynArray;
var
  L, i: Integer;
begin
  SetLength(Result, 1);
  Result[0] := '';
  L := 0;
  for i := 1 to Length(Text) do
    if (Text[i] in ['0'..'9']) or ((Result[L] = '') and (Text[i] in ['+', '-'])
        and (i < Length(Text)) and (Text[i + 1] in ['0'..'9'])) then
      Insert(Text[i], Result[L], Length(Result[L])+1) // hier die +1 einfügen
    else if Result[L] <> 'then begin
      Inc(L);
      SetLength(Result, L + 1);
    end;
  if Result[L] = 'then
    SetLength(Result, L);
end;
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb ( 9. Mai 2012 um 10:16 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

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 19:38 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