var Vue = require('vue'); var UNITS = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; var STEP = 1024; function format(value, power) { return (value / Math.pow(STEP, power)).toFixed(2) + UNITS[power]; } Vue.filter('smart-file-size', { read: function (value) { value = parseFloat(value, 10); for (var i = 0; i < UNITS.length; i++) { if (value < Math.pow(STEP, i)) { if (UNITS[i - 1]) { return format(value, i - 1); } return value + UNITS[i]; } } return format(value, i - 1); }, write: function (value, oldValue) { var exp = new RegExp('^(\\d+(?:\\.\\d+)?)(' + UNITS.join('|') +')$', 'i'); var ret = value.match(exp); if (ret) { var i = UNITS.indexOf(ret[2].toUpperCase()); if (i >= 0) { return parseFloat(ret[1], 10) * Math.pow(STEP, i); } } return oldValue; } });