2016-09-09 2 views
0

У меня есть приложение, где в методе onDraw() View Мне нужно нарисовать пару чисел с плавающей точкой на экране. Чтобы избежать сбора мусора, я пытаюсь избавиться от всех распределений в этом методе. Проблема в том, что я хочу рисовать поплавки на экране с указанным числом десятичных знаков, и я не могу найти никакой информации, как это сделать без String.format() и без использования строк вообще. Даже простое преобразование из float в char [] кажется проблемой без строк и выделения памяти.Преобразование из float в char [] в Java (Android)

Итак, вопрос в том, как справиться с этой проблемой?

P.S. Невозможно заранее преобразовать их перед методом onDraw(), поскольку числа могут быть изменены во время событий пользовательского касания (например, прокрутки).

+0

ли ваш 'символ []' содержит цифры или что? – Midnightas

+0

Изначально он ничего не содержит. Мне просто нужно преобразовать свой номер в char [], чтобы использовать этот массив символов в методе drawText(). В отличие от Strings char [] может быть инициализирован заранее. – Bashalex

+0

Вы понимаете, что вы не можете магически конвертировать поплавки в символы, и все, что вы могли бы построить вокруг этого, было бы более или менее таким же, как использование строк? – Silverclaw

ответ

2

Внесите свой собственный форматировщик. Ниже приведен пример упрощенного форматирования.

Он заполняет буфер с конца и возвращает начальный индекс. Он не сработает с ArrayIndexOutOfBoundsException, если float слишком большой для буфера, и он не будет обрабатывать отрицательные значения, бесконечность и 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 
+0

Кажется, именно то, что мне нужно, спасибо! – Bashalex

Смежные вопросы