我正在使用Charts.js在我的网站上显示图表。目前,标签显示为一长串数字(即123456)。 我希望它以千位分隔符显示为货币:(即$ 123,456)
我正在使用scaleLabel选项在值前加上$ USD符号:
scaleLabel: "<%= ' $' + Number(value)%>"
和插入逗号分隔符的函数:
function(label){return label.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");}
我只是不知道如何一起使用这些来获得我想要的东西。
这是小提琴:http://jsfiddle.net/vy0yhd6m/79/
(请记住,目前只有删除上面引用的两个JavaScript中的一个时,图表才会生效)
感谢您的帮助。
答案 0 :(得分:77)
我是chart.js的新手,但是我必须做的就是让Billy Moon的答案适用于2.1.6的最新版本。
var data = {
labels: ["12 AM", "1 AM", "2 AM", "3 AM", "4 AM", "5 AM", "6 AM", "7 AM", "8 AM", "9 AM", "10 AM", "11 AM", "12 PM", "1 PM", "2 PM", "3 PM", "4 PM", "5 PM", "6 PM", "7 PM", "8 PM", "9 PM", "10 PM", "11 PM"],
datasets: [
{
label: "Sales $",
lineTension: 0,
backgroundColor: "rgba(143,199,232,0.2)",
borderColor: "rgba(108,108,108,1)",
borderWidth: 1,
pointBackgroundColor: "#535353",
data: [65, 59, 80, 81, 56, 55, 59, 80, 81, 56, 55, 40, 59, 80, 81, 56, 55, 40, 59, 80, 81, 56, 55, 40]
}
]
};
//var myChart =
new Chart(document.getElementById('sales-summary-today'), {
type: 'line',
data: data,
options: {
animation: false,
legend: {display: false},
maintainAspectRatio: false,
responsive: true,
responsiveAnimationDuration: 0,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
callback: function(value, index, values) {
if(parseInt(value) >= 1000){
return '$' + value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} else {
return '$' + value;
}
}
}
}]
}
}
});
再次,Billy Moon的答案是标签格式化功能。
答案 1 :(得分:33)
您应该能够在函数内的标签组成中包含货币前缀...
var options = {
animation: false,
scaleLabel:
function(label){return '$' + label.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");}
};
答案 2 :(得分:23)
我主要总结了其他人提到的内容,但我认为对这个确切(并且经常遇到)问题的最简洁的解决方案是使用the toLocaleString
method美元货币格式:
return value.toLocaleString("en-US",{style:"currency", currency:"USD"});
这适用于所有现代浏览器。 Mozilla documentation for toLocaleString
列出了特定的浏览器兼容性以及其他区域设置,货币和格式类型的选项(例如百分比)。
注意Chart.js版本2+(2016年4月发布)requires using the callback
method用于高级刻度格式化:
var chartInstance = new Chart(ctx, {
type: 'line',
data: data,
options: {
scales: {
yAxes: [{
ticks: {
callback: function(value, index, values) {
return value.toLocaleString("en-US",{style:"currency", currency:"USD"});
}
}
}]
}
}
});
如果您使用Chart.js Version 1.X,则语法为:
var myLineChart = new Chart(ctx).Line(data, options);
var data = {
...
}
var options = {
scaleLabel: function(label) {
return value.toLocaleString("en-US",{style:"currency", currency:"USD"});
}
感谢Perry Tew referencing the syntax change,以及the idea使用toLocaleString
。
答案 3 :(得分:7)
添加到Perry Tew的答案,如果您的轴上有负的美元金额(例如显示盈亏图表时),您可以使用:
ticks: {
callback: function(value, index, values) {
if(parseInt(value) > 999){
return '$' + value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} else if (parseInt(value) < -999) {
return '-$' + Math.abs(value).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} else {
return '$' + value;
}
}
}
显示负货币的正确格式为 - $ XXX,因此我们将-$
添加到该值,然后通过Math.abs()运行,将其转换为正数。
答案 4 :(得分:5)
在chartjs v2.0中,您可以设置如下全局选项:
Chart.defaults.global.tooltips.callbacks.label = function(tooltipItem, data) {
return tooltipItem.yLabel.toLocaleString("en-US");
};
Chart.scaleService.updateScaleDefaults('linear', {
ticks: {
callback: function (value, index, values) {
return value.toLocaleString();
}
}
});
答案 5 :(得分:1)
如果您将Charts.js用于Angular 2+(ng2-charts),则可以使用CurrencyPipe
。这是格式化标签的方式:
将依赖项注入到page.ts文件中:
import { CurrencyPipe } from '@angular/common';
这是我在图表选项中的称呼方式:
public chartOptions: any = {
responsive: true,
legend: {
display: false,
labels: {
display: false
}
},
tooltips: {
enabled: true,
mode: 'single',
callbacks: {
label: function(tooltipItem, data) {
let label = data.labels[tooltipItem.index];
let datasetLabel = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
let currencyPipe = new CurrencyPipe('en');
let formattedNumber = currencyPipe.transform(datasetLabel, 'USD', 'symbol');
return label + ': ' + formattedNumber;
}
}
}
};
答案 6 :(得分:1)
我知道我的回答为时已晚,但是由于op越来越引起人们的注意,这可能现在有意义。
这是更简单,更体面的方法。
const formatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}); // Change locale according to your currency and country
var options = {
scales: {
yAxes: [
{
ticks: {
callback: (label, index, labels) => {
return formatter.format(label);
}
}
}
]
}
}
答案 7 :(得分:0)
使用chartjs v2.8.0,浏览文档后,我发现它here。
我不是使用自己的格式化程序,而是使用numeraljs格式化数字。 所以这就是我要做的:
import numeral from 'numeral'
options: {
scales: {
yAxes: [{
ticks: {
callback: function (value, index, values) {
// add comma as thousand separator
return numeral(value).format('0,0')
},
}
}]
},
tooltips: {
callbacks: {
label: function (tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || ''
if (label) {
label += ': '
}
label += numeral(tooltipItem.yLabel).format('0,0')
return label
},
},
},
}
您可以使用format('$ 0,0')
来添加货币符号和逗号分隔符。
答案 8 :(得分:-1)
有一个特定的javascript函数可将长整数转换为根据系统设置格式化的数字:toLocaleString()。
您可以通过在刻度选项内添加“ callback:”关键字来指定每个刻度(或由其数字索引标识的特定刻度)的标签必须由您自己的函数构建:
之前:
ticks: {
max: maxAltitude,
min: 0
}
之后:
ticks: {
max: maxAltitude,
min: 0, // <--- dont' foget to add this comma if you already have specified ticks options
callback:
function(value, index, valuesArray) {
// value: currently processed tick label
// index of currently processed tick label
// valuesArray: array containing all predefined labels
return value.toLocaleString();
} // Function end
} // Ticks options end
没有注释,没有未使用的变量:
ticks: {
max: maxAltitude,
min: 0,
callback:
function(value) {
return value.toLocaleString();
}
}