Sorry for asking this but, I cant found a solution that will get this -> 7,000 to 7000.
I'm using intval[] and number_format[] but it will just give me 7 not 7000.
$myVal = '7,000';
echo intval[$myVal];
this returns 7
same goes with number_format[]
what am I doing wrong?
Charles
50.3k13 gold badges101 silver badges141 bronze badges
asked Jun 14, 2012 at 4:24
rob waminalrob waminal
17.7k16 gold badges49 silver badges64 bronze badges
2
If you are using PHP >= 5.3 [or have the "intl" extension installed, with at least version 1.0] then you could also use the NumberFormatter
class to parse a locale-specific number.
$myVal = '7,000';
$nf = new NumberFormatter["en_EN", NumberFormatter::DECIMAL];
var_dump[$nf->parse[$myVal, NumberFormatter::TYPE_INT32]];
# output: int[7000]
If you're using a PHP-version less than 5.3 you're better of using @KevinS. solution.
answered Jun 14, 2012 at 4:43
0
intval[]
won't work with the string you have because of the comma. You can remove the comma by using str_replace[]
and then calling intval[]
like so:
echo intval[str_replace[',', '', $myVal]]
answered Jun 14, 2012 at 4:28
Kevin S.Kevin S.
1761 silver badge8 bronze badges
0
[PHP 4, PHP 5, PHP 7, PHP 8]
number_format — Format a number with grouped thousands
Description
number_format[
float $num
,
int $decimals
= 0,
?string
$decimal_separator
= ".",
?string $thousands_separator
= ","
]: string
Parameters
num
The number being formatted.
decimals
Sets the number of decimal digits. If 0
, the decimal_separator
is omitted from the return value.
decimal_separator
Sets the separator for the decimal point.
thousands_separator
Sets the thousands separator.
Return Values
A formatted version of num
.
Changelog
8.0.0 | Prior to this version, number_format[] accepted one, two, or four parameters [but not three]. |
7.2.0 | number_format[] was changed to not being able to return -0 , previously -0 could be returned for cases like where num would be -0.01 .
|
Examples
Example #1 number_format[] Example
For instance, French notation usually use two decimals, comma [','] as decimal separator, and space [' '] as thousand separator. The following example demonstrates various ways to format a number:
See Also
- money_format[] - Formats a number as a currency string
- sprintf[] - Return a formatted string
- printf[] - Output a formatted string
- sscanf[] - Parses input from a string according to a format
thomas at weblizards dot de ¶
13 years ago
It's not explicitly documented; number_format also rounds:
0.001->0.00
0.002->0.00
0.003->0.00
0.004->0.00
0.005->0.01
0.006->0.01
0.007->0.01
0.008->0.01
0.009->0.01
info at ensostudio dot ru ¶
9 months ago
Note: use NumberFormatter to convert in human-readable format instead user function from comments:
james at bandit dot co.nz ¶
13 years ago
Outputs a human readable number.
247,704,360 -> 247.7 million
Outputs:
866,965,260,000 -> 867 billion
MarcM ¶
16 years ago
For Zero fill - just use the sprintf[] function
$pr_id = 1;
$pr_id = sprintf["%03d", $pr_id];
echo $pr_id;
//outputs 001
-----------------
$pr_id = 10;
$pr_id = sprintf["%03d", $pr_id];
echo $pr_id;
//outputs 010
-----------------
You can change %03d to %04d, etc.
stm555 at hotmail dot com ¶
17 years ago
I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.
I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.
Lio ¶
4 years ago
Be carreful, when you're using French notation
means : number_format[124.25, 2 , ',' , ' '] with ',' as dec_point,
Don't forget to specify thousands_sep that default is ',' to another value, otherwise function will return null.
nospam at nospam dot com ¶
13 years ago
Simple function to show money as only dollars if no cents, but will show 2 decimals if cents exist.
The 'cents' flag can force to never or always show 2 decimals
Cheers :]And remember to always contribute custom functions if they might be useful to the rest of us or future versions of the php language.
sgj at dr dot com ¶
19 years ago
Just an observation:
The number_format rounds the value of the variable.
$val1 = 1.233;
$val2 = 1.235;
$val3 = 1.237;
echo number_format[$val1,2,",","."]; // returns: 1,23
echo number_format[$val2,2,",","."]; // returns: 1,24
echo number_format[$val3,2,",","."]; // returns: 1,24
tomislav at firmus-grupa dot hr ¶
9 years ago
When apply number_format on number with separator on thousands, result is wrong. This function accept number of any format
all results are: 1 225 552,55
isapoetra at gmail dot com ¶
14 years ago
here is the code to convert number to Indonesian text, this code has limitation as is number_format function. sorry for this.
/*
* Created : Iwan Sapoetra - Jun 13, 2008
* Project : Web
* Package : cgaf
*
*/
function terbilang[ $num ,$dec=4]{
$stext = array[
"Nol",
"Satu",
"Dua",
"Tiga",
"Empat",
"Lima",
"Enam",
"Tujuh",
"Delapan",
"Sembilan",
"Sepuluh",
"Sebelas"
];
$say = array[
"Ribu",
"Juta",
"Milyar",
"Triliun",
"Biliun", // remember limitation of float
"--apaan---" ///setelah biliun namanya apa?
];
$w = "";
if [$num
Theo Diem ¶
19 years ago
formatting numbers may be more easy if u use number_format function.
I also wrote this :
function something[$number]
{
$locale = localeconv[];
return number_format[$number,
$locale['frac_digits'],
$locale['decimal_point'],
$locale['thousands_sep']];
}
hope this helps =]
[]'s
liviu andrei [bls] ¶
10 years ago
To prevent the rounding that occurs when next digit after last significant decimal is 5 [mentioned by several people below]:
have fun!
xmontero at dsitelecom dot com ¶
6 months ago
You can use:
number_format[ $number, '.', ' ' ]
Rationale:
Since 2003, the Internationa Standard of Units regulated that groups of three are to be separated by spaces and not dots or commas:
We can read about the S.I. in wikipedia about the numbers:
"Spaces should be used as a thousands separator [1000000] in contrast to commas or periods [1,000,000 or 1.000.000] to reduce confusion resulting from the variation between these forms in different countries."
here //en.wikipedia.org/wiki/International_System_of_Units in the section "General Rules".
More specifically in an official document they introduce the concept of "thin space":
"for numbers with many digits the digits may be divided into groups of three by a thin space, in order to facilitate reading. Neither dots nor commas are inserted in the spaces between groups of three."
here //mcyt.educa.madrid.org/laboratorios/Documentos/Otros/documentos/si_brochure_8_en.pdf in page 41, in the section "5.3.4 Formatting numbers, and the decimal marker".
Finally, also in wikipedia, we can read about the separation of digits:
"It is also used in the International System of Units and in many countries as a thousands separator when writing numbers in groups of three digits, in order to facilitate reading."
here: //en.wikipedia.org/wiki/Thin_space
Note that "THIN SPACE" is breakable and for a non-breakable space we also have the "NARROW NO-BREAK SPACE". Nevertheless the definition is a bit different:
"Also starting from release 34 of Unicode Common Locale Data Repository [CLDR] the NNBSP is used in numbers as thousands group separator for French and Spanish locale."
We can read it here: //en.wikipedia.org/wiki/Non-breaking_space at the end of the article
So, conclusion: We can use for the regular one or for the non-breaking one in the number_format function to accomodate modern times and forget once and for all to use dots or commas for the thousands.
More literature:
* Archive of the PDF //web.archive.org/web/20140705194729///www.bipm.org/en/si/si_brochure/chapter5/5-3-2.html
* //www.bipm.org/en/committees/cg/cgpm/22-2003/resolution-10
zulisse at email dot it ¶
15 years ago
simpler function to convert a number in bytes, kilobytes....
you may also add others units over PeraBytes when the hard disks will reach 1024 PB :]
Anonymous ¶
1 month ago
Note: Changing the number format loses PHP's ability to count. So do not change number format if you wish to do anything besides showing the number.
besciualexandru at gmail dot com ¶
6 years ago
// Here is a function that produces the same output as number_format[] but also works with numbers bigger than 2^53.
function a_number_format[$number_in_iso_format, $no_of_decimals=3, $decimals_separator='.', $thousands_separator='', $digits_grouping=3]{
// Check input variables
if [!is_numeric[$number_in_iso_format]]{
error_log["Warning! Wrong parameter type supplied in my_number_format[] function. Parameter \$number_in_iso_format is not a number."];
return false;
}
if [!is_numeric[$no_of_decimals]]{
error_log["Warning! Wrong parameter type supplied in my_number_format[] function. Parameter \$no_of_decimals is not a number."];
return false;
}
if [!is_numeric[$digits_grouping]]{
error_log["Warning! Wrong parameter type supplied in my_number_format[] function. Parameter \$digits_grouping is not a number."];
return false;
}
// Prepare variables
$no_of_decimals = $no_of_decimals * 1;
// Explode the string received after DOT sign [this is the ISO separator of decimals]
$aux = explode[".", $number_in_iso_format];
// Extract decimal and integer parts
$integer_part = $aux[0];
$decimal_part = isset[$aux[1]] ? $aux[1] : '';
// Adjust decimal part [increase it, or minimize it]
if [$no_of_decimals > 0]{
// Check actual size of decimal_part
// If its length is smaller than number of decimals, add trailing zeros, otherwise round it
if [strlen[$decimal_part] < $no_of_decimals]{
$decimal_part = str_pad[$decimal_part, $no_of_decimals, "0"];
} else {
$decimal_part = substr[$decimal_part, 0, $no_of_decimals];
}
} else {
// Completely eliminate the decimals, if there $no_of_decimals is a negative number
$decimals_separator = '';
$decimal_part = '';
}
// Format the integer part [digits grouping]
if [$digits_grouping > 0]{
$aux = strrev[$integer_part];
$integer_part = '';
for [$i=strlen[$aux]-1; $i >= 0 ; $i--]{
if [ $i % $digits_grouping == 0 && $i != 0]{
$integer_part .= "{$aux[$i]}{$thousands_separator}";
} else {
$integer_part .= $aux[$i];
}
}
}
$processed_number = "{$integer_part}{$decimals_separator}{$decimal_part}";
return $processed_number;
}
$original_number= 9223372036854775805;
echo a_number_format[$original_number, 4, '.',"'",3];
// Outputs: 9'223'372'036'854'775'805.1230
oelschlegel at gmail dot com ¶
8 months ago
Setting the second argument to a value to greater than what is possible in floating point representation returns some interesting results.
info at ensostudio dot ru ¶
9 months ago
Auto calculate decimals by default:
info at daniel-marschall dot de ¶
13 years ago
In my function my_number_format[] [shown below] there was a bug.
If a negative number which is smaller than 1 was entered [-0,...], then the result was wrongly positive because +0 is equal to -0 [the content of $tmp[0] which was interpretet as numeric value].
Here is the corrected version:
[EDIT BY danbrown AT php DOT net: The original note follows.]
Let's say we got the number $inp = 1234.56
By using
But I have a problem with that: I want to add commas as thousand separators and change the decimal-separator [this could also be done with str_replace], but I do not want to change the amount of fractional digits!
But since the 2nd argument of number_format is necessary to enter the 3rd and 4th argument, this cannot be done with number_format. You have to change the fractional digits with this function.
But I want that 1234.56 changes into 1.234,56 and 1234.567890123456 changes into 1.234,567890123456
So, I created following function, that doesn't change the amount of fractional digits:
Thanks to Federico Cassinelli for the bug report.
you can get the German format 1.234,56. [Comma as decimal separator and point as thousand separator]
markagius at markagius co uk ¶
2 years ago
If you want a number of digits after the point, but not unnecessary zeros.
Eg.
number_format[1.20000,4] = 1.2000
num_format[1.20000,4,0] = 1.2
number_format[1.20000,4] = 1.2000
num_format[1.20000,4,2] = 1.20
number_format[1.23456,4] = 1.2345
num_format[1.23456,4,2] = 1.2345
function num_format[$numVal,$afterPoint=2,$minAfterPoint=0,$thousandSep=",",$decPoint="."]{
// Same as number_format[] but without unnecessary zeros.
$ret = number_format[$numVal,$afterPoint,$decPoint,$thousandSep];
if[$afterPoint!=$minAfterPoint]{
while[[$afterPoint>$minAfterPoint] && [substr[$ret,-1] =="0"] ]{
// $minAfterPoint!=$minAfterPoint and number ends with a '0'
// Remove '0' from end of string and set $afterPoint=$afterPoint-1
$ret = substr[$ret,0,-1];
$afterPoint = $afterPoint-1;
}
}
if[substr[$ret,-1]==$decPoint] {$ret = substr[$ret,0,-1];}
return $ret;
}
divinity76 at gmail dot com ¶
2 years ago
if you want to benchmark all costs for 5 seconds:
on my laptop rolling "Intel Core i7-8565U CPU @ 1.80GHz" it prints:
$ php foo.php
cost 4: 1ms - 0.0010s
cost 5: 2ms - 0.0022s
cost 6: 3ms - 0.0038s
cost 7: 6ms - 0.0069s
cost 8: 14ms - 0.0147s
cost 9: 25ms - 0.0254s
cost 10: 55ms - 0.0554s
cost 11: 103ms - 0.1040s
cost 12: 184ms - 0.1848s
cost 13: 367ms - 0.3676s
cost 14: 737ms - 0.7379s
cost 15: 1881ms - 1.8810s
[with ms meaning milliseconds and s meaning seconds]
mail at igor dot vodka ¶
3 years ago
Please be careful with stm555 at hotmail dot com's solution.
If you pass some little negative number [-1 < $number < 0] such as -0.01, the integer part would be converted to 0, so that the sign is eventually lost.
Here is a fixed version:
Svein Tjonndal [sveint at yahoo dot com] ¶
18 years ago
If you use space as a separator, it will break on that space in HTML tables...
Furthermore, number_format doesn't like ' ' as a fourth parameter. I wrote the following function to display the numbers in an HTML table.
function numberfix[$number]
{
$number = number_format[$number,0,","," "];
return str_replace[" ", " ", $number];
}
For use in:
mobi dot lenoe at gmail dot com ¶
8 years ago
I'd like to comment to the old notes of "stm555" and "woodynadobhar".
They wrote about "number_format_unlimited_precision[]".
I guess many of us need that kind of function, which is the almost same function as number_format but don't round a number.
Does Anyone know any new solution in a recent PHP version?
...
If no, how about the following function? [I fixed somethings like bugs of the function in the old comment.]