diff --git a/core/js/js.js b/core/js/js.js index 972f0e63144..3651635541a 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1668,6 +1668,52 @@ OC.Util = { // TODO: remove original functions from global namespace humanFileSize: humanFileSize, + /** + * Returns a file size in bytes from a humanly readable string + * Makes 2kB to 2048. + * Inspired by computerFileSize in helper.php + * @param {string} string file size in human readable format + * @return {number} or null if string could not be parsed + * + * + */ + computerFileSize: function (string) { + if (typeof string != 'string') { + return null; + } + + var s = string.toLowerCase(); + var bytes = parseFloat(s) + + if (!isNaN(bytes) && isFinite(s)) { + return bytes; + } + + var bytesArray = { + 'b' : 1, + 'k' : 1024, + 'kb': 1024, + 'mb': 1024 * 1024, + 'm' : 1024 * 1024, + 'gb': 1024 * 1024 * 1024, + 'g' : 1024 * 1024 * 1024, + 'tb': 1024 * 1024 * 1024 * 1024, + 't' : 1024 * 1024 * 1024 * 1024, + 'pb': 1024 * 1024 * 1024 * 1024 * 1024, + 'p' : 1024 * 1024 * 1024 * 1024 * 1024 + }; + + var matches = s.match(/([kmgtp]?b?)$/i); + if (matches[1]) { + bytes = bytes * bytesArray[matches[1]]; + } else { + return null; + } + + bytes = Math.round(bytes); + return bytes; + }, + /** * @param timestamp * @param format diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index d1734a9f3d1..370ebc6ba2d 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -590,6 +590,36 @@ describe('Core base tests', function() { } }); }); + describe('computerFileSize', function() { + it('correctly parses file sizes from a human readable formated string', function() { + var data = [ + ['125', 125], + ['125.25', 125.25], + ['0 B', 0], + ['125 B', 125], + ['125b', 125], + ['125 KB', 128000], + ['125kb', 128000], + ['122.1 MB', 128031130], + ['122.1mb', 128031130], + ['119.2 GB', 127990025421], + ['119.2gb', 127990025421], + ['116.4 TB', 127983153473126], + ['116.4tb', 127983153473126] + ]; + for (var i = 0; i < data.length; i++) { + expect(OC.Util.computerFileSize(data[i][0])).toEqual(data[i][1]); + } + }); + it('returns null if the parameter is not a string', function() { + expect(OC.Util.computerFileSize(NaN)).toEqual(null); + expect(OC.Util.computerFileSize(125)).toEqual(null); + }); + it('returns null if the string is unparsable', function() { + expect(OC.Util.computerFileSize('')).toEqual(null); + expect(OC.Util.computerFileSize('foobar')).toEqual(null); + }); + }); describe('stripTime', function() { it('strips time from dates', function() { expect(OC.Util.stripTime(new Date(2014, 2, 24, 15, 4, 45, 24)))