delete

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

delete

Beitrag von Adenos »

ich versuche, das Komma aus einer Preisangabe zu löschen, wobei ich aber nicht genau weiß, an welcher Stelle sich das Komma befindet. Also der Preis könnte 5,000.00 $ sein oder aber auch 50,000.00 $. Wenn ich schreibe [ code ]
delete(Preis,,,,)
[ /code ]
gibt es eine Fehlermeldung, weil Lazarus erwartet, dass man die Stelle angibt, an der das Komma gelöscht werden soll.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: delete

Beitrag von fliegermichl »

Code: Alles auswählen

var i : integer;
begin
 i := Pos(',', s);
 if (i > 0) then
 system.delete(s, i, 1);
end;

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: delete

Beitrag von Adenos »

danke, da hätte ich eigentlich auch selber drauf kommen können.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: delete

Beitrag von six1 »

Wenn der Preis aber in deutscher Art angegeben ist, dann kommt es einem *100 gleich.
Also im Fall, dass das Komma an der dritten, rechten Position ist, wäre das besser, dies nicht auszuführen.
Gruß, Michael

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: delete

Beitrag von theo »

Es könnten ja auch 1,000,000.00 $ sein.
So wären dann gleich alle weg:

Code: Alles auswählen

Str:= StringReplace(Str, ',', '', [rfReplaceAll]);
https://wiki.freepascal.org/StringReplace/de

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: delete

Beitrag von Adenos »

ja, das ist ja noch viel besser. Mit den Preisen von Kryptowährungen umzugehen, ist gar nicht so einfach. Da unterscheiden sich die Angaben von 100 Millionen bis zu einem Millionstel des Reziprokwertes.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: delete

Beitrag von Warf »

Da das komma ja immer alle 3 stellen (von hinten) kommt, kann man das ganze auch mit ein bisschen Mathe machen:

Code: Alles auswählen

function RemoveCommas(const Price: String; const SuffixLength: SizeInt): String;
var
  CommaCount, i, ToFull: SizeInt;
begin
  CommaCount := (Price.Length - (SuffixLength + 1)) div 4;
  ToFull := 2 - (Price.Length - (SuffixLength + 1)) mod 4;
  SetLength(Result, Price.Length - CommaCount);
  Move(Price[Price.Length - (SuffixLength - 1)], Result[Result.Length - (SuffixLength - 1)], SuffixLength);
  for i:=Price.Length - SuffixLength downto 1 do
  begin
    Result[i - ((i + ToFull) div 4)] := Price[i];
  end;
end;
Wobei SuffixLength die Länge des nicht Ganzzahlteils + alles dahinter ist (also '.00 $' ist es 5 zeichen lang)

PS: Dollar preise werden übringens nicht XXX$ geschrieben wie mit Euro (e.g. 500€) sondern in prefix notation also wäre das dann $500 nicht 500$
Die angepasste funktion dafür ist:

Code: Alles auswählen

function RemoveCommas(const Price: String; const PrefixLength, SuffixLength: SizeInt): String;
var
  CommaCount, i, ToFull: SizeInt;
begin
  CommaCount := (Price.Length - (PrefixLength + SuffixLength + 1)) div 4;
  ToFull := 2 - (Price.Length - (PrefixLength + SuffixLength + 1)) mod 4;
  SetLength(Result, Price.Length - CommaCount);
  Move(Price[Price.Length - (SuffixLength - 1)], Result[Result.Length - (SuffixLength - 1)], SuffixLength);
  Move(Price[1], Result[1], PrefixLength);
  for i:=Price.Length - SuffixLength downto 1 + PrefixLength do
  begin
    Result[i - (((i - PrefixLength) + ToFull) div 4)] := Price[i];
  end;
end;
Beispiel:

Code: Alles auswählen

begin                     
  WriteLn(RemoveCommas('500.00 $', 0, 5));
  WriteLn(RemoveCommas('5,000.00 $', 0, 5));
  WriteLn(RemoveCommas('50,000.00 $', 0, 5));
  WriteLn(RemoveCommas('500,000.00 $', 0, 5));
  WriteLn(RemoveCommas('5,000,000.00 $', 0, 5));
  WriteLn(RemoveCommas('50,000,000.00 $', 0, 5));
  WriteLn(RemoveCommas('500,000,000.00 $', 0, 5));
  WriteLn(RemoveCommas('$500.00', 1, 3));
  WriteLn(RemoveCommas('$5,000.00', 1, 3));
  WriteLn(RemoveCommas('$50,000.00', 1, 3));
  WriteLn(RemoveCommas('$500,000.00', 1, 3));
  WriteLn(RemoveCommas('$5,000,000.00', 1, 3));
  WriteLn(RemoveCommas('$50,000,000.00', 1, 3));
  WriteLn(RemoveCommas('$500,000,000.00', 1, 3));
  ReadLn;
end.  

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: delete

Beitrag von Winni »

Hi!

Ein Tippfehler von der gestressten Datantypistin und das Kartenhaus fällt zusammen.

Winni

Antworten