PHP: get number of decimal digits

PhpDecimal

Php Problem Overview


Is there a straightforward way of determining the number of decimal places in a(n) integer/double value in PHP? (that is, without using explode)

Php Solutions


Solution 1 - Php

$str = "1.23444";
print strlen(substr(strrchr($str, "."), 1));

Solution 2 - Php

You could try casting it to an int, subtracting that from your number and then counting what's left.

Solution 3 - Php

Less code:

$str = "1.1234567";
echo (int) strpos(strrev($str), ".");

Solution 4 - Php

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

Outputs:

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

Solution 5 - Php

I needed a solution that works with various number formats and came up with the following algorithms:

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

Results:

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

Solution 6 - Php

I used the following to determine whether a returned value has any decimals (actual decimal values, not just formatted to display decimals like 100.00):

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

Solution 7 - Php

Something like:

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

?>

This is procedural, kludgy and I wouldn't advise using it in production code. But it should get you started.

Solution 8 - Php

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

Outputs:

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

Solution 9 - Php

Here's a function that takes into account trailing zeroes:

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

Solution 10 - Php

#Solution

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

#Explanation

Pattern .*\. means all the characters before the decimal point with its.

In this case it's string with three characters: 12.

preg_replace function converts these cached characters to an empty string "" (second parameter).

In this case we get this string: 1234555

strlen function counts the number of characters in the retained string.

Solution 11 - Php

If you want readability for the benefit of other devs, locale safe, use:

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

see localeconv

Solution 12 - Php

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

Solution 13 - Php

How about this?:

$iDecimals = strlen($sFull%1);

Solution 14 - Php

Int

Integers do not have decimal digits, so the answer is always zero.

Double/Float

Double or float numbers are approximations. So they do not have a defined count of decimal digits.

A small example:

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

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

Output:

float(12.00000000012)
float(1.2000000992884E-10)

You can see two problems here, the second number is using the scientific representation and it is not exactly 1.2E-10.

String

For a string that contains a integer/float you can search for the decimal point:

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

Output:

int(11)

Solution 15 - Php

First I have found the location of the decimal using strpos function and increment the strpos postion value by 1 to skip the decimal place.

Second I have subtracted the whole string length from the value I have got from the point1.

Third I have used substr function to get all digits after the decimal.

Fourth I have used the strlen function to get length of the string after the decimal place.

This is the code that performs the steps described above:

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

Solution 16 - Php

You should always be careful about different locales. European locales use a comma for the thousands separator, so the accepted answer would not work. See below for a revised solution:

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

see localeconv

Solution 17 - Php

This will work for any numbers, even in scientific notation, with precision up to 100 decimal places.

$float = 0.0000005;

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

$decmial_places = strlen($working);

Result:

7

Lengthy but works without complex conditionals.

Solution 18 - Php

$value = 182.949;

$count = strlen(abs($value - floor($value))) -2; //0.949 minus 2 places (0.)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionErwinView Question on Stackoverflow
Solution 1 - Phpghostdog74View Answer on Stackoverflow
Solution 2 - PhpAllynView Answer on Stackoverflow
Solution 3 - PhpM RostamiView Answer on Stackoverflow
Solution 4 - PhpKrisView Answer on Stackoverflow
Solution 5 - PhpJeremy WorboysView Answer on Stackoverflow
Solution 6 - PhpskipsView Answer on Stackoverflow
Solution 7 - PhpDavid ThomasView Answer on Stackoverflow
Solution 8 - PhpSergeyView Answer on Stackoverflow
Solution 9 - PhpRJRView Answer on Stackoverflow
Solution 10 - PhpsimhumilecoView Answer on Stackoverflow
Solution 11 - PhpIanView Answer on Stackoverflow
Solution 12 - PhpYoungView Answer on Stackoverflow
Solution 13 - PhpAntonView Answer on Stackoverflow
Solution 14 - PhpThWView Answer on Stackoverflow
Solution 15 - Phprahul sharmaView Answer on Stackoverflow
Solution 16 - PhpIanView Answer on Stackoverflow
Solution 17 - PhpMcClintView Answer on Stackoverflow
Solution 18 - PhpLeonardo JorgeView Answer on Stackoverflow