在Java(Android)中从float转换为char []

时间:2016-09-09 21:40:48

标签: java android

我有一个应用程序,在View的onDraw()方法中我需要在屏幕上绘制几个浮点数。 为了避免垃圾收集,我试图摆脱这种方法中的所有分配。问题是我想在屏幕上绘制具有指定小数位数的浮点数,如果没有String.format()并且根本没有使用字符串,我找不到任何信息。即使没有字符串和内存分配,从float到char []的简单转换似乎也是一个问题。

所以问题是如何管理这个问题?

P.S。在onDraw()方法之前无法提前转换它们,因为在用户触摸事件期间可以更改数字(例如滚动)。

1 个答案:

答案 0 :(得分:2)

实现自己的格式化程序。以下是简化格式化程序的示例。

它从末尾填充缓冲区并返回起始索引。如果float对于缓冲区来说太大,它将失败ArrayIndexOutOfBoundsException,并且它不会处理负值,无穷大和NaN。我会把它留给你。

如果您需要从头开始填充缓冲区,只需使用System.arraycopy()移动字符。

如您所见,唯一的分配是char缓冲区。

public static int format(char[] buffer, float value, int decimals) {
    float v = value;
    for (int i = 0; i < decimals; i++)
        v *= 10f;
    int num = Math.round(v);
    int idx = buffer.length;
    for (int i = 0; i < decimals; i++, num /= 10)
        buffer[--idx] = (char) ('0' + num % 10);
    if (decimals > 0)
        buffer[--idx] = '.';
    do {
        buffer[--idx] = (char) ('0' + num % 10);
    } while ((num /= 10) != 0);
    return idx;
}

测试

char[] buffer = new char[10];
int startIdx = format(buffer, (float)Math.PI, 4);
for (int i = startIdx; i < buffer.length; i++)
    System.out.print(buffer[i]);
System.out.println();

输出

3.1416