GraphView 格式标签丢弃一些非常大数据的数字

GraphView format label discard some digits for very big data

我正在使用 graphview 库并尝试将图表的标签格式化为 'HH' 格式的时间(从毫秒开始)。我将系列数据点的每个 x 值指定为毫秒,这确实很大,如“1.442440833138E12”。之后,我制作了如下所示的自定义 LabelFormatter:

        @Override
        public String formatLabel(double value, boolean isValueX) {
            if (isValueX) {
                SimpleDateFormat format = new SimpleDateFormat("HH");

                Date date = new Date((long) value);
                Log.i("formatLabel", Double.toString(date.getTime()));
                return format.format(date);
            } else {
                return super.formatLabel(value, isValueX);
            }
        }

但是当我查看我的图表时,它与我输入的不一样,比如当我将毫秒设置为 07 小时时,图表显示 11 小时或 01 小时,因为我使用 setNumHorizo​​ntalLabels 进行了更改。所以我试图找出问题所在,当我将日志输出代码放在那个 formatLabel 方法中时,日志输出如下所示:

09-17 20:03:50.287  28093-28093/? I/formatLabel﹕ 1.44243E12
09-17 20:03:50.287  28093-28093/? I/formatLabel﹕ 1.44244E12
09-17 20:03:50.287  28093-28093/? I/formatLabel﹕ 1.44245E12
09-17 20:03:50.287  28093-28093/? I/formatLabel﹕ 1.44246E12
09-17 20:03:50.292  28093-28093/? I/formatLabel﹕ 1.44247E12

应该看起来像“1.442440833138E12”。我还尝试使用最小“12”位的数字精度制作自定义 DefaultFormatter,但结果相同。

有人可以向我解释为什么会这样吗?

-------------------------------------------- ----------------------------------

这是我将数据点添加到每个系列的代码。

DataPoint[] data1=new DataPoint[SIZE] ;
for(int i=0;i<SIZE;i++)
{
  data1=new DataPoint(new Date(time),value) ;
  //test whether x prints all full millisecond
  Log.i("formatLabel", Double.toString(data1.getX()));

}

LineGraphSeries<DataPoint> series=new LineGraphSeries(data1) ;

当我给每个数据点的 x 值加上日期时看到日志输出,我得到 完整的毫秒表示法,例如“1.442440833138E12”。但是在我上面的自定义 formatLabel 实例中,它被截断了。我希望用户能更多地了解我的问题 清楚并给我一些解决方案...

您应该将 date/times 添加到这样的系列中:

series.appendData(new DataPoint(new Date(time), value), true, Integer.MAX_VALUE);

并像这样格式化标签:

graph.getGridLabelRenderer().setLabelFormatter(
        new DateAsXAxisLabelFormatter(getActivity(),
                        SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT)) {
            @Override
            public String formatLabel(double value, boolean isValueX) {
                if (isValueX)
                    return super.formatLabel(value, isValueX);
                else
                    // format Y-axis label
            }
        });

(示例使用默认的短 SimpleDateFormat 实例)

查看您的标签格式化代码:无需为每个数据点实例化 SimpleDateFormat。