【问题标题】:Display number with significant figures and K/M/B/T suffix in JavaScript [closed]在 JavaScript 中显示带有有效数字和 K/M/B/T 后缀的数字 [关闭]
【发布时间】:2014-08-21 00:43:20
【问题描述】:

我想要一个 JavaScript 函数来将数字转换为带后缀的有效数字。例如,12,345 可能返回 12.3K,而 1,000,000 可能返回 1.00M

【问题讨论】:

  • 这里的反对意见是我问的是 JS 函数的 Apps Script 兼容实现吗?如果愿意,我可以删除对 Apps 脚本的引用。
  • Apps 脚本引用已删除,请重新考虑。
  • 反对意见是你要么要求我们推荐一个已经进行这种格式化的 JavaScript 库(我相信会有一个,但你应该使用搜索引擎找到它而不是在这里问)或者您要求我们为您编写一些代码。如果您自己编写此代码并在实现中遇到错误,这里的人会很乐意提供帮助,但不会只是为您编写代码。
  • Google 搜索类似 [javascript 数字格式 k m b t 有效数字] 的查询在这里没有帮助。我已经找到了很多(如果不是大多数)SO 答案,可以是解决问题的参考库或编写完整的函数,例如这个用 Java 提出的非常相似的问题:stackoverflow.com/questions/4753251/… 我自己编写了完整的函数来回答问题 - sn-ps 通常没有多大帮助。

标签: javascript number-formatting


【解决方案1】:

查看此函数和相关测试,同样在this Apps Script file container-bound to this spreadsheet 中实现:

// Calculates significant figures with suffixes K/M/B/T, e.g. 1234 = 1.23K
function sigfig(num, sigfigs_opt) {
  // Set default sigfigs to 3
  sigfigs_opt = (typeof sigfigs_opt === "undefined") ? 3 : sigfigs_opt;
  // Only assigns sig figs and suffixes for numbers > 1
  if (num <= 1) return num.toPrecision(sigfigs_opt);
  // Calculate for numbers > 1
  var power10 = log10(num);
  var power10ceiling = Math.floor(power10) + 1;
  // 0 = '', 1 = 'K', 2 = 'M', 3 = 'B', 4 = 'T'
  var SUFFIXES = ['', 'K', 'M', 'B', 'T'];
  // 100: power10 = 2, suffixNum = 0, suffix = ''
  // 1000: power10 = 3, suffixNum = 1, suffix = 'K'
  var suffixNum = Math.floor(power10 / 3);
  var suffix = SUFFIXES[suffixNum];
  // Would be 1 for '', 1000 for 'K', 1000000 for 'M', etc.
  var suffixPower10 = Math.pow(10, suffixNum * 3);
  var base = num / suffixPower10;
  var baseRound = base.toPrecision(sigfigs_opt);
  return baseRound + suffix;
}

function log10(num) {
  // Per http://stackoverflow.com/questions/3019278/how-can-i-specify-the-base-for-math-log-in-javascript#comment29970629_16868744
  // Handles floating-point errors log10(1000) otherwise fails at (2.99999996)
  return (Math.round(Math.log(num) / Math.LN10 * 1e6) / 1e6);
}

// Tests for sigfig(num, sigfigs=3). Returns T/F indicating test pass/fail.
function sigfig_test() {
  if (sigfig(1) != '1.00') return false;
  if (sigfig(1, 2) != '1.0') return false;
  if (sigfig(1.2) != '1.20') return false;
  if (sigfig(1234.5) != '1.23K') return false;
  if (sigfig(1000) != '1.00K') return false;
  if (sigfig(1234567) != '1.23M') return false;
  if (sigfig(1234567890, 4) != '1.235B') return false;
  if (sigfig(1e12, 1) != '1T') return false;
  if (sigfig(0.999999) != '1.00') return false;
  if (sigfig(0.00000434, 2) != '0.0000043') return false;
  return true;
}

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2011-05-21
    • 2011-03-07
    • 1970-01-01
    • 2022-10-13
    • 2021-12-14
    • 2017-08-27
    相关资源
    最近更新 更多