2009-06-04 11 views
1

J'ai du mal à trouver un algorithme agréable de changer un certain nombre (peut-être un flotteur ou entier) en un nombre lisible par l'homme bien formated montrant les unités sous forme de chaîne. Par exemple:Bel algorithme PHP pour convertir 120000000 en '120 mil'?

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

etc, vous avez l'idée.

Des pointeurs?

+0

Assurez-vous de prendre en compte i18n et utilisez le séparateur décimal approprié pour les paramètres régionaux actuels - par exemple, une virgule en Allemagne. :-) – JeeBee

Répondre

6

J'adapte le code ci-dessous (qui j'ai trouvé sur le net):

crédit Code

va à ce lien que j'ai trouvé: 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)]; 
} 

Ne pas oublier de changer 1024-1000 mais ...

+6

Vous pourriez réellement faire quelque chose seul les lignes de $ unit = $ units [log ($ n)] – n3rd

+0

Great Find! Merci! –

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

J'aime ça. J'aime particulièrement les tests inclus. – Christian

2

Voici une version log() si vous êtes toujours intéressé:

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

Merci. –

Questions connexes