如何将数字转换为具有特定长度和k,m,b的聪明数字

时间:2014-06-18 09:16:25

标签: javascript jquery numbers number-formatting

例如我有这个号码:

1,234,567.89

我想将此数字转换为具有如下特定长度的数字:

1M

01M

1.2M

1.23M

1.234M

1.2346M

1.23457M

1,234,568

01,234,568

1,234,567.9

1,234,567.89

是否有任何javascript函数,插件或其他东西以这种方式(使用K,M,B ......)?

1 个答案:

答案 0 :(得分:0)

我不理解你的downvotes,因为这不是一个重复的问题,我发现没有相似之处。所以我自己做了它并且它有效;)

function number(num, size) {

  var s = num;

  var l1 = s.toString().length;
  if (l1 > size && num > 1) s = Math.floor(num);

  var l2 = s.toString().length;

  if (l2 > size) {
    if (num >= 1e3 && num < 1e6) {

      s = num / 1e3;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'k';

    } else if (num >= 1e6 && num < 1e9) {

      s = num / 1e6;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'M';

    } else if (num >= 1e9 && num < 1e12) {

      s = num / 1e9;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'G';

    } else if (num >= 1e12 && num < 1e15) {

      s = num / 1e12;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'T';

    } else if (num >= 1e15 && num < 1e18) {

      s = num / 1e18;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'P';

    } else if (num >= 1e18 && num < 1e21) {

      s = num / 1e18;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'E';

    } else if (num >= 1e21 && num < 1e24) {

      s = num / 1e21;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'Z';

    } else if (num >= 1e24 && num < 1e27) {

      s = num / 1e24;
      var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
      s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'Y';

    }
  }

  var l3 = s.toString().length;
  if (l3 > size) s = '-';

  var s = s.toString();
  while (s.length < size) s = s.charAt(0) == '-' ? '-' + s : '0' + s;

  var startZeros = /^(0)\1+/.exec(s),
      startZerosCount = (startZeros != null) ? startZeros[0].length : 0,
      decimalCount = (num.toString().split('.')[1] || []).length;

  if (startZerosCount >= 2 && decimalCount > 0 && s.indexOf('.') < 0) {

    var decimals = num.toString().split('.')[1],
        movedDigits = Math.min(startZerosCount, decimalCount),
        lastChar = s.substring(s.length - 1);

    if (isNaN(lastChar)) {
      s = s.substring(0, s.length - 1);
      s = s.substring(movedDigits) + '.' + decimals.substring(0, movedDigits - 1);
      s += lastChar; 
    } else {
      s = s.substring(movedDigits) + '.' + decimals.substring(0, movedDigits - 1);
    }

  }

  return s;

}

784432432.9999的输出为:

-
--
---
784M
0784M
784.4M
784.43M
784.432M
784432432
0784432432