1. Einleitung
Wie bei der Berechnung der Nachkommastellen, gibt es auch für die Ermittlung der Anzahl der Vorkommastellen keine feste Funktion in PHP. Nachfolgend werden daher zwei mögliche Implementierungen vorgestellt. Eine arbeitet mit einer String-Umwandlung der Zahl, die andere mit mathematischen Operationen. Im Vergleich zur Nachkommastellenberechnung sind beide Funktionen genauer.
2. Berechnung über String-Umwandlung
In der nachfolgenden Funktion „countDigits()” wird ein übergebener Float-Wert zunächst in einen String umgewandelt. Anschließend wird die Position des letzten Punktes in der Zahl ermittelt. Ist keiner vorhanden, dann hat die Zahl keine Nachkommastellen und es kann direkt die Länge des Strings zurückgegeben werden. Andernfalls entspricht die Anzahl der Vorkommastellen der Position des Punktes im String (Position 0 = 0 Vorkommastellen, Position 1 = 1 Vorkommastelle usw.).
<?php $numbers = array(1, 5, 999, 1.0, 1.424000000000, 3.141, 0.123456789, 1e10, 13134.4324234, 2389.1111111111111, 99999999.2222222222); function countDigits($number) { $str = strval($number); $pos = strrpos($number, '.'); return ($pos===false ? strlen($str) : $pos); } foreach ($numbers as $number) { echo $number.": ".countDigits($number)."\n"; } ?>
1: 1 5: 1 999: 3 1: 1 1.424: 1 3.141: 1 0.123456789: 1 10000000000: 11 13134.4324234: 5 2389.1111111111: 4 99999999.222222: 8
3. Mathematische Berechnung über log10
Die zweite mögliche Implementierung arbeitet mit der Funktion log10($number). Diese gibt zurück, wie oft 10 mit sich selbst multipliziert werden muss, um die übergebene Zahl zu erhalten. Wird eine Zehnerpotenz übergeben, dann entspricht das Ergebnis von log10 der Anzahl der Nullen der übergebenen Zahl. Wird stattdessen eine Zahl übergeben, die ungleich einer Zehnerpotenz ist, dann gibt log10 eine ungerade Zahl zurück. Rundet man diese Zahl ab, so ergibt sich die Anzahl der Nullen der nächstniedrigeren Zehnerpotenz. Diese Anzahl plus eins entspricht der Anzahl der Vorkommastellen der übergebenen Zahl.
Einige beispielhafte Rückgaben von log10 lauten etwa:
<?php var_dump(log10(0)); // -INF var_dump(log10(0.5)); // -0.30102999566398 var_dump(log10(1)); // 0 var_dump(log10(11)); // 1.0413926851582 var_dump(log10(123)); // 2.0899051114394 ?>
float(-INF) float(-0.30102999566398) float(0) float(1.0413926851582) float(2.0899051114394)
Die Funktion countDigits, auf Basis von log10:
<?php $numbers = array(1, 5, 999, 1.0, 1.424000000000, 3.141, 0.123456789, 1e10, 13134.4324234, 2389.1111111111111, 99999999.2222222222); function countDigits($number) { // nur log fuer positive Zahl berechnen $number = abs($number); if ($number < 1 && $number >= 0) { // fuer Zahlen zwischen 0 und 1 ergibt log hier unpassende Werte, daher // wird dafuer gezielt 1 zurueckgegeben return 1; } else { // Anzahl der Vorkommastellen der Anzahl der Nullen // der nächstniedrigeren Zehnerpotenz plus eins return 1 + (int)(log10($number)); } } foreach ($numbers as $number) { echo $number.": ".countDigits($number)."\n"; } ?>
1: 1 5: 1 999: 3 1: 1 1.424: 1 3.141: 1 0.123456789: 1 10000000000: 11 13134.4324234: 5 2389.1111111111: 4 99999999.222222: 8