2011-08-02 3 views
0

La fonction ci-dessous trouve le nombre, complète hors tension et met un K ou M sur l'extrémité de celui-ciphp nombres abrégeant avec K/M

IE: 25000 devient 25K

function abbr_no($number) { 
$number = preg_replace('/[^0-9]/', '', $number); 
$numbers = array('', 'K', 'M'); 
if ($number == 0) { 
return('n/a'); 
} else { 
return (round($number/pow(10000, ($i = floor(log($number, 10000)))), 0) . $numbers[$i]); 
} 
} 

et il est-ce essentiellement ce que je veux, mais comme il est un certain nombre comme il arrondit au large et recrache 39K (comme il se doit) mais je voudrais que le résultat soit 398K (numéro à 3 chiffres)

maintenant dans la dernière ligne de retour:

0) . $numbers[$i]); 

si je change de 0 à 1 un résultat devient 39.8K mais encore une fois je ne veux pas la virgule, donc je suis actuellement coincé et ont frappé un brickwall

Comme toujours toute aide est appréciée et merci d'avance.

+2

Il ne devrait pas _ cracher _39K_, mais le _correct 389K_ (sauf si vous faites quelque chose que je ne comprends pas). Changez '10000' à' 1000'. – Wrikken

+0

ne devrait pas 389345 ne pas devenir 39k? Je pense qu'il y a quelque chose qui ne va pas, mais je ne peux pas vérifier pour l'instant .. – bertzzie

+0

Ok, je pense que lol .. merci Wrikken à beaucoup de 0 était le problème :) – Dizzi

Répondre

0

sans modifier beaucoup de votre code, vous pouvez ajouter d'autres instruction if test si la division modulaire de 1 yournumber% 1

($i = floor(log($number, 10000)))), 0) % 1 

vous donne 0 si elle ne marche pas alors

multiplier votre numéro par 10 (vous pouvez en faire une déclaration while donc il la multiplie par 10 jusqu'à ce qu'il n'y ait plus d'espaces après le point décimal)

puis de retourner ce nombre

donc si vous utilisez your_number comme 39,8 comme un exemple, il ressemblerait à ceci

while(your_number%1 != 0){ 
your_number*=10; 
} 
return your_number; 

Cette une solution rapide mais son certainement pas la meilleure façon de coder ce

1

Cela vous permet de convertir le toutes sortes d'échelles,

function humanize($val, $postfix) 
{ 
    foreach ($postfix as $p=>$div) { 
     $t=round($val/$div) . $p; 
     if (strlen($t)<(3+strlen($p))) { 
      break; 
     } 
    } 
    return trim($t); 
} 

par exemple

$postfix=array(''=>1, 'K'=>1000,'M'=>1000000,'B'=>1000000000); 

Pour répondre à la question initiale,

$postfix=array('walnut' => 0.16, 'chicken egg'=>0.35, 
    'grapefruit' => 1, 'bulgarian airbag' => 1.1, 
    'bulgarian funbag'=>3.27, 'football' => 11.07, 
    'olympic swim pool' => 4780114, 'known universe'=>1.17456E4933); 

pour la norme de volume Vulture Central Weights and Measures Soviet.

+0

Le code corrigé est 'if (strlen ($ t) <= (3 + strlen ($ p))) {' – Bazuka