PHP: ondalık basamak sayısını almak

9 Cevap php

PHP bir (n) tamsayı / çift değer ondalık basamak sayısını belirleyen basit bir yolu var mı? (Bu patlayabilir kullanmadan olmadan)

Teşekkürler,

Erwin

9 Cevap

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);
}

Çıkışlar:

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

Eğer sayı o çıkarılarak ve sonra geriye ne sayma, bir int için döküm deneyebilirsiniz.

Ben bir döndürülen değer (sadece 100,00 gibi ondalık görüntülemek için biçimlendirilmiş değil gerçek ondalık değerleri) herhangi bir ondalık olup olmadığını belirlemek için aşağıdaki kullandı:

if($mynum - floor($mynum)>0) {has decimals;} else {no decimals;} 

Gibi bir şey:

<?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()

?>

Bu kludgy, usul ve ben üretim kodu kullanarak tavsiye etmem. Ama başlamak gerekir.

<?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;
}

Çıkışlar:

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

Buna ne dersiniz?:

$iDecimals = strlen($sFull%1);

Burada sıfır sondaki dikkate alan bir fonksiyon:

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; 
}

Ben senin soruya% 50 çözüm var, ben denemek ve zamanınız varsa daha sonra diğer yarısını yazacaktır:

function num_decimals($number) {
    if(is_int($number))
        return 0;
    throw new Exception("TODO");
}

Sadece intval işlevini kullanın

$result=23.45

echo intval($result);

/* result is : 23