Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Max. 3 Nachkommastellen (https://www.delphipraxis.net/135640-max-3-nachkommastellen.html)

Carsten1234 15. Jun 2009 08:50


Max. 3 Nachkommastellen
 
Hallo zusammen,

bzgl. Runden mit 3, 4, 5 Nachkommastellen mit Hilfe von Format oder FormatFloatToStrF gibt es ja einiges zu lesen, doch zu meinem Problemchen im Betreff habe ich noch keine gute Lösung gefunden.
Ich möchte nämlich, dass ein Float max. 3 Nachkommastellen hat, optional aber auch weniger, wenn der Anwender weniger Nachkommastellen eingibt.
Bsp.:
1500 => 1500
100,01 => 100,01
0,3972 => 0,397
0,8767 => 0,877

Wie kann ich das denn möglichst einfach erreichen?

Dank vorab und Gruß, Carsten

mkinzler 15. Jun 2009 08:54

Re: Max. 3 Nachkommastellen
 
So einfach geht das nicht

BAMatze 15. Jun 2009 09:07

Re: Max. 3 Nachkommastellen
 
Also mir fällt da spontan folgendes Vorgehen ein:

1. Bediener gibt Nachkommastellen ein (z.B. n = 3)
2. du berechnest dann: 10^n (in diesem Fall 1000)
3. du multiplizierst es mit deiner eingegebenen Zahl für dein 3.Beispiel sähe das wie folgt aus: 0,3972 * 1000 = 397,2
4. du rundest(round) es => 397
5. du dividierst es wieder durch 1000 und gibst es mit format aus => 0,397

ist zwar erstmal etwas umständlich sollte aber machen, was du möchtest in relativ wenigen Schritten. Gibt aber sicherlich noch andere mögliche Wege.

MfG
BAMatze

Dust Signs 15. Jun 2009 09:09

Re: Max. 3 Nachkommastellen
 
Formatier doch einfach die Zahl mit drei Nachkommastellen und entferne bei Bedarf die Nullen am Ende :stupid:

Dust Signs

Hawkeye219 15. Jun 2009 09:24

Re: Max. 3 Nachkommastellen
 
Hallo,

vielleicht geht es so:

Delphi-Quellcode:
var
  s : string;
  x : Double;
begin
  s := Format('%g', [{Math.}RoundTo(x, -3)]);
end;
Gruß Hawkeye

himitsu 15. Jun 2009 09:25

Re: Max. 3 Nachkommastellen
 
Zitat:

Zitat von Dust Signs
Formatier doch einfach die Zahl mit drei Nachkommastellen und entferne bei Bedarf die Nullen am Ende :stupid:

Dust Signs

und nicht das Komma vergessen zu entfernen, falls danach alle Nullen weg sind :angel:

Delphi-Quellcode:
Function MyFormat(f: Extended; Precession: Integer): String;
  Begin
    Result := Format('%.*n', [Precession, f])
    While Result[Length(Result)] = '0' do Delete(Result, Length(Result), 1);
    If Result[Length(Result)] = DecimalSeparator Then Delete(Result, Length(Result), 1);
  End;
[edit]

Delphi-Quellcode:
Function MyFormat(f: Extended; Precession: Byte; Width: Byte = 0): String;
  Begin
    Result := Format('%*.*n', [Width, Precession, f]);
    If Precession > 0 Then Begin
      While Result[Length(Result)] = '0' do Delete(Result, Length(Result), 1);
      If Result[Length(Result)] = DecimalSeparator Then Delete(Result, Length(Result), 1);
    End;
  End;

Klaus01 15. Jun 2009 09:35

Re: Max. 3 Nachkommastellen
 
@himitsu

.. wenn dann eine Ganzzahl übergeben wird und Presession > 0 ist,
dann wird aus einer 100 eine 1

Grüße
Klaus

himitsu 15. Jun 2009 09:40

Re: Max. 3 Nachkommastellen
 
OK, hatte ich zwar noch nicht das Problem, aber dann einfach so ^^
Delphi-Quellcode:
Function MyFormat(f: Extended; Precession: Byte; Width: Byte = 0): String;
  Begin
    Result := Format('%*.*n', [Width, Precession, f]);
    If Pos(DecimalSeparator, Result) > 0 Then Begin
      While Result[Length(Result)] = '0' do Delete(Result, Length(Result), 1);
      If Result[Length(Result)] = DecimalSeparator Then Delete(Result, Length(Result), 1);
    End;
  End;
oder
Delphi-Quellcode:
Function MyFormat(f: Extended; Precession: Byte; Width: Byte = 0): String;
  Var i: Integer;

  Begin
    Result := Format('%*.*n', [Width, Precession, f]);
    If Pos(DecimalSeparator, Result) > 0 Then Begin
      i := Length(Result);
      While Result[i] = '0' do Dec Dec(i);
      If Result[i] = DecimalSeparator Then Dec(i);
      Result := Copy(Result, 1, i);
    End;
  End;

BAMatze 15. Jun 2009 09:47

Re: Max. 3 Nachkommastellen
 
Hab mir auch mal eine Lösung überlegt, könnt ja mal raufschauen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure Ausgabevorbereitung(var n: integer;dfWert: double);
function Potenz(n: integer): integer;

var
  Form1: TForm1;
  dWert: double;
  iKommastellen: integer;

implementation

{$R *.dfm}

function Potenz(n: integer): integer;
begin
  if n = 1 then result := 10
  else
    begin
      n := n-1;
      result := 10 * Potenz(n);
    end;
end;

procedure Ausgabevorbereitung(var n: integer; dfWert: double);
var dTemp: double;
begin
  dTemp := round(dfWert);
  if (dTemp = (dfWert * 10)) or (n = iKommastellen) then
    begin
      Form1.Label1.Caption := floattostr(dTemp/Potenz(n));
    end
  else
    begin
      n := n+1;
      Ausgabevorbereitung(n,dfWert * 10);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var Index: integer;
begin
  dWert := 1.2345678;
  iKommastellen := 3;
  Index := 0;
  Ausgabevorbereitung(Index,dWert);

end;

end.
MfG
BAMatze

Carsten1234 15. Jun 2009 10:06

Re: Max. 3 Nachkommastellen
 
Zitat:

Zitat von Dust Signs
Formatier doch einfach die Zahl mit drei Nachkommastellen und entferne bei Bedarf die Nullen am Ende :stupid:

Stimmt! :wall:
Erstmal mit
Delphi-Quellcode:
Result:= Format('%0.3f', [AValue]);
auf 3 Nachkommastellen aufbohren, dann
Delphi-Quellcode:
while (Length(Result) > 1) and
      (Copy(Result, Length(Result), 1) = '0') do
    Delete(Result, Length(Result), 1);
alle hinteren Nullen entfernen und ggf. noch
Delphi-Quellcode:
if (Copy(Result, Length(Result), 1) = DecimalSeparator) then
    Delete(Result, Length(Result), 1);
den DecimalSeparator entfernen.
So bleibt dann bei 0,000 auch nur die 0 vor dem Komma stehen.

Danke! :bouncing4:

Hawkeye219 15. Jun 2009 11:23

Re: Max. 3 Nachkommastellen
 
Hallo Carsten,

hast du den Einzeiler aus Beitrag #5 einmal getestet?

Gruß Hawkeye

guidok 15. Jun 2009 11:26

Re: Max. 3 Nachkommastellen
 
Zitat:

Zitat von Carsten1234
Hallo zusammen,

bzgl. Runden mit 3, 4, 5 Nachkommastellen mit Hilfe von Format oder FormatFloatToStrF gibt es ja einiges zu lesen, doch zu meinem Problemchen im Betreff habe ich noch keine gute Lösung gefunden.
Ich möchte nämlich, dass ein Float max. 3 Nachkommastellen hat, optional aber auch weniger, wenn der Anwender weniger Nachkommastellen eingibt.
Bsp.:
1500 => 1500
100,01 => 100,01
0,3972 => 0,397
0,8767 => 0,877

Wie kann ich das denn möglichst einfach erreichen?

Dank vorab und Gruß, Carsten

Vielleicht verstehe ich das Problem nicht richtig, aber ist es nicht am einfachsten, die Format-Routine entsprechend der Anwendervorgabe aufzurufen:

Delphi-Quellcode:
case Vorgabe of
  1: Result:= Format('%0.1f', [AValue]);
  2: Result:= Format('%0.2f', [AValue]);
  3: Result:= Format('%0.3f', [AValue]);
end;
Alternativ könnte natürlich auch der Formatstring '%0.3f' entsprechend der Anwendervorgabe aufgebaut werden.

rollstuhlfahrer 15. Jun 2009 11:41

Re: Max. 3 Nachkommastellen
 
HI,

also ich bevorzuge auch die Methode mit den Formatstrings.
Beispiel:
Delphi-Quellcode:
function Runden(Zahl: Extended; Nachkommastellen: Byte): string;
var
  NachStr: String;
begin
  Nachstr := IntToStr(Nachkommastellen);
  Result := Format('%1.' + Nachstr + 'f', [Zahl]);
end;
Bernhard

himitsu 15. Jun 2009 11:52

Re: Max. 3 Nachkommastellen
 
@rollstuhlfahrer ... schau dir mal das * in den Format-Settings an :zwinker:

siehe mein Beitrag > http://www.delphipraxis.net/internal...048785#1048785
oder siehe Delphi-Referenz durchsuchenFormat

dakannst du dir das IntToStr und das etwas unübersichtliche Zusammensetzen sparen.

@guidok:
hier wird verlangt, daß der String maximal 3 Nachkommastellen hat ... aber Format selber kennt da nur die Definition "genau 3 Stellen"

Lannes 15. Jun 2009 12:21

Re: Max. 3 Nachkommastellen
 
Hallo,

hab auch einen Einzeiler:
Delphi-Quellcode:
sErg := FloatToStr(StrToFloat(Format('%.3f',[e])));

guidok 15. Jun 2009 12:25

Re: Max. 3 Nachkommastellen
 
Zitat:

Zitat von himitsu
@guidok:
hier wird verlangt, daß der String maximal 3 Nachkommastellen hat ... aber Format selber kennt da nur die Definition "genau 3 Stellen"

Zitat:

..optional aber auch weniger, wenn der Anwender weniger Nachkommastellen eingibt.
Ok, falsch interpretiert. Das klingt so, als ob der Anwender wählen kann wieviele Nachkommastellen er möchte, aber als Maximum (oder Vorgabe) drei eingestellt werden kann.

himitsu 15. Jun 2009 12:38

Re: Max. 3 Nachkommastellen
 
@Lannes:
Delphi-Quellcode:
sErg := FloatToStr(Round(e * Power(10, n)) / Power(10, n));
aber bei all diesen Varianten ... es geht so nicht mehr, sobald dir die internen Rundungsfehler der Fließkommatypen einen Strich durch die Rechnung machen :angel2:

Carsten1234 16. Jun 2009 06:37

Re: Max. 3 Nachkommastellen
 
Hallo,

Zitat:

Zitat von guidok
Vielleicht verstehe ich das Problem nicht richtig, aber ist es nicht am einfachsten, die Format-Routine entsprechend der Anwendervorgabe aufzurufen:

es gibt da keine Anwendervorgaben, wo er sagen könnte, ich will 1, 2 oder 3 Nachkommastellen. Die einzige Vorgabe (Beschränkung seitens der Anwendung) ist max. 3 Nachkommastellen in einem TEdit.
Vorher hatte ich beim OnExit-Event immer auf 3 Nachkommastellen "aufgrechnet". Wenn Anwender also 10,1 eingab, hatte ich daraus dann automatisch 10,100 gemacht, doch das fand man eine Etage höher nicht schön (war aber für mich einfacher, weil ich exakt mit dem Wert intern weiter rechnen musste).

Gruß, Carsten


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