获取valueformatter中的十进制值,以便在MPAndroidChart中显示条形上的十进制值

时间:2017-01-06 03:31:08

标签: android mpandroidchart

我正在尝试显示一个条形图(MPAndroidChart),其中包含十进制值。 但图表显示没有小数。  我的值格式化程序代码如下所示:

$('.my_button').on('click', function() {
    ui_tracking('button_1')
    .then(startQuestion)
    .then(function () {
        alert('Hello');
    });
});

function ui_tracking(type, payload) {
    return $.ajax({
        url: '/api/submit_action',
        type: 'POST',
        dataType: 'json',
        data: {
            type: type,
            payload: JSON.stringify(payload)
        }
    });
}

function startQuestion(results) {
    var deferred;
    var openQuestion = function (question_data) {
        $('#question-modal .modal-body .question').html(question_data.question).attr('data-question-id', question_data.id);

        $('#question-modal').modal('show').on('hidden.bs.modal', function (e) {
            deferred.resolve();
            $('#question-modal').unbind('hidden.bs.modal');
        });
    };
    if (results && results.data && results.data.question) {
        deferred = $.Deferred();
        openQuestion(results.data.question);
        return deferred.promise();
    }
}

以下是用于绘制图表的数据

protected class MyValueFormatter implements ValueFormatter{
    @Override
    public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
        Log.d(Constants.TAG,"Initial value == "+value+" == "+entry.getVal());
        DecimalFormat df = new DecimalFormat("#.###");
        df.setRoundingMode(RoundingMode.CEILING);
        Log.d(Constants.TAG,"Formatted value == "+df.format(value));
        return df.format((double)value);
    }
}

以下是值格式化程序日志

"data":[[16003376.986129051,10003344],[25089516.75475807,20089516],[39517705.32395167,30517705],[2490973.063333333,3090973]]

我担心的是:

  • 原始值从16003376.986129051转换为1.6003376E7
  • 图表显示栏顶部的值为16003376,因为尚未执行十进制处理
  • 我如何获得原始值将其转换为3位小数,因为从财务角度来看,小数值非常重要

Bar Chart

Bar Chart with marker view

1 个答案:

答案 0 :(得分:0)

MPAndroidChart将Entry中的y值存储为float。从this commonly referenced article on floating point中可以看出,有些数字无法使用浮点数准确表示。

不要将已解析数据的原始值用作value的{​​{1}},而应考虑将该值舍入为3位小数第一个。无论如何,这是一个好主意,因为我们希望在模型层和视图层之间保持关注点的分离,Entry基本上是视图层的一部分。如果您这样做,您的Entry将按预期执行。

所以,当你进行参赛时。不要这样做:

ValueFormatter

请改为:

float rawX = rawDataSource.getFloat(0);
float rawY = rawDataSource.getFloat(1);
BarEntry entry = new BarEntry(rawX,rawY); //no!! need to round first