我已经搜索了很多内容,但根据我的查询,我找不到任何有用的功能。
我想要的是:
100 -> 100
1000 -> 1,000
142840 -> 142,840
但是
2023150 -> 2.023M ( i still want 3 additional numbers for more accuracy )
5430120215 -> 5.430B
如果可能的话,我会非常感谢动态选择限制的任何自定义函数。
谢谢!
答案 0 :(得分:48)
使用number_format()
:
if ($n < 1000000) {
// Anything less than a million
$n_format = number_format($n);
} else if ($n < 1000000000) {
// Anything less than a billion
$n_format = number_format($n / 1000000, 3) . 'M';
} else {
// At least a billion
$n_format = number_format($n / 1000000000, 3) . 'B';
}
如果可能的话,我会非常感谢动态选择限制的任何自定义函数。
如果“limit”指的是小数位数(精度),那很容易:
function custom_number_format($n, $precision = 3) {
if ($n < 1000000) {
// Anything less than a million
$n_format = number_format($n);
} else if ($n < 1000000000) {
// Anything less than a billion
$n_format = number_format($n / 1000000, $precision) . 'M';
} else {
// At least a billion
$n_format = number_format($n / 1000000000, $precision) . 'B';
}
return $n_format;
}
答案 1 :(得分:18)
我接受了BoltClock提供的答案,并在考虑到配置的情况下稍微调整了一下。
// Shortens a number and attaches K, M, B, etc. accordingly
function number_shorten($number, $precision = 3, $divisors = null) {
// Setup default $divisors if not provided
if (!isset($divisors)) {
$divisors = array(
pow(1000, 0) => '', // 1000^0 == 1
pow(1000, 1) => 'K', // Thousand
pow(1000, 2) => 'M', // Million
pow(1000, 3) => 'B', // Billion
pow(1000, 4) => 'T', // Trillion
pow(1000, 5) => 'Qa', // Quadrillion
pow(1000, 6) => 'Qi', // Quintillion
);
}
// Loop through each $divisor and find the
// lowest amount that matches
foreach ($divisors as $divisor => $shorthand) {
if (abs($number) < ($divisor * 1000)) {
// We found a match!
break;
}
}
// We found our match, or there were no matches.
// Either way, use the last defined value for $divisor.
return number_format($number / $divisor, $precision) . $shorthand;
}
答案 2 :(得分:4)
<?php
// Converts a number into a short version, eg: 1000 -> 1k
// Based on: http://stackoverflow.com/a/4371114
function number_format_short( $n, $precision = 1 ) {
if ($n < 900) {
// 0 - 900
$n_format = number_format($n, $precision);
$suffix = '';
} else if ($n < 900000) {
// 0.9k-850k
$n_format = number_format($n / 1000, $precision);
$suffix = 'K';
} else if ($n < 900000000) {
// 0.9m-850m
$n_format = number_format($n / 1000000, $precision);
$suffix = 'M';
} else if ($n < 900000000000) {
// 0.9b-850b
$n_format = number_format($n / 1000000000, $precision);
$suffix = 'B';
} else {
// 0.9t+
$n_format = number_format($n / 1000000000000, $precision);
$suffix = 'T';
}
// Remove unecessary zeroes after decimal. "1.0" -> "1"; "1.00" -> "1"
// Intentionally does not affect partials, eg "1.50" -> "1.50"
if ( $precision > 0 ) {
$dotzero = '.' . str_repeat( '0', $precision );
$n_format = str_replace( $dotzero, '', $n_format );
}
return $n_format . $suffix;
}
/*
Example Usage:
number_format_short(7201); // Output: 7.2k
Demo:
echo '<table>';
for($d = 0; $d < 16; $d++ ) {
$n = intval("09" . str_repeat( "0", $d ));
$n = $n / 10;
echo number_format_short($n) .'<br>'; // 0.9
$n = intval("1" . str_repeat( "0", $d ));
echo number_format_short($n) .'<br>'; // 1.0
$n = intval("11" . str_repeat( "0", $d ));;
$n = $n / 10;
echo number_format_short($n) .'<br>'; // 1.1
}
echo '</table>';
Demo Output:
0.9
1
1.1
9
10
11
90
100
110
0.9K
1K
1.1K
9K
10K
11K
90K
100K
110K
0.9M
1M
1.1M
9M
10M
11M
90M
100M
110M
0.9B
1B
1.1B
9B
10B
11B
90B
100B
110B
0.9T
1T
1.1T
9T
10T
11T
90T
100T
110T
900T
1,000T
1,100T
*/
答案 3 :(得分:3)
function number_abbr($number)
{
$abbrevs = [12 => 'T', 9 => 'B', 6 => 'M', 3 => 'K', 0 => ''];
foreach ($abbrevs as $exponent => $abbrev) {
if (abs($number) >= pow(10, $exponent)) {
$display = $number / pow(10, $exponent);
$decimals = ($exponent >= 3 && round($display) < 100) ? 1 : 0;
$number = number_format($display, $decimals).$abbrev;
break;
}
}
return $number;
}
适用于积极因素和消极因素。
答案 4 :(得分:2)
试试这个
function custom_number_format($n, $precision = 1) {
if ($n < 900) {
// Default
$n_format = number_format($n);
} else if ($n < 900000) {
// Thausand
$n_format = number_format($n / 1000, $precision). 'K';
} else if ($n < 900000000) {
// Million
$n_format = number_format($n / 1000000, $precision). 'M';
} else if ($n < 900000000000) {
// Billion
$n_format = number_format($n / 1000000000, $precision). 'B';
} else {
// Trillion
$n_format = number_format($n / 1000000000000, $precision). 'T';
}
return $n_format;
}
答案 5 :(得分:0)
CakePHP的Number Helper方法为toReadableSize
。你应该能够理解它并自己想出一些东西。其中,$this->precision
基本上类似number_format()
,而__n
是单数或复数函数。
答案 6 :(得分:0)
你可以试试这个
function number_formation($number, $precision = 3) {
if ($number < 1000000) {
$formatted_number = number_format($number); /* less than a million */
} else if ($number < 1000000000) {
$formatted_number = number_format($number / 1000000, $precision) . 'M'; /* billion */
} else {
$formatted_number = number_format($number / 1000000000, $precision) . 'B'; /* for billion */
}
return $formatted_number;
}
答案 7 :(得分:0)
尽管很早以前有人问过这个问题,但我有一个不同的解决方案,我认为它更简单:
function shorten($number){
$suffix = ["", "K", "M", "B"];
$precision = 1;
for($i = 0; $i < count($suffix); $i++){
$divide = $number / pow(1000, $i);
if($divide < 1000){
return round($divide, $precision).$suffix[$i];
break;
}
}
}
echo shorten(1000);
我希望它对某人仍然有帮助。
答案 8 :(得分:0)
尝试一下。帐户组k,M,B,T和Q(四十亿)。高于999Q的值表示为999Q +。
function number($num, $precision = 2)
{
$absNum = abs($num);
if ($absNum < 1000)
{
return (string)round($num, $precision);
}
$groups = ['k','M','B','T','Q'];
foreach ($groups as $i => $group)
{
$div = 1000 ** ($i + 1);
if ($absNum < $div * 1000)
{
return round($num / $div, $precision) . $group;
}
}
return '999Q+';
}
答案 9 :(得分:0)
在以前的解决方案的基础上,我采取了另一种方法。基本上,它使用log()
函数来摆脱for
语句:
function number_shorten($number, $precision = 3)
{
$suffixes = ['', 'K', 'M', 'B', 'T', 'Qa', 'Qi'];
$index = (int) log(abs($number), 1000);
$index = max(0, min(count($suffixes) - 1, $index)); // Clamps to a valid suffixes' index
return number_format($number / 1000 ** $index, $precision) . $suffixes[$index];
}