2009-06-04 54 views
1

我一直在努力尋找一個很好的算法來將一個數字(可以是一個浮點數或整數)轉換成一個很好的格式化的人類可讀數字,並將該單位顯示爲一個字符串。例如:不錯的PHP算法將120000000轉換爲'120 mil'?

100500000 -> '100.5 Mil' 
200400 -> '200.4 K' 
143000000 -> '143 Mil' 
52000000000 -> '52 Bil' 

等,你明白了。

任何指針?

+0

請務必考慮i18n併爲當前語言環境使用正確的小數點分隔符 - 例如德國的逗號。 :-) – JeeBee 2009-06-04 23:08:07

回答

6

我會適應下面的代碼(我在網上找到):

代碼歸功於這個環節,我發現:http://www.phpfront.com/php/human-readable-byte-format/

function humanReadableOctets($octets) 
{ 
    $units = array('B', 'kB', 'MB', 'GB', 'TB'); // ...etc 

    for ($i = 0, $size =$octets; $size>1024; $size=$size/1024) 
     $i++; 

    return number_format($size, 2) . ' ' . $units[min($i, count($units) -1)]; 
} 

不要忘記更改一零二四年至1000年,雖然...

+6

你實際上可以做一些單獨的行$單位= $單位[日誌($ n)] – n3rd 2009-06-04 23:12:13

+0

偉大的查找!謝謝! – 2009-06-04 23:21:41

4
<?php 

function prettyNumber($number) // $number is int/float 
{ 
    $orders = Array("", " K", " Mil", " Bil"); 
    $order=0; 
    while (($number/1000.0) >= 1.5) { // while the next step up would generate a number greater than 1.5 
    $order++; 
    $number/=1000.0; 
    } 
    if ($order) 
    return preg_replace("/\.?0+$/", "", 
     substr(number_format($number, 2),0,5)).$orders[$order]; 
    return $number; 
} 

$tests = array(100500000,200400,143000000,52000000000); 
foreach ($tests as $test) 
{ 
    echo $test." -> '".prettyNumber($test)."'\n"; 
} 
+0

我喜歡它。我特別喜歡包含的測試。 – Christian 2009-06-04 23:20:40

2

這裏是一個log()版本,如果你仍然有興趣:

function wordify($val, $decimalPlaces = 1) { 
    if ($val < 1000 && $val > -1000) 
     return $val; 
    $a = array(0 => "", 1 => "K", 2 => "Mil", 3 => "Bil", 4 => "Tril", 5 => "Quad"); 
    $log1000 = log(abs($val), 1000); 
    $suffix = $a[$log1000]; 
    return number_format($val/pow(1000, floor($log1000)), $decimalPlaces, '.', '') . " $suffix"; 
} 

$tests = array(-1001, -970, 0, 1, 929, 1637, 17000, 123456, 1000000, 1000000000, 1234567890123); 

foreach ($tests as $num) { 
    echo wordify($num)."<br>"; 
}