首页 > 解决方案 > 数字到字符串表示

问题描述

我正在尝试制作一个功能,以便:

1 000 000 变为 1m 100 000 000 变为 100m 999 000 000 变为 999m 1 000 000 000 变为 1b 100 000 000 000 变为 100b 1000 000 000 000 变为 1t

对 SO 进行一些研究后,我发现了一个非常接近的功能:

AbbreviateNumber = ({value}) => {
  var suffixes = ["", "k", "m", "b","t"];
  var suffixNum = Math.floor((""+ Math.trunc(value)).length/3);
  var shortValue = parseFloat((suffixNum != 0 ? (value / Math.pow(1000,suffixNum)) : 
value).toPrecision(2));
  if (shortValue % 1 != 0) {
      var shortNum = shortValue.toFixed(1);
  };
  return shortValue+suffixes[suffixNum];
};

该功能的问题在于:

AbbreviateNumber(100000000000)返回 0.1t 而不是 100b。

我找不到正确的逻辑,因此它适用于 1 000 000 000 000 => 1t 和 100 000 000 000 => 100b 而不是 0.1t 或 100000 返回 100k 而不是 0.1m..

标签: javascriptnumbers

解决方案


可能是一些简单的方法,但这是一种文字方法。

function abbrNum(num) {
  let mappings = {
    K: [1000, 999999],
    M: [1000000, 999999999],
    B: [1000000000, 999999999999],
    T: [1000000000000, 999999999999999],
  };

  let abs = Math.abs(num);

  for (var abbr in mappings) {
    if (abs >= mappings[abbr][0] && abs <= mappings[abbr][1]) {
      return Math.round(num / mappings[abbr][0])+abbr;
    }
  }

  return num;
}

https://jsfiddle.net/6820medp/


推荐阅读