Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Zahlen aus String parsen (https://www.delphipraxis.net/168155-zahlen-aus-string-parsen.html)

lbccaleb 8. Mai 2012 15:21

AW: Zahlen aus String parsen
 
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 :)

Popov 8. Mai 2012 19:45

AW: Zahlen aus String parsen
 
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.

lbccaleb 9. Mai 2012 09:44

AW: Zahlen aus String parsen
 
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;

Popov 9. Mai 2012 10:47

AW: Zahlen aus String parsen
 
Ich verstehe nicht, und was ist mit den Tausender Trennzeichen? Spielen die jetzt doch keine Rolle?

lbccaleb 9. Mai 2012 11:02

AW: Zahlen aus String parsen
 
Doch aber ich habs jetzt nen bissel anders gelöst :)

Deine Funktion findet sich auch drin wieder.
Da sich an meinem Text das Layout nicht ändert sondern eigentlich nur die Zahlen, bearbeite ich die Zeilen jetzt getrennt voneinander. Das funktioniert super...

himitsu 9. Mai 2012 12:37

AW: Zahlen aus String parsen
 
Zitat:

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.

Edit:
Wo du's erwähntest, isses mir och aufgefallen ... böse 1 :shock:
( man könnte mal probieren, ob MaxInt auch ginge, also anstatt dieses Length(...)+1 )

In Verbindung mit FastMM, welches seit 'ner Weile im Delphi drin ist, würde das Insert eine Inpace-Verarbeitung der Strings unterstüzen, was beim Speichermanagement 'ne Menge einsparen täte.

Es sei denn Emba hat es inzwischen geschafft bei
Delphi-Quellcode:
X := X + Y;
zu erkennen, daß man den String X direkt verändern kann, anstatt einen neuen String zu erstellen und diesen anschleißend zuzuweisen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr.
Seite 2 von 2     12   

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