What's the correct way to round a PHP string to two decimal places?
$number = "520"; // It's a string from a database
$formatted_number = round_to_2dp($number);
echo $formatted_number;
The output should be 520.00
;
How should the round_to_2dp()
function definition be?
round
is a math function, and this is just a formatting problem.
You can use number_format():
return number_format((float)$number, 2, '.', '');
Example:
$foo = "105";
echo number_format((float)$foo, 2, '.', ''); // Outputs -> 105.00
This function returns a string.
Use round()
(use if you are expecting a number in float format only, else use number_format() as an answer given by Codemwnci):
echo round(520.34345, 2); // 520.34
echo round(520.3, 2); // 520.3
echo round(520, 2); // 520
From the manual:
Description: float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]); Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
...
Example #1 round() examples Example #2 mode examples
round($number, 2);
doesn't work. I want 520.00 not 520. Can't believe round doesn't do that by default.
Alternatively,
$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
520,00
? I guess the other answer works better in that case.
http://php.net/manual/en/function.round.php
e.g.
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
round(1,2)
(or any level or precision) returns '1.0', because '1.00' would not be a valid float. To make numbers behave like strings, you need to use string manipulation functions. (Previous versions of PHP may have acted differently/less logically)
Try:
$number = 1234545454;
echo $english_format_number = number_format($number, 2);
The output will be:
1,234,545,454.00
Use the PHP number_format() function.
For example,
$num = 7234545423;
echo number_format($num, 2);
The output will be:
7,234,545,423.00
You can use the PHP printf
or sprintf
functions:
Example with sprintf
:
$num = 2.12;
echo sprintf("%.3f", $num);
You can run the same without echo
as well. Example: sprintf("%.3f", $num);
Output:
2.120
Alternatively, with printf
:
echo printf("%.2f", $num);
Output:
2.124
Another more exotic way to solve this issue is to use bcadd()
with a dummy value for the $right_operand of 0
.
$formatted_number = bcadd($number, 0, 2);
bc*
functions do not round up, they always round down. For example, bcadd("1.0999","0.0",1)
yields "1.0", not "1.1".
$scale
fractional digits. This equals rounding towards zero.
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
This will display exactly two digits after the decimal point.
Advantage:
If you want to display two digits after a float value only and not for int, then use this.
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', '');
It will return 5.98 without rounding the number.
floor($retailPrice * 100) / 100;
no need of number format then.
For conditional rounding off ie. show decimal where it's really needed otherwise whole number
123.56 => 12.56
123.00 => 123
$somenumber = 123.56;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123.56
$somenumber = 123.00;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123
Here I get two decimals after the .
(dot) using a function...
function truncate_number($number, $precision = 2) {
// Zero causes issues, and no need to truncate
if (0 == (int)$number) {
return $number;
}
// Are we negative?
$negative = $number / abs($number);
// Cast the number to a positive to solve rounding
$number = abs($number);
// Calculate precision number for dividing / multiplying
$precision = pow(10, $precision);
// Run the math, re-applying the negative value to ensure
// returns correctly negative / positive
return floor( $number * $precision ) / $precision * $negative;
}
Results from the above function:
echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789); // 2.56
echo truncate_number(2.56789, 3); // 2.567
echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789); // -2.56
echo truncate_number(-2.56789, 3); // -2.567
New Correct Answer
Use the PHP native function bcdiv
echo bcdiv(2.56789, 1, 1); // 2.5
echo bcdiv(2.56789, 1, 2); // 2.56
echo bcdiv(2.56789, 1, 3); // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
I make my own.
$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
use roud(yourValue,decimalPoint)
or number_format(yourValue,decimalPoint);
number_format()
return value as string like this type 1,234.67. so in this case you can not use it for addition or any calculation. if you try then you have to deal with Number Format Error...
In this case round(121222.299000000,2)
will be better option. The result would be 121222.29 ...
round_to_2dp
is a user-defined function, and nothing can be done unless you posted the declaration of that function.
However, my guess is doing this: number_format($number, 2);
round_to_2dp($number);
was meant as pseudocode; the OP was asking for somebody to tell him what to replace that expression with.
$twoDecNum = sprintf('%0.2f', round($number, 2));
The rounding correctly rounds the number and the sprintf forces it to 2 decimal places if it happens to to be only 1 decimal place after rounding.
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
This will give you 2 number after decimal.
If you want to use two decimal digits in your entire project, you can define:
bcscale(2);
Then the following function will produce your desired result:
$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
But if you don't use the bcscale function, you need to write the code as follows to get your desired result.
$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
To know more
BC Math Functions
bcscale
Adding to other answers, since number_format() will, by default, add thousands separator.
To remove this, do this:
$number = number_format($number, 2, ".", "");
Number without round
$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Choose the number of decimals
Format commas(,)
An option to trim trailing zeros
Once and for all!
function format_number($number,$dec=0,$trim=false){
if($trim){
$parts = explode(".",(round($number,$dec) * 1));
$dec = isset($parts[1]) ? strlen($parts[1]) : 0;
}
$formatted = number_format($number,$dec);
return $formatted;
}
Examples
echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2); //returns 1,234.50
echo format_number(1234.5); //returns 1,235
In case you use math equation
like I did you can set it like this:
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
That's the same question I came across today and want to round a number and return float value up to a given decimal place and it must not be string (as returned from number_format) the answer is
echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));
echo sprintf()
is an antipattern. It is more sensibly written as printf()
only.
Success story sharing
round
doesn't solve the OP's problem here.round("520", 2)
returns the float520
, and echoing that will of course not show it to 2 decimal places. For the OP's purpose - showing an integer to 2 decimal places by padding it with trailing zeroes - you need a number formatting function, not a rounding function.520,00
instead of520.00
, this simply works.