webentwicklung-frage-antwort-db.com.de

PHP: Anzahl der Dezimalstellen abrufen

Gibt es eine einfache Möglichkeit, die Anzahl der Dezimalstellen in a(n) in PHP zu ermitteln? (dh ohne explode)

40
Erwin
$str = "1.23444";
print strlen(substr(strrchr($str, "."), 1));
65
ghostdog74
function numberOfDecimals($value)
{
    if ((int)$value == $value)
    {
        return 0;
    }
    else if (! is_numeric($value))
    {
        // throw new Exception('numberOfDecimals: ' . $value . ' is not a number!');
        return false;
    }

    return strlen($value) - strrpos($value, '.') - 1;
}


/* test and proof */

function test($value)
{
    printf("Testing [%s] : %d decimals\n", $value, numberOfDecimals($value));
}

foreach(array(1, 1.1, 1.22, 123.456, 0, 1.0, '1.0', 'not a number') as $value)
{
    test($value);
}

Ausgänge:

Testing [1] : 0 decimals
Testing [1.1] : 1 decimals
Testing [1.22] : 2 decimals
Testing [123.456] : 3 decimals
Testing [0] : 0 decimals
Testing [1] : 0 decimals
Testing [1.0] : 0 decimals
Testing [not a number] : 0 decimals
11
Kris

Sie könnten versuchen, es in ein int zu konvertieren, das von Ihrer Zahl abzuziehen und dann zu zählen, was übrig bleibt.

11
Allyn

Ich habe Folgendes verwendet, um festzustellen, ob ein zurückgegebener Wert Dezimalstellen hat (tatsächliche Dezimalwerte, nicht nur formatiert, um Dezimalzahlen wie 100,00 anzuzeigen):

if($mynum - floor($mynum)>0) {has decimals;} else {no decimals;} 
3
skips
<?php

test(0);
test(1);
test(1.234567890);
test(-123.14);
test(1234567890);
test(12345.67890);

function test($f) {
    echo "f = $f\n";
    echo "i = ".getIntCount($f)."\n";
    echo "d = ".getDecCount($f)."\n";
    echo "\n";
}

function getIntCount($f) {
    if ($f === 0) {
        return 1;
    } elseif ($f < 0) {
        return getIntCount(-$f);
    } else {
        return floor(log10(floor($f))) + 1;
    }
}

function getDecCount($f) {
    $num = 0;
    while (true) {
        if ((string)$f === (string)round($f)) {
            break;
        }
        if (is_infinite($f)) {
            break;
        }

        $f *= 10;
        $num++;
    }
    return $num;
}

Ausgänge:

f = 0
i = 1
d = 0

f = 1
i = 1
d = 0

f = 1.23456789
i = 1
d = 8

f = -123.14
i = 3
d = 2

f = 1234567890
i = 10
d = 0

f = 12345.6789
i = 5
d = 4
2
Sergey

Ich brauchte eine Lösung, die mit verschiedenen Zahlenformaten arbeitet und folgende Algorithmen entwickelte:

// Count the number of decimal places
$current = $value - floor($value);
for ($decimals = 0; ceil($current); $decimals++) {
    $current = ($value * pow(10, $decimals + 1)) - floor($value * pow(10, $decimals + 1));
}

// Count the total number of digits (includes decimal places)
$current = floor($value);
for ($digits = $decimals; $current; $digits++) {
    $current = floor($current / 10);
}

Ergebnisse:

input:    1
decimals: 0
digits:   1

input:    100
decimals: 0
digits:   3

input:    0.04
decimals: 2
digits:   2

input:    10.004
decimals: 3
digits:   5

input:    10.0000001
decimals: 7
digits:   9

input:    1.2000000992884E-10
decimals: 24
digits:   24

input:    1.2000000992884e6
decimals: 7
digits:   14
2
Jeremy Worboys

So etwas wie:

<?php

$floatNum = "120.340304";
$length = strlen($floatNum);

$pos = strpos($floatNum, "."); // zero-based counting.

$num_of_dec_places = ($length - $pos) - 1; // -1 to compensate for the zero-based count in strpos()

?>

Das ist verfahrenstechnisch, kludgy und ich würde nicht raten, es im Produktionscode zu verwenden. Aber es sollte dich anfangen.

2
David Thomas

Int

Ganze Zahlen haben keine Dezimalstellen, daher ist die Antwort immer Null.

Doppel/Float

Double- oder Float-Nummern sind Näherungswerte. Sie haben also keine definierte Anzahl von Dezimalstellen.

Ein kleines Beispiel:

$number = 12.00000000012;
$frac = $number - (int)$number;

var_dump($number);
var_dump($frac);

Ausgabe:

float(12.00000000012)
float(1.2000000992884E-10)

Sie können hier zwei Probleme sehen, die zweite Nummer verwendet die wissenschaftliche Darstellung und ist nicht genau 1.2E-10. 

String

Für eine Zeichenfolge, die eine Ganzzahl/Gleitkommazahl enthält, können Sie nach dem Dezimalzeichen suchen:

$string = '12.00000000012';
$delimiterPosition = strrpos($string, '.');
var_dump(
  $delimiterPosition === FALSE ? 0 : strlen($string) - 1 - $delimiterPosition
);

Ausgabe: 

int(11)
1
ThW

Wenn Sie Lesbarkeit zum Nutzen anderer Entwickler wünschen, verwenden Sie Folgendes:

function countDecimalPlacesUsingStrrpos($stringValue){
    $locale_info = localeconv();
    $pos = strrpos($stringValue, $locale_info['decimal_point']);
    if ($pos !== false) {
        return strlen($stringValue) - ($pos + 1);
    }
    return 0;
}

siehe localeconv

1
Ian

Wie wäre es damit?:

$iDecimals = strlen($sFull%1);
1
Anton

Hier ist eine Funktion, die nachfolgende Nullen berücksichtigt:

function get_precision($value) {
    if (!is_numeric($value)) { return false; }
    $decimal = $value - floor($value); //get the decimal portion of the number
    if ($decimal == 0) { return 0; } //if it's a whole number
    $precision = strlen($decimal) - 2; //-2 to account for "0."
    return $precision; 
}
1

Lösung

$num = "12.1234567";
print strlen(preg_replace("/.*\./", "", $num)); // 7

Erläuterung

Muster ". * \. " bedeutet alle Zeichen vor dem Dezimalpunkt mit seinem. 

In diesem Fall besteht die Zeichenfolge aus drei Zeichen: " 12. ".

Die Funktion preg_replace konvertiert diese Zeichen in eine leere Zeichenfolge (zweiter Parameter).

In diesem Fall erhalten wir diesen String: " 1234567 ".

Die Funktion strlen zählt die Anzahl der Zeichen in der obigen Zeichenfolge.

1
simhumileco
$decnumber = strlen(strstr($yourstr,'.'))-1
1
Young

Zuerst habe ich den Ort der Dezimalstelle mit der strpos-Funktion gefunden und den strpos-Positionswert um 1 erhöht, um die Dezimalstelle zu überspringen.

Zweitens habe ich die gesamte Stringlänge von dem Wert abgezogen, den ich von Punkt 1 erhalten habe.

Drittens habe ich die substr-Funktion verwendet, um alle Stellen nach dem Dezimalzeichen zu erhalten.

Viertens habe ich die Funktion strlen verwendet, um die Länge der Zeichenfolge nach der Dezimalstelle abzurufen.

Dies ist der Code, der die oben beschriebenen Schritte ausführt:

     <?php
        $str="98.6754332";
        echo $str;
        echo "<br/>";
        echo substr( $str, -(strlen($str)-(strpos($str, '.')+1)) );
        echo "<br/>";
        echo strlen( substr( $str, -(strlen($str)-(strpos($str, '.')+1))) );
    ?>
0
rahul sharma

Sie sollten immer vorsichtig sein, wenn es um unterschiedliche Schauplätze geht. Europäische Gebietsschemas verwenden ein Komma für das Tausendertrennzeichen, sodass die akzeptierte Antwort nicht funktioniert. Siehe unten für eine überarbeitete Lösung:

 function countDecimalsUsingStrchr($stringValue){
        $locale_info = localeconv();
        return strlen(substr(strrchr($stringValue, $locale_info['decimal_point']), 1));
    }

siehe localeconv

0
Ian

Dies funktioniert für beliebige Zahlen, auch in wissenschaftlicher Schreibweise, mit einer Genauigkeit von bis zu 100 Dezimalstellen.

$float = 0.0000005;

$working = number_format($float,100);
$working = rtrim($working,"0");
$working = explode(".",$working);
$working = $working[1];

$decmial_places = strlen($working);

Ergebnis:

7

Langwierig aber funktioniert ohne komplexe Bedingungen.

0
McClint