Как написать эту функцию JS лучшим (самым умным) способом? - PullRequest
0 голосов
/ 11 февраля 2011

Я хотел бы написать функцию, которая принимает размер файла в байтах (7762432) и возвращает значение в читаемом пользователем формате (7,762,432 байта).

function(fileSizeBytes){
    // mind blowing logic :)
    return userReadable;
}

Я сделал это, используя способ разделения старой школы, но мне просто любопытно, существует ли способ, который может взорвать мою голову и заставить меня закричать: «О, боже, это тоже можно сделать !!»

Ответы [ 8 ]

6 голосов
/ 11 февраля 2011

функция одной строки:

function formatFileSizeBytes(size) {
    return size.replace(/(\d)(?=(\d{3})+$)/g, "$1,");
}

некоторые проверки:

for (var i = 0; i <= "123456789".split('').length; i++) {  
    alert(formatFileSizeBytes(a.slice(0,i).join(''))); 
}
6 голосов
/ 11 февраля 2011
function addCommas(value) {
    var regex = /^(\d+)(\d{3}[\.]?.*)$/;
    while (regex.exec(value)) {
        value= RegExp.$1
                ? RegExp.$1 + ',' + RegExp.$2
                : RegExp.$2;
    }
    return value;
}
1 голос
/ 11 февраля 2011

Хорошо, должно быть какое-то решение ENTERPRISE для этого с интенсивной поддержкой i18n

var numberLocaleFormat = (function() {
  var cache = {};
  return (function (separator, grouping, groupingAdd) {
    separator = separator || ",";
    grouping = grouping || 3;
    groupingAdd = groupingAdd || grouping;
    var key = grouping + "+" + groupingAdd + "/" + separator;
    if (key in cache) return cache[key];
    return (cache[key] = function(number){
      var str = [], number = number.toString();
      var separatorIndex = grouping;
      for (var i = number.length-1, idx = 0; i >= 0; i--, idx++) {
        str.push(number.charAt(i));
        if ((idx == separatorIndex-1) && i) {
           separatorIndex += groupingAdd;
           str.push(separator);
        }
      }
      return str.reverse().join('');
    });
  });
})();

Использование:

numberLocaleFormat()(1234578); // "12,345,678", America
numberLocaleFormat(" ")(12345678); // "12 345 678", Europe
numberLocaleFormat(",",4)(12345678); // "1234,5678", Japan
numberLocaleFormat(",", 3, 2)(12345678); // "1,23,45,678", India
1 голос
/ 11 февраля 2011

Один лайнер:

function(fileSizeBytes){
    return fileSizeBytes.toString(10).split('').reverse().join('').replace(/(...)/g,'$1,').replace(/,$/,'').split('').reverse().join('') + ' bytes';
}
0 голосов
/ 11 февраля 2011

Это должно работать, если у вас есть ограничения на использование массива или регулярных выражений.

function comma_separate(num) {
    var comma = Math.floor((num.length) / 3);
    var offset = (num.length) % 3;
    var result = '';
    if(offset > 0) {
        result = num.substr(0,offset);
    }

    for(var i=0; i<comma; i++) {
        result = result ? result + ',' : '';
        result = result + num.substr(i*3,3);
    }

    return result;
}

протестировано здесь

0 голосов
/ 11 февраля 2011

Как насчет использования библиотеки php.js ?? number_format () function .. док говорит, что функция автономна

= P Я не сломаю голову, чтобы сделать то, что уже сделано

0 голосов
/ 11 февраля 2011

В Internet Explorer и Firefox вы можете сделать return Number(fileSizeBytes).toLocaleString();.

К сожалению, Google Chrome, Safari и Opera не очень хорошо играют с этим. Они просто возвращают так же, как toString().

0 голосов
/ 11 февраля 2011

Я написал эту функцию четыре года назад:

function formatNumber(x) { 
    if(!isFinite(x)) return x.toString();
    var str         = Math.abs(x).toString();
    if(str.indexOf("e") != -1) return x.toString();
    var decimalPos  = str.indexOf(".");
    var decimal;

    if(decimalPos == -1)
        decimal = "";
    else {
        decimal = str.substring(decimalPos);
        str = str.substring(0, decimalPos);
    }
    if(str.length < 4) return x.toString();

    var start = str.substr(0, str.length % 3);
    if(start.length != 0) {
        str = str.substr(start.length)
        start += ",";
    }
    if(x < 0) start = "-" + start;

    var segments = new Array(Math.ceil(str.length / 3.0));
    for(var i = 0; i < str.length; i += 3) {
        segments[i / 3] = str.substr(i, 3);
    }

    return start + segments.join() + decimal;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...