Feste Nachkommastellen mit php

Hallo,

ich benötige bei einer Variable immer eine feste Nachkommastelle. Ich bekomme die Zahl als Integer , z. B. 251 und möchte daraus 25.1 machen. Das klappt auch mit Umwandlung in Float. Zusätzlich möchte ich auch aus 250 -> 25.0 erhalten und nicht 25. Hat jemand eine Idee?

wie machst du es denn jetzt?

Toni

Hallo TK6,

es gibt in PHP einige mächtige Funktionen, die für die Formatierung von Zahlen zuständig sind:

sprintf(…)
number_format(…)

Nachzulesen unter http://de.php.net/manual/de/

Beispiel:

$floatNumber = GetValueInteger("Number")/10;       // Division ergibt immer einen Float-Typ
$formattedNumber = sprintf("%4.1f", $floatNumber); // wandelt z.B. 21.478 nach "21,5"

Der Format-String „%4.1f“ bewirkt die Darstellung einer Float-Zahl mit insgesamt 4 Zeichen (inkl. Komma), 1 Nachkommastelle.
Wenn Du eine führende Null möchtest: „%04.1f“

Gruß
HJH

Super,
Vielen Dank. number_format hatte ich schon probiert, aber die sprintf Funktion kannte ich noch nicht. Ich mache es jetzt so:

$AI00 = sprintf("%3.1f", GetValueInteger(„AI00“)/10;
SetValueFloat(„WagoTemperatur00“, (float)$AI00);

Wichtig ist die Rückumwandlung in float in der 2. Zeile, sonst kommt ein Fehler, da sprintf einen string ausgibt. Obwohl das in der Doku anders steht; dafür ist ja der parameter „f“.

Danke für die schnelle Hilfe

sprintf gibt IMMER einen String aus und dient dazu formatierte Strings zu erzeugen… wird bei IPS z.B. benutzt für formatierte Ausgaben auf dem Designer oder Sprachausgaben… aber eigentlich nicht in dem deinigen Fall :wink:

Eiegtnlich sollte das:


SetValueFloat("WagoTemperatur00", floatval(GetValueInteger("AI00")/10) );

bei dir schon reichen.

Hallo Olli,

es geht sogar noch kürzer:

SetValueFloat("WagoTemperatur00", GetValueInteger("AI00")/10);

Wie schon weiter oben erwähnt erzeugt die Division in PHP immer ein Ergebnis vom Typ Float.

Um eine Konvertierung nach Float zu erzwingen, hätte ein einfacher typecast (float) anstelle der aufwändigen floatval(…)-Funktion genügt.
Aber in diesem Falle ist keines von beiden nötig.

TK6 hat sich in seinem Eingangs-Thread missverständlich ausgedrückt. Ich hatte geglaubt er wolle die Formatierung für eine Anzeige verwenden.
Ein Float läßt sich überhaupt nicht formatieren. Ein Format wird immer erst durch die Umwandlung in einen String wirksam.

Ich vermute daher, es soll eine Begrenzung der effektiven Nachkommastellen erreicht werden. Das geht am einfachsten mit der round(…)-Funktion:

Runden eines Float auf 1 Nachkommastelle:

$roundedFloat = round($bigFloat, 1);

Gruß
HJH

Hallo HjH,

Das stimmt so leider nicht ganz… Das Ergebnis kann float sein es kann aber auch int sein - PHP ist eine Interpretersprache und es hängt vom Ergebnis ab was dabei rauskommt. Normalerweise macht PHP das ganz gut mit den types - aber in Zusammenhang mit der Delphi Schnittstelle von IPS sollte man sich nicht darauf verlassen.

Ein kleines Beispiel:


$v = 4/2;
echo var_dump($v)."
";

Nach deiner Aussage sollte durch die Division das Ergebnis float sein.

var_dump() sagt jedoch folgendes:


int(2)

anders sieht es natürlich mit folgendem Code aus:


$v = 4/2.0;
echo var_dump($v)."
";

hier bekommen wir als Ergebnis:


float(2)

Somit kann man also nicht sagen, dass eine Division in PHP immer float ergibt.

Dein obiges Beispiel sollte dementsprechend besser folgendermassen aussehen:

SetValueFloat("WagoTemperatur00", GetValueInteger("AI00")/10.0);

Da PHP ein Interpreter ist, ist es auch nicht ganz einfach herauszufinden ob die eine Art der Notation für den Rechner aufwendiger ist als eine andere Art der Notation. Bei C würde ich einen Function-Call wie floatval() durchaus als aufwendiger als ein reines Typecasting ansehen, da ein gewisser Verwaltungsoverhead bzgl. Stack durchaus gegeben ist. PHP, als Interpreter, ist aber nicht so maschinennah wie C und es kann durchaus sein, dass der Verwaltungsaufwand bei der Notation iWert[/i] oder floatval(Wert) fast identisch ist.
Falls es Unterschiede in der Laufzeit zwischen den beiden Notationen gibt die zu Problemen bei der Implementierung einer Aufgabe führen, würde ich mich eher Fragen ob PHP noch das geeignete Werkzeug für mein Vorhaben darstellt - da wäre dann andere Sprachen vorzuziehen.

Ich verwende in PHP fast immer floatval(), intval() und strval() weil es als Konstrukt meist weniger Fehlerquellen (durch die zwingende Klammerung des zu castenden Wertes) beherbergt als das casting durch iWert[/i].

Gruss,
Olli

Hallo Olli,

Du hast ganz offensichtlich Recht. Ich habe es nachgeprüft. Auch gettype(…) meldet beim Ergebnis von 4/2 Integer als Typ.

Dies steht allerdings im krassen Widerspruch zum PHP-Manual:

The division operator ("/") returns a float value anytime, even if the two operands are integers (or strings that get converted to integers).

Anscheinend hat sich da etwas geändert ohne im Manual berücksichtigt worden zu sein.

Vielen Dank für den Hinweis :). Ich werde das in Zukunft weniger leichtgläubig behandeln.

Gruß
HJH

Hallo Ihr 2,

Die einzeilige Version funktioniert im Prinzip gut. Meine Intension war tatsächlich eine Formatierung zur Anzeige im Designer; zusätzlich würde ich mit dem Wert auch weitere Berechnungen machen wollen. Daher der Ansatz mit float. Am Besten wäre dann eine Formatierung direkt im Designer (kann ja Excel auch :wink: ). Ich verwende jetzt eine string variable:
SetValueString(„WagoTemperatur00“, sprintf("%3.1f", GetValueInteger(„AI00“)/10));

Zum Rechnen benutze ich dann eben AI00/10.

Nochmal Danke