2010-12-06 3 views
10

나는 이것을 많이 봤지만 내 쿼리를 기반으로 유용한 기능을 찾을 수 없습니다.긴 숫자를 K/M/B로 줄이십시오?

는 내가 원하는 것은 :

100 -> 100 
1000 -> 1,000 
142840 -> 142,840 

하지만

2023150 -> 2.023M (i still want 3 additional numbers for more accuracy) 
5430120215 -> 5.430B 

내가 완전히 가능하면 동적으로 제한을 선택하는 사용자 정의 기능을 감사하겠습니다.

감사합니다.

+0

제한을 선택 하시겠습니까? – BoltClock

+3

'Kilo/Mega/Giga'에'K/M/G '가 아니라'Thousand/Million/Billion '이 아닙니까? – zzzzBov

답변

35

사용 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'; 
} 

나는 가능하면 동적으로 제한을 선택하는 사용자 정의 기능을 감사 완전히 것입니다. "제한"소수 자릿수 (정밀도)의 수를 의미하는 경우

, 즉 쉽게 :

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

재미있는 내용! 호기심에서, Stack Exchange가 어떻게 계산하는지에 대한 생각은 무엇입니까? – Praveen

+0

공식은 아니지만 이것은 고소 일 수 있습니다. http://stackoverflow.com/q/3177855/1671639 – Praveen

0

CakePHP의이 방법 toReadableSizeNumber Helper 있습니다. 당신은 그것을 grok 수 있고 자신의 무언가를 생각해 낼 수 있어야합니다. 이 경우 $this->precision은 기본적으로 number_format()과 같으며 __n은 단수 또는 복수의 함수입니다.

7

나는 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

좋은 답변 카일. if : abs ($ number) <($ divisor * 1000)) {', 그렇지 않으면 음수가 절대로 단축되지 않습니다. 또한'$ divisor'와'$ shortand'를 인스턴스화하는 것은 좋은 생각 일 것입니다. 사용자가 빈'$ divisors'를 넘겨 줄 때 예외가 없는지 확인하기 위해서입니다. 감사! –

+0

느슨하게'return 0 + number_format ($ number/$ divisor, $ precision). $ shorthand;'후미의 중요하지 않은 0을 없애기 위해 (필자는 필자가 필요로하지 않았던). – Redhart

2
<?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 
*/ 
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; 
    } 
0

은 긍정과 부정이

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

작품을하려고 시도 할 수 있습니다.

관련 문제