图表.js使用货币和千位分隔符设置Y轴的格式

Charts.js Formatting Y Axis with both Currency and Thousands Separator

本文关键字:设置 分隔符 千位 格式 js 货币 图表      更新时间:2023-11-01

我正在使用图表.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 之一时才有效(

感谢您的任何帮助。

我是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的标签格式化功能的答案。

我主要是总结其他人提到的内容,但我认为这个确切(且经常遇到(问题的最干净解决方案是使用美元货币格式的toLocaleString方法:

return value.toLocaleString("en-US",{style:"currency", currency:"USD"});

这适用于所有现代浏览器。toLocaleString的 Mozilla 文档列出了特定的浏览器兼容性和其他区域设置、货币和格式类型(例如百分比(的选项。

注意图表.js版本 2+(2016 年 4 月发布(要求对高级即时报价格式使用 callback 方法:

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 版本 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 引用语法更改,并感谢 mfink 使用 toLocaleString 的想法。

您应该能够在函数内的标签组合中包含货币前缀...

var options = {
    animation: false,
    scaleLabel:
    function(label){return  '$' + label.value.toString().replace(/'B(?=('d{3})+(?!'d))/g, ",");}
};

http://jsfiddle.net/vy0yhd6m/80/

除了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(( 运行它,将其转换为正数。

在 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();
        }
    }
});

使用 chartjs v2.8.0,在查看文档后,我在这里找到了它。

我没有制作自己的格式化程序,而是使用 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')添加货币符号以及逗号千位分隔符。

如果您使用的是图表.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;
            }
          }
        }
    };

2022-04-07 更新:图表版本 3 的语法已更改.js。下面是使用 v3 时选项对象的外观:

import { ChartConfiguration, ChartData, ChartType } from 'chart.js';
import { CurrencyPipe } from '@angular/common';
public chart_options: ChartConfiguration['options'] = {
   layout: {
      padding: 25,
   },
   responsive: true,
   plugins: {
      legend: {
         display: false,
      },
      tooltip: {
         enabled: true,
         callbacks: {
            label: function(context) {
               let currency_pipe = new CurrencyPipe('en');
               return ' ' + context.label + ': ' + currency_pipe.transform(context.parsed, 'USD', 'symbol');
            }
         }
      }
   }
};
public chart_type: ChartType = 'doughnut';
public chart_labels: string[] = [];
public chart_data: ChartData<'doughnut'> = {
   labels: this.chart_labels,
   datasets: [{
      data: [],
      backgroundColor: [],
   }]
};
<div style="display: block;">
   <canvas baseChart [data]="chart_data" [options]="chart_options" [type]="chart_type"></canvas>
</div>

查看图表.js v3 迁移指南

了解更多信息
我知道

我的回答为时已晚,但由于 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);
                    }
                }
            }
        ]
    }
}

有一个特定的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(); 
                      }
                }