2011-03-11 5 views

Répondre

4
// Truncate a number to ind decimal places 
function truncNb(Nb, ind) { 
    var _nb = Nb * (Math.pow(10,ind)); 
    _nb = Math.floor(_nb); 
    _nb = _nb/(Math.pow(10,ind)); 
    return _nb; 
} 
// convert a big number to k,M,G 
function int2roundKMG(val) { 
    var _str = ""; 
    if (val >= 1e9)  { _str = truncNb((val/1e9), 1) + ' G'; 
    } else if (val >= 1e6) { _str = truncNb((val/1e6), 1) + ' M'; 
    } else if (val >= 1e3) { _str = truncNb((val/1e3), 1) + ' k'; 
    } else { _str = parseInt(val); 
    } 
    return _str; 
} 
+0

Notez que 'GMk' suffisent pour 32 bits, pour 64 bits, vous aurez besoin de 'EPTGMk'. – schnaader

+0

@schnaader: tu as raison, il est facile d'ajouter plus de multiplicateurs, laissés en exercice. – Toto

0

pseudocode:

factor = 0; 
while (value > 1000) { 
    value = value/1000; 
    factor++; 
} 
output value (you might perhaps limit output to 3 decimal places) 
convert factor to unit and output (0 = none, 1 = K, 2 = M, 3 = G...) 
0

Vous pouvez simplement utiliser un numéro formatter en cascade classique de toutes sortes

function format_num(num) { 
    if(num < 1000) 
    return num; 
    else if(num < 1000000) 
    return parseInt(num/1000) + "K"; 
    else if(num < 1000000000) 
    return parseInt(num/1000000) + "M"; 
    //.... 
} 

Il vous suffit de prendre soin d'arrondir de façon appropriée.

1

Je pris un peu astucieux de code lors de la recherche de quelque chose à abrégez et la taille des octets d'étiquette (par exemple 1024 octets -> « 1 KB ») et il a changé un peu en fonction de vos besoins (1000 -> "1 K").

function abbreviate_number(num) { 
    var sizes = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; 
    if (num < 1000) return num; 
    var i = parseInt(Math.floor(Math.log(num)/Math.log(1000))); 
    return ((i == 0) ? (num/Math.pow(1000, i)) : (num/Math.pow(1000, i)).toFixed(1)) + ' ' + sizes[i]; // use .round() in place of .toFixed if you don't want the decimal 
}; 

Juste pour référence, voici ce dont j'avais besoin.

function format_bytes(bytes) { 
    var sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; 
    if (bytes == 0) return ''; 
    if (bytes == 1) return '1 Byte'; 
    var i = parseInt(Math.floor(Math.log(bytes)/Math.log(1024))); 
    return ((i == 0)? (bytes/Math.pow(1024, i)) : (bytes/Math.pow(1024, i)).toFixed(1)) + ' ' + sizes[i]; 
}; 
0

Je suis arrivé à ces réponses tard quand je cherchais un moyen propre de le faire, mais juste au cas où si quelqu'un cherche à copier coller un filtre angulaire le faire ici est le mien. même logique que les réponses ci-dessus :)

juste pour vous assurer que pour 0 il retourne 1k

html:

<div ng-repeat="d in data> 
    <div class="numbers">{{d | KGMPformat}}</div> 
</div> 

js:

// controller: 
$scope.data = [123,12345,1234567,12345678,12345678901] 
// filter: 
(function(app) { 
    app.filter('KGMPformat', function() { 
     return function(value) { 
      if (value<1e3) return value;   
      if (value<1e6) return (value - value%1e3)/1e3 + "K"; 
      if (value<1e9) return (value - value%1e6)/1e6 + "G"; 
      if (value<1e12) return (value - value%1e9)/1e9 + "M"; 
      if (value<1e15) return (value - value%1e12)/1e12 + "P"; 
      return value; 
     }; 
    }); 
})(myApp); 
Questions connexes