Flot图表勾选问题

时间:2014-03-27 18:06:15

标签: javascript algorithm flot

我有一个带有自定义刻度格式函数的flot图表,

if ((val / 1000) >= 1) {
    val = String(Math.round(val / 1000)) + 'K';
}

return String(val);

但问题是它为某些刻度返回相同的值。

关于代码的一点解释:

val --> any integer value ranging from 1 to infinity

val / 1000逻辑是将tick转换为用户朋友(可读)格式(1K,2K等)。

但问题是,当某些val向上舍入到相等的值时,我会重复勾选标签。

它想知道修复此算法的任何好方法来计算它吗?

附录

val / 1000并不意味着val是1000的倍数,它可以是从1到无穷大的任何整数值。

例如:对于val = 1000 or 1001,它会在两个刻度标签上返回1K

我知道它的算法错误。我只是想知道是否有任何方法可以彻底修复它

备注

  1. Ticks必须最多舍入到两位小数(如果没有小数点则很好)。
  2. 您无法更改val / 1000。您可以使用Math.round()功能进行游戏。
  3. 即使想要toFixed()使用规则1

1 个答案:

答案 0 :(得分:2)

这是一个在保持准确性的同时使用大数字后缀的解决方案:

function tick_label(val) {
    if (val < 0) return "\u2212" + tick_label(-val);
    if (val < 1000) return String(val);

    var mag = 1;
    var suffix = "";

    if (val >= 1000) { mag = 1000; suffix = "k" }
    if (val >= 1000000) { mag = 1000000; suffix = "M" }
    if (val >= 1000000000) { mag = 1000000000; suffix = "G" }

    var div = mag;

    while (val % 10 == 0) {
        val /= 10;
        div /= 10;
    }

    return String(val / div) + suffix;
}

此代码依赖于刻度的圆数,因此确切的数字看起来并不奇怪或过于精确。 (1.002k,1.004k,1.006k的比例看起来没问题,但是1.102k,1.202k,1.302k的比例没有。我不熟悉Flot,但我想它会照顾它。)