AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Format Extended mit Nullen

Ein Thema von Codehunter · begonnen am 9. Aug 2023 · letzter Beitrag vom 9. Aug 2023
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Format Extended mit Nullen

  Alt 9. Aug 2023, 10:01
Delphi-Version: 10.4 Sydney
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#2

AW: Format Extended mit Nullen

  Alt 9. Aug 2023, 10:21
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: FormatFloat('0,000,000.000', VALUE, TFormatSettings.Create);
Ich würde auch empfehlen, das TFormatSettings.Create nicht bei jedem Aufruf zu machen, da das jedes mal einen Haufen API-Aufrufe auslöst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Format Extended mit Nullen

  Alt 9. Aug 2023, 10:46
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 ^^

Alternativ kannst du das gewünschte Ergebnis aber mit FormatFloat erreichen: 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.

Ich würde auch empfehlen, das 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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Format Extended mit Nullen

  Alt 9. Aug 2023, 11:10
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#5

AW: Format Extended mit Nullen

  Alt 9. Aug 2023, 11:29
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe ( 9. Aug 2023 um 11:42 Uhr) Grund: L > 1 statt 0
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Format Extended mit Nullen

  Alt 9. Aug 2023, 11:51
Geht zumindest etwas schlanker.
Super. Mir war noch gar nicht bewusst dass es für Strings jetzt auch "Konstruktoren" gibt

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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 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