Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Format Extended mit Nullen (https://www.delphipraxis.net/213506-format-extended-mit-nullen.html)

Codehunter 9. Aug 2023 10:01

Delphi-Version: 10.4 Sydney

Format Extended mit Nullen
 
Hallo!

Ich komme grad mit dem Format von Fließkommawerten nicht so recht weiter:
Delphi-Quellcode:
const
  VALUE: Extended = 12345.67;
begin
  ShowMessage(Format('%07.3f', [VALUE]), TFormatSettings.Create);
end;
Erwarten würde ich hier eine Ausgabe von "0.012.345,670" beim deutschen Locale. Heraus kommt aber "12345,670". Wie bekomme ich das hin dass die gewünschte Ausgabe rauskommt?

Grüße
Cody

Uwe Raabe 9. Aug 2023 10:21

AW: Format Extended mit Nullen
 
Die Tausendertrenner bekommst du mit n statt f, aber die führenden Nullen setzt Format nur bei ganzen Zahlen ein (d).

Alternativ kannst du das gewünschte Ergebnis aber mit FormatFloat erreichen:
Delphi-Quellcode:
FormatFloat('0,000,000.000', VALUE, TFormatSettings.Create);

Ich würde auch empfehlen, das
Delphi-Quellcode:
TFormatSettings.Create
nicht bei jedem Aufruf zu machen, da das jedes mal einen Haufen API-Aufrufe auslöst.

Codehunter 9. Aug 2023 10:46

AW: Format Extended mit Nullen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1525435)
Die Tausendertrenner bekommst du mit n statt f, aber die führenden Nullen setzt Format nur bei ganzen Zahlen ein (d).[/DELPHI]

Kein Wunder dass ich da nicht weiter gekommen bin ^^

Zitat:

Zitat von Uwe Raabe (Beitrag 1525435)
Alternativ kannst du das gewünschte Ergebnis aber mit FormatFloat erreichen:
Delphi-Quellcode:
FormatFloat('0,000,000.000', VALUE, TFormatSettings.Create);

Uff, da muss ich noch ein bisschen drumrum bauen, denn die Anzahl der signifikanten Stellen kann ich nicht hartkodieren. In der Hinsicht wäre die Syntax von Format() praktischer gewesen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1525435)
Ich würde auch empfehlen, das
Delphi-Quellcode:
TFormatSettings.Create
nicht bei jedem Aufruf zu machen, da das jedes mal einen Haufen API-Aufrufe auslöst.

Das habe ich nur zur Verdeutlichung des Problems so abgekürzt. Normalerweise mache ich das einmal im initialization der Unit bzw. Klassenkonstruktor.

Codehunter 9. Aug 2023 11:10

AW: Format Extended mit Nullen
 
So, das wäre jetzt meine Lösung. Evtl. ginge das ja noch effizienter, aber erstmal tuts was es soll:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function FormatFloat2(const AValue: Extended; const ADigits, ADecimals: Byte;
    const AFormatSettings: TFormatSettings): string;
  var
    I, J: Byte;
    Fmt, Fmt2: string;
  begin
    Fmt := StringOfChar('0', ADigits);
    Fmt2 := '';
    J := 1;
    for I := Fmt.Length downto 1 do begin
      Fmt2 := Fmt[I] + Fmt2;
      if J = 3 then begin
        Fmt2 := ',' + Fmt2;
        J := 1;
        Continue;
      end;
      Inc(J);
    end;
    Fmt2 := Fmt2 + '.' + StringOfChar('0', ADecimals);
    Result := FormatFloat(Fmt2, AValue, AFormatSettings);
  end;

begin
  ShowMessage(FormatFloat2(12345.67, 7, 3, TFormatSettings.Create));
end;

Uwe Raabe 9. Aug 2023 11:29

AW: Format Extended mit Nullen
 
Geht zumindest etwas schlanker.
Delphi-Quellcode:
function FormatFloat2(const AValue: Extended; const ADigits, ADecimals: Byte; const AFormatSettings: TFormatSettings): string;
begin
  var Fmt := string.Create('0', ADigits);
  var L := Fmt.Length - 3;
  while L > 1 do begin
    Insert(',', Fmt, L);
    Dec(L, 3);
  end;
  Fmt := Fmt + '.' + string.Create('0', ADecimals);
  Result := FormatFloat(Fmt, AValue, AFormatSettings);
end;
Edit: Das muss natürlich L > 1 heißen.

Codehunter 9. Aug 2023 11:51

AW: Format Extended mit Nullen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1525440)
Geht zumindest etwas schlanker.

Super. Mir war noch gar nicht bewusst dass es für Strings jetzt auch "Konstruktoren" gibt :)

Zitat:

Zitat von Uwe Raabe (Beitrag 1525440)
Edit: Das muss natürlich L > 1 heißen.

Genau darüber bin ich bei meiner ursprünglichen for-Schleife auch gestolpert. Das ist schon irgendwie eine Pest mit der 0-basierten Zählung bei den Stringhelpern und den 1-basierten klassischen Funktionen. Wenn man das mixt muss man aufpassen wie die Hölle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.

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