-
-
Save max-power/2288464 to your computer and use it in GitHub Desktop.
| function( | |
| n, // number (in bytes) | |
| p, // precision (default: 0) | |
| b, // base (1000 or 1024, default: 1000) | |
| i, // internal counter | |
| ){ | |
| for( | |
| b=b||1e3; // init base with default value 1e3 == 1000 | |
| i=-~i, // nasty trick to initialize and increase counter, see comments | |
| n>=b // comparator (number >= base) | |
| && i<9 // and sanity check (change this, if you update the unit prefixes) | |
| ; | |
| ) | |
| n/=b; // divide number by base | |
| return | |
| --i // if number >= base (didn't increase counter) | |
| ? // either | |
| n.toFixed(p) // format number with precision | |
| +"\xA0" // add non-breaking space | |
| +" KMGTPEZY"[i] // get unit prefix (kilo, mega, giga, ...) | |
| +(b&8?'B':'iB') // if the base is 1024 add the "i" character to unit prefix | |
| : // or | |
| n+"\xA0Byte" // just return byte + non-breaking space + "Byte" unit | |
| } |
| function(n,p,b,i){for(b=b||1e3;i=-~i,i<9&&n>=b;)n/=b;return--i?n.toFixed(p)+"\xA0"+" KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"} |
| // older IE compatible version, see comments | |
| function(n,p,b,i){for(b=b||1e3;i=-~i,i<9&&n>=b;)n/=b;return--i?n.toFixed(p)+"\xA0"+" KMGTPEZY".charAt(i)+(b&8?'B':'iB'):n+"\xA0Byte"} |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| Version 2, December 2004 | |
| Copyright (C) 2011 YOUR_NAME_HERE <YOUR_URL_HERE> | |
| Everyone is permitted to copy and distribute verbatim or modified | |
| copies of this license document, and changing it is allowed as long | |
| as the name is changed. | |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 0. You just DO WHAT THE FUCK YOU WANT TO. |
| { | |
| "name": "NumberToHumanBytes", | |
| "description": "Formats a number into a human understandable representation of Bytes", | |
| "keywords": [ | |
| "Bytes", | |
| "Number", | |
| "format" | |
| ] | |
| } |
| <script> | |
| b=function(n,p,b,i){for(b=b||1e3;i=-~i,i<9&&n>=b;)n/=b;return--i?n.toFixed(p)+"\xA0"+" KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"} | |
| console.log( b(1), "==", "1 Byte" ) | |
| console.log( b(22140), "==", "22 KB" ) | |
| console.log( b(22140, 2), "==", "21.14 KB" ) | |
| console.log( b(22140, 2, 1024), "==", "21.62 KiB" ) | |
| console.log( b(22140, 5, 1024), "==", "21.62109 KiB" ) | |
| console.log( b(2214023452335, 3),"==", "2.214 TB" ) | |
| console.log( b(221402345233435345345345345345334534534545), "==", "221402345233435360 YB" ) | |
| </script> |
"\xA0" is shorter than " ", and you can lose the var statement and the "_":
function(n,b,p,i){for(b=b||1000,i=0;n>=b;i++)n/=b;return i--?n.toFixed(p)+"\xA0"+"KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"}
Also, "KMGTPEZY"[i] will not work in older IE versions (you should at least mention this). Fixed for IE:
function(n,b,p,i){for(b=b||1000,i=0;n>=b;i++)n/=b;return i--?n.toFixed(p)+"\xA0"+"KMGTPEZY".charAt(i)+(b&8?'B':'iB'):n+"\xA0Byte"}
1000 can be replaced with 1e3, saving a byte:
function(n,b,p,i){for(b=b||1e3,i=0;n>=b;i++)n/=b;return i--?n.toFixed(p)+"\xA0"+"KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"}
Nasty trick, saving another byte by not initializing i (tsaniel had tried this, but forgot to insert a character into the prefix table):
function(n,b,p,i){for(b=b||1e3;i=-~i,n>=b;)n/=b;return--i?n.toFixed(p)+"\xA0"+" KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"}
sweet! we're down to 121 bytes. gist is updated!
Your proposed sanity check will break things, becuase it overwrites the original test of n>=b; you may want to use && instead of ,
function(n,b,p,i){for(b=b||1e3;i=-~i,i<9&&n>=b;)n/=b;return--i?n.toFixed(p)+"\xA0"+" KMGTPEZY"[i]+(b&8?'B':'iB'):n+"\xA0Byte"}
i just saw the tests failing. thanks a lot. this works now. example added.
now back to real work...
Okay, so this isn't actually shorter, just faster. Won't work for your extremely large YB number due to 32-bit limitations on Math.log.
function(n,p,b,i,d){return(d=Math.log,b=b||1E3,i=d(n)/d(b)|0,n/Math.pow(b,i)).toFixed(p)+"\xa0"+(i?" kMGTPEZY"[i]+(b&8?"B":"iB"):"bytes")};
n.b., the correct prefix for kilo is k
Save a few bytes by replacing
whilewithforandb==1024withb&8and rearranging the code a little bit.Also, your index.js should in a single line to get the correct byte count.