2016-09-09 5 views
0

私はアプリケーションのどこにViewのonDraw()メソッドを使用していますか?私は画面上に2つの浮動小数点数を描く必要があります。 ガベージコレクションを避けるために、私はこのメソッドですべての割り当てを取り除こうとしています。問題は、指定された数の小数点を使って浮動小数点数を画面に描きたいので、String.format()を使用せずに、文字列をまったく使用しないで情報を見つけることができないということです。 floatからchar []への単純な変換でさえ、文字列やメモリの割り当てがなければ問題になるようです。Java(Android)のfloatからchar []への変換

この問題をどのように管理するのが問題なのですか?

P.S. onDraw()メソッドの前にそれらを変換する方法はありません。これは、ユーザーのタッチイベント(たとえばスクロール)中に数値を変更できるためです。

+0

は、あなたの 'charは[]'桁または何が含まれていますか? – Midnightas

+0

最初は何も含まれていません。 drawText()メソッドでこのchar配列を使用するには、自分の数値をchar []に変換するだけで済みます。文字列と異なり、char []は事前に初期化することができます。 – Bashalex

+0

あなたは魔法のように浮動小数点を文字に変換することはできませんし、これを念頭において構築できるものは、文字列を使用することと多かれ少なかれ同じでしょうか? – Silverclaw

答えて

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 
+0

私が必要としているものと思われます。ありがとうございます! – Bashalex

関連する問題