Highcharts如何格式化yAxis.stackLabel为k/M/G/T/P/E单位缩写
Highcharts yAxis.stackLabel 大数值量级缩写格式化方案
核心原因
tooltip的格式化逻辑无法直接在stackLabel上生效,本质是两个配置项的格式化函数上下文对象不同:
- tooltip格式化函数中,通常通过
this.y/this.point.y取单个数据点的值 - stackLabel格式化函数中,当前堆叠组的总值存储在
this.total字段,直接照搬tooltip的取值逻辑会拿到undefined,自然无法正常渲染
实现步骤
- 先封装通用的大数值转换方法,按1000进位匹配['k', 'M', 'G', 'T', 'P', 'E']对应单位
- 在
yAxis.stackLabels.formatter中调用该方法,传入this.total作为待格式化数值
完整代码示例
// 公共大数值格式化方法,tooltip和stackLabel可共用 function formatAbbrNumber(value) { const units = ['', 'k', 'M', 'G', 'T', 'P', 'E']; if (value === 0) return '0'; // 计算当前值对应量级索引 const unitIndex = Math.floor(Math.log10(Math.abs(value)) / 3); // 索引兜底,避免超过预设单位范围报错 const finalIndex = Math.min(unitIndex, units.length - 1); const scaledValue = value / Math.pow(1000, finalIndex); // 格式化结果:最多保留2位小数,自动去除末尾无效0 return `${scaledValue.toFixed(2).replace(/\.?0+$/, '')}${units[finalIndex]}`; } // Highcharts配置项 const chartOption = { chart: { type: 'column' }, plotOptions: { column: { stacking: 'normal' } // 开启堆叠模式才会显示stackLabel }, yAxis: { stackLabels: { enabled: true, // 开启堆叠标签渲染 formatter: function () { // 注意:必须取this.total作为堆叠总值传入 return formatAbbrNumber(this.total); } } }, tooltip: { // tooltip也可以直接复用同一个格式化方法,保持显示规则统一 formatter: function () { return `${this.series.name}: ${formatAbbrNumber(this.y)}<br/>总计: ${formatAbbrNumber(this.point.stackTotal)}`; } }, series: [/* 你的业务数据系列 */] }; // 渲染图表 Highcharts.chart('yourDomId', chartOption);
可自定义调整点
- 如果需要适配存储类单位(按1024进位),只需把代码中
Math.pow(1000, finalIndex)的1000改成1024即可 - 如果需要固定小数位数,修改
toFixed()里的参数,去掉末尾的replace逻辑即可 - 如果需要给数值加单位前缀/后缀,直接在formatAbbrNumber返回的字符串里拼接即可
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

