Home » Php » PHP: get number of decimal digits

# PHP: get number of decimal digits

Questions:

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)

Thanks,

Erwin

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

Questions:

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

Questions:
``````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
``````

Questions:

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

Questions:

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.

Questions:
``````<?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
``````

Questions:
``````\$decnumber = strlen(strstr(\$yourstr,'.'))-1
``````

Questions:

``````\$iDecimals = strlen(\$sFull%1);
``````

Questions:

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

Questions:

## 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)
``````

Questions:

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
``````

Questions:
``````\$value = 182.949;

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

Questions:

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

Questions:

# Solution

``````\$num = "12.1234567";
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 characters to an empty string (second parameter).

In this case we get this string: “1234567“.

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