【问题标题】:Chart.js Add Commas to Tooltip and Y-AxisChart.js 将逗号添加到工具提示和 Y 轴
【发布时间】:2016-08-06 03:18:39
【问题描述】:

我在 stackoverflow 中尝试了几个答案,但无济于事。我是 Chart.js 的新手,所以请多多包涵。

这是我迄今为止所尝试的。 Add Commas to ChartJS Data Points 和这个Chart.js number format

这是我的代码:

提前致谢。

Chart.defaults.global.legend = {
 enabled: false
};

function load_yearly_sales_per_agent(param_year, transaction_url){
    $(".custom_loader").show();
    $(".custom_graph").hide();
    $.ajax({
        url:transaction_url,
        type:'post',
        data: {year : param_year},
        dataType:'json',
        success:function(result){
              // Bar chart
              var ctx = document.getElementById("mybarChart");
              var mybarChart = new Chart(ctx, {
                responsive: true,
                multiTooltipTemplate: "<%=addCommas(value)%>",
                type: 'bar',
                data: {
                  labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                  datasets: [{
                    label: 'Sales Per Month',
                    backgroundColor: "#26B99A",
                    data: result
                  }]
                },

                options: {
                  scales: {
                    yAxes: [{
                      ticks: {
                        beginAtZero: true
                      }
                    }]
                  }
                }
              });
              $(".custom_loader").hide();
              setTimeout(function(){
                $(".custom_graph").show();
              }, 200);
        }
    });
}

我想要的是在工具提示和 Y 轴上添加逗号.....

【问题讨论】:

    标签: javascript jquery charts


    【解决方案1】:

    对于您的 yAxes 刻度选项,这将在千位标记处添加逗号:

    ticks: {
        beginAtZero:true,
        userCallback: function(value, index, values) {
            value = value.toString();
            value = value.split(/(?=(?:...)*$)/);
            value = value.join(',');
            return value;
        }
    }
    

    可以在工具提示回调中添加类似的功能。

    FIDDLE 中的完整示例

    【讨论】:

    • 如果有小数位则不起作用 - 请改为查看其他答案
    • 我使用改进的数字格式化程序(尽管 Number(x).toLocaleString() 可能更好)和更现代的 ES 语法对完整示例进行了调整:codesandbox.io/s/confident-payne-nrrhr(旧的 jsfiddle 版本渲染异常。)
    • 如何将它用于多个数据集?
    【解决方案2】:

    我看到很多过于复杂的答案。

    这个功能已经用.toLocaleString() 内置在javascript 中,我们不必重新发明轮子!这也考虑小数。

    yAxes: [
        {
            ticks: {
                beginAtZero: true,
                userCallback: function(value, index, values) {
                    return value.toLocaleString();   // this is all we need
                }
            }
        }
    ]
    

    【讨论】:

    • 这是一个非常简单的解决方案!谢谢
    【解决方案3】:

    如果使用小数,接受的答案不会将逗号放在正确的位置

    45000.00 将显示为 45,000,.00

    在chartjs ver 2.3中使用了以下代码

           options: {
                responsive: true,
                maintainAspectRatio: false,
            tooltips: {
              callbacks: {
                    label: function(tooltipItem, data) {
                        var value = data.datasets[0].data[tooltipItem.index];
                        if(parseInt(value) >= 1000){
                                   return '$' + value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
                                } else {
                                   return '$' + value;
                                }
                    }
              } // end callbacks:
            }, //end tooltips                
                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;
                                }
                           }                            
                        }
                    }]
                }
            }
    

    【讨论】:

    • 如果你使用'var value = tooltipItem.yLabel;',工具提示回调会更好而不是直接访问数据 - 因为有时数据是 .x & .y 或混合
    • 这里是多个数据集的修复:var value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];。 (不要将数据集索引硬编码为 0。)
    【解决方案4】:

    接受的答案适用于每列有一个数据集的图表,例如条形图。对于折线图等多数据集图表,硬编码的数据集位置会导致解决方案失败。解决方案是将硬编码的数据集索引位置 (data.datasets[0]) 替换为 chartjs 内置的动态索引位置 (data.datasets[tooltipItem.datasetIndex]) .

    数字的格式化最好通过根据用户的区域设置格式化值来完成。这有助于确保数字使用正确的修饰符(千位分隔符可以是逗号或句点,具体取决于用户的语言环境)。

    options: {
      tooltips: {
        callbacks: {
          label: function (tooltipItem, data) {
            var tooltipValue = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
            return parseInt(tooltipValue).toLocaleString();
          }
        }
      }
    }

    【讨论】:

    • 谢谢,你救了我。适用于多个数据集。
    • 一个问题,标签名不见了,怎么解决?
    【解决方案5】:

    我只是在这里吐口水,但是,假设数据是一个数组,你不能循环并添加逗号吗?

    datasets: [{
        label: 'Sales Per Month',
        backgroundColor: "#26B99A",
        data: result.map(function (i) {
           return i.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
        })
    }]
    

    【讨论】:

    • 这是我解决问题的第一个解决方案,但碰巧不起作用.....我碰巧解决了问题...我能够找到工具提示,我只是添加了一个函数在此处添加逗号....
    【解决方案6】:

    更多货币兑换

    ticks: {
        beginAtZero: true,
        callback: function(label, index, labels) {
            return Intl.NumberFormat('hi', { style: 'currency', currency: 'INR', minimumFractionDigits: 2 }  )
            .format(label).replace(/^(\D+)/, '$1 ');
        },
    }
    
    // ₹ 1,400.00
    

    【讨论】:

      【解决方案7】:

      有一个特定的javascript函数可以将长数字转换为根据系统设置格式化的数字:toLocaleString()。

      您可以指定每个刻度(或由其编号索引标识的特定刻度)的标签必须由您自己的函数构建,方法是在刻度选项中添加“回调:”关键字:

      之前:

              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
      

      没有 cmets 也没有未使用的变量:

              ticks: {
                        max: maxAltitude,
                        min: 0, 
                        callback:  
                            function(value) {
                              return  value.toLocaleString(); 
                            }
                      }
      

      同样的方法可以应用于工具提示。

      【讨论】:

        【解决方案8】:

        (这个例子显示钱)

        callback: function(value, index, values){
                       return value.toLocaleString("en-US",
                      {style:"currency", 
                        currency:"USD",
                        minimumFractionDigits: 0, 
                        maximumFractionDigits: 0});
                   }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          • 2020-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          相关资源
          最近更新 更多