Javascript 使用SI前缀将数字格式化为整数

Javascript 使用SI前缀将数字格式化为整数,javascript,d3.js,string-formatting,Javascript,D3.js,String Formatting,我正在画一张图表,它可以得到从0到数百万美元的美元价值,我正在努力显示漂亮的刻度。我已经用了d3.nice得到了5个刻度,它们都有很好的值,这很酷。但由于存在如此大的差异,我很难正确显示我的美元价值 我希望: 0-999:显示自己 1000-9999999:显示1k-999k如果999500显示1M是可以的,但使用d3.format'.3s'显示1.00k或使用d3.format'.1s'将467k转到400k是不可以的 1000000-99999999:如果在四舍五入时滚动,则显示1M-999

我正在画一张图表,它可以得到从0到数百万美元的美元价值,我正在努力显示漂亮的刻度。我已经用了d3.nice得到了5个刻度,它们都有很好的值,这很酷。但由于存在如此大的差异,我很难正确显示我的美元价值

我希望:

0-999:显示自己

1000-9999999:显示1k-999k如果999500显示1M是可以的,但使用d3.format'.3s'显示1.00k或使用d3.format'.1s'将467k转到400k是不可以的

1000000-99999999:如果在四舍五入时滚动,则显示1M-999M也正常

在d3版本4之前,这很简单。你可以做:

.ticks((d) => {
  var prefix = d3.formatPrefix(d);

  return prefix(d).toFixed()+''+prefix.symbol;
})
但现在,我正在阅读D3V4文档,在我失败之后,它说:

d3.formatPrefix方法已更改。它不是返回SI前缀字符串,而是返回给定说明符和引用值的SI前缀格式函数。例如,要设置千的格式:

var f=d3.formatPrefix.0,1e3

f1e3;//1k

f1e4;//10公里

f1e5;//10万

f1e6;//1000K


这似乎不可能在现在实现,因为我想改变有效数字的数量,但我看不到明显的方法来实现这一点。我错过了一些简单的东西吗?

好吧,我想这很容易,但有点不太对劲。下面是我用来实现此行为的格式化程序函数:

(val) => {
  let prefix = d3.formatPrefix('.3s', val);

  let str = prefix(val);

  if (val === 0) {
    return '0';
  }

  return parseInt(str.slice(0, str.length - 2))+''+str.slice(str.length - 1);
}

我很乐意使用更好的答案,如果你有一个更清晰的答案,我会接受。

好吧,我想这很简单,但有点不太方便。下面是我用来实现此行为的格式化程序函数:

(val) => {
  let prefix = d3.formatPrefix('.3s', val);

  let str = prefix(val);

  if (val === 0) {
    return '0';
  }

  return parseInt(str.slice(0, str.length - 2))+''+str.slice(str.length - 1);
}

我很乐意使用更好的答案,因此如果您有更清晰的答案,请发布,我将接受。

如果我正确理解您所需的输出,您可以使用数字本身来定义d3.formatPrefix的值

请看这个演示:

[1,999,1000,999000,1000000]。forEachfunctiond{ var prefix=d3.formatPrefix.0,d console.logd+:+prefixd }
如果我正确理解了所需的输出,您可以使用数字本身来定义d3.formatPrefix的值

请看这个演示:

[1,999,1000,999000,1000000]。forEachfunctiond{ var prefix=d3.formatPrefix.0,d console.logd+:+prefixd }