Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Alle nicht numerischen Zeichen aus String entfernen (https://www.delphipraxis.net/99381-alle-nicht-numerischen-zeichen-aus-string-entfernen.html)

trashcandesign 11. Sep 2007 13:31


Alle nicht numerischen Zeichen aus String entfernen
 
Moin,

ich habe ein Betragsfeld nach dem Format "1.234,56" und möchte nun alle nicht numerischen Zeichen aus diesem String entfernen.
Da verschiedene Länder verschiedene Formatierungen haben, zb. Schweiz "1'234.56", wollte ich das jetzt nicht mit mehreren StringReplace durchgehen.

Gibt es da eine einfache Möglichkeit sämtliche nicht numerischen Zeichen zu entfernen?

shmia 11. Sep 2007 13:36

Re: Alle nicht numerischen Zeichen aus String entfernen
 
Kopiert aus der JCL, Unit JclStrings:
Delphi-Quellcode:
function StrKeepChars(const S: string; const Chars: TSysCharSet): string;
{$IFDEF CLR}
var
  I: Integer;
  sb: StringBuilder;
begin
  sb := StringBuilder.Create(Length(S));
  for I := 0 to S.Length - 1 do
    if AnsiChar(S[I]) in Chars then
      sb.Append(S[I]);
  Result := sb.ToString();
end;
{$ELSE}
var
  Source, Dest: PChar;
  Len, Index: Integer;
begin
  Len := Length(S);
  SetLength(Result, Len);
  UniqueString(Result);
  Source := PChar(S);
  Dest := PChar(Result);
  for Index := 0 to Len-1 do
  begin
    if Source^ in Chars then
    begin
      Dest^ := Source^;
      Inc(Dest,SizeOf(Char));
    end;
    Inc(Source,SizeOf(Char));
  end;
  SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(Char));
end;

  b := StrStrKeepChars(a, ['0'..'9', '.', ',']);

Klaus01 11. Sep 2007 13:38

Re: Alle nicht numerischen Zeichen aus String entfernen
 
Hallo,

ich denke das ist recht gut mit Regulären Ausdrücken zu machen.
Für Delphi gibt es da eine Komponente.
Ein Tool um Deine Ausdrücke zu Testen gibt es hier.

Grüße
Klaus

Matze 11. Sep 2007 13:42

Re: Alle nicht numerischen Zeichen aus String entfernen
 
Hi,

wie wäre es damit (nur schnell runtergetippt):

Delphi-Quellcode:
function GetNumerics(s: string): string;
var
  i: Integer;
  tmp_result: string;
begin
  tmp_result := '';

  for i := 1 to Length(s) do
  begin
    if s[i] in ['0'..'9', '.', ','] then
      tmp_result := tmp_result + s[i];
  end;

  result := tmp_result;
end;

trashcandesign 11. Sep 2007 13:52

Re: Alle nicht numerischen Zeichen aus String entfernen
 
Danke für eure Antworten,

hab jetzt nach Matzes Lösungsweg gemacht.
Hätt ich aber auch selbst drauf kommen können :wall:

SirThornberry 11. Sep 2007 13:54

Re: Alle nicht numerischen Zeichen aus String entfernen
 
@matze: Die Variante würde ich eher nicht nehmen da sich die Länge vom String ständig ändert was ein umerhkopieen des Speichers zu Folge hat. Bei einigen Memorymanagern (zum Beispiel dem von Delphi7) wird dadurch der Speicher arg fragmentiert und irgendwann kommt die Meldung das kein Speicher mehr zur Verfügung steht weil nicht genügend zusammenhängender Speicher da ist.

Folgende Variante hätte ich noch:
Delphi-Quellcode:
function RemoveNonNumeric(AStr: String): String;
var
  lCount,
  lPos   : Integer;
begin
  lPos := 1;
  for lCount := 1 to Length(AStr) do
  begin
    if (AStr[lCount] in ['0'..'9', '.', ',']) then
    begin
      AStr[lPos] := AStr[lCount];
      inc(lPos);
    end;
  end;
  result := copy(AStr, 1, lPos - 1);
end;

marabu 11. Sep 2007 19:44

Re: Alle nicht numerischen Zeichen aus String entfernen
 
Hallo,

falls es nur darum geht aus einem numerischen DisplayString einen EditString zu machen, dann reduziert sich das Problem ja auf das Entfernen des Kolonnentrennzeichen (Tausenderpunkt):

Delphi-Quellcode:
function Without(const s: string; charSet: TSysCharSet): string;
var
  i, iDel: Integer;
begin
  Result := s;
  iDel := 0;
  for i := 1 to Length(s) do
    if not (s[i] in charSet)
      then Result[i - iDel] := s[i]
      else Inc(iDel);
  SetLength(Result, Length(s) - iDel);
end;

// Without('1.234.567,89', [ThousandSeparator])
Nach Entfernung der Lesehilfe lässt sich das Ergebnis mittels StrToFloat() wieder für Berechnungen verwenden, insofern ist der Verbleib des Dezimaltrenners nicht ganz ungeschickt.

Grüße vom marabu


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