Integer Aufbereitung 24578912 -> 24.578.912

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von Lorca »

Hallo zusammen,

gerne möchte ich lange Integerwerte mit Tausender Punkte (.) aufbereiten.
Also wie im Betreff angegeben.

Datt funzt aber nicht. Was mache ich falsch?
Oder ist die einzige Möglichkeit etwas eigenes zu stricken?

Viele Grüße
Lorca

procedure XXX;
VAR lv_s : String; ls_fmt : TFormatSettings; lv_Value : LongInt;
BEGIN
lv_Value := 24578912;
ls_fmt.ThousandSeparator := '.';
lv_s := Format( '%8d', [ lv_Value ], ls_fmt );
END;

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von wp_xyz »

Tausender-Trenner kommen nur mit Format-Maske %n, und - das mache ich immer falsch - die zugehörige Zahl muss ein Float sein, kein Integer. Also: so sollte es funktionieren:

Code: Alles auswählen

procedure XXX;
var 
  lv_s : String; 
  ls_fmt : TFormatSettings; 
  lv_Value : LongInt;
begin
  lv_Value := 24578912;
  ls_fmt := FormatSettings;
  ls_fmt.ThousandSeparator := '.';
  lv_s := Format( '%8.0n', [ 1.0*lv_Value ], ls_fmt );   // ich würde noch die 8 weglassen: %.0n
end;

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von af0815 »

Dies Zahl mit den 1000er Trennern kann aufgrund der Kompatibilität mit Delphi nicht mehr zurück gewandelt werden. Das ist kein Bug in fpc/Lazarus sondern per Design (Ich glaube mich daran zu Erinnern das das ein Bug in Delphi war). Nur so als Anmerkung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von Lorca »

Hi zusammen :),

ganz herzlichen Dank :)

Gruß
Lorca

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von Jorg3000 »

Hi!
Wieso gibt es für Integer eigentlich keine Standardfunktion für Tausenderpunkte? Den Umweg über Fließkomma finde ich suboptimal.
Folgender Code ist nicht umständlicher und schneller ...

Code: Alles auswählen

var x, i: Integer;
    s: String;

  x:=24578912;
  s:=IntToStr(x);
  i:=Length(s)-2;
  While i>1 do  begin Insert('.',s,i); dec(i,3); end;  
 

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Integer Aufbereitung 24578912 -> 24.578.912

Beitrag von Jorg3000 »

Ach Mensch, ich hatte negative Zahlen nicht berücksichtigt.

Code: Alles auswählen

procedure insertThousandsSeparators(var s: String; aSeparator: Char);  // nicht für Strings mit Nachkommastellen
var i, minI: SizeInt;
begin
  i:=Length(s);
  if i<4 then Exit;
  minI:=1;
  if s[1]='-' then minI:=2;
  dec(i,2);
  while i>minI do  begin Insert(aSeparator,s,i); dec(i,3); end;
end;

Antworten