![]() |
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 |
Re: Max. 3 Nachkommastellen
So einfach geht das nicht
|
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 |
Re: Max. 3 Nachkommastellen
Formatier doch einfach die Zahl mit drei Nachkommastellen und entferne bei Bedarf die Nullen am Ende :stupid:
Dust Signs |
Re: Max. 3 Nachkommastellen
Hallo,
vielleicht geht es so:
Delphi-Quellcode:
Gruß Hawkeye
var
s : string; x : Double; begin s := Format('%g', [{Math.}RoundTo(x, -3)]); end; |
Re: Max. 3 Nachkommastellen
Zitat:
Delphi-Quellcode:
[edit]
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;
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; |
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 |
Re: Max. 3 Nachkommastellen
OK, hatte ich zwar noch nicht das Problem, aber dann einfach so ^^
Delphi-Quellcode:
oder
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;
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; |
Re: Max. 3 Nachkommastellen
Hab mir auch mal eine Lösung überlegt, könnt ja mal raufschauen:
Delphi-Quellcode:
MfG
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. BAMatze |
Re: Max. 3 Nachkommastellen
Zitat:
Erstmal mit
Delphi-Quellcode:
auf 3 Nachkommastellen aufbohren, dann
Result:= Format('%0.3f', [AValue]);
Delphi-Quellcode:
alle hinteren Nullen entfernen und ggf. noch
while (Length(Result) > 1) and
(Copy(Result, Length(Result), 1) = '0') do Delete(Result, Length(Result), 1);
Delphi-Quellcode:
den DecimalSeparator entfernen.
if (Copy(Result, Length(Result), 1) = DecimalSeparator) then
Delete(Result, Length(Result), 1); So bleibt dann bei 0,000 auch nur die 0 vor dem Komma stehen. Danke! :bouncing4: |
Re: Max. 3 Nachkommastellen
Hallo Carsten,
hast du den Einzeiler aus Beitrag #5 einmal getestet? Gruß Hawkeye |
Re: Max. 3 Nachkommastellen
Zitat:
Delphi-Quellcode:
Alternativ könnte natürlich auch der Formatstring '%0.3f' entsprechend der Anwendervorgabe aufgebaut werden.
case Vorgabe of
1: Result:= Format('%0.1f', [AValue]); 2: Result:= Format('%0.2f', [AValue]); 3: Result:= Format('%0.3f', [AValue]); end; |
Re: Max. 3 Nachkommastellen
HI,
also ich bevorzuge auch die Methode mit den Formatstrings. Beispiel:
Delphi-Quellcode:
Bernhard
function Runden(Zahl: Extended; Nachkommastellen: Byte): string;
var NachStr: String; begin Nachstr := IntToStr(Nachkommastellen); Result := Format('%1.' + Nachstr + 'f', [Zahl]); end; |
Re: Max. 3 Nachkommastellen
@rollstuhlfahrer ... schau dir mal das * in den Format-Settings an :zwinker:
siehe mein Beitrag > ![]() oder siehe ![]() 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" |
Re: Max. 3 Nachkommastellen
Hallo,
hab auch einen Einzeiler:
Delphi-Quellcode:
sErg := FloatToStr(StrToFloat(Format('%.3f',[e])));
|
Re: Max. 3 Nachkommastellen
Zitat:
Zitat:
|
Re: Max. 3 Nachkommastellen
@Lannes:
Delphi-Quellcode:
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:
sErg := FloatToStr(Round(e * Power(10, n)) / Power(10, n));
|
Re: Max. 3 Nachkommastellen
Hallo,
Zitat:
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 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz