◆PROCESSING 逆引きリファレンス
カテゴリー:文字関連処理
数値を文字列に変換するには
【解説】
プログラムではよく、数値を文字列に変換したい場合があります。
PROCESSINGで数値を文字列に変換するには nf() 命令が便利です。
PROCESSINGはJavaをベースにした言語ですので、Javaと同じ方法で数値を文字列に変換する事も可能です。次の例は i が int の数値、sはString文字列の前提です。
1 2 3 4 5 6 7 |
//一般的な方法 String s = String.valueOf(i); //以下は・・・ちょっと変則的な方法 String s = "" + i; String s = new Integer(i).toString(); String s = Integer.toString(i); |
【構文】
ここではPROCESSINGのnf()命令の構文を紹介します。
nf( num, digits ) ;
nf( num, left, right ) ;
【パラメータ】
num float[]、int[] または float、int: 変換対象となる数値
digits int : 文字列全体の桁数 [右詰め。空いている桁は 0 で埋まる]
left int : 小数点の左側の数値の桁数
right int : 小数点の右側の数値の桁数
【戻り値】
numに単一の変数(int、float)を渡した場合はString
numに配列変数(int[]、float[])を渡した場合はString[]
【注意】
nfには引数を2つ持つものと3つ持つものがあります。文字列に変換する数値にはint型とfloat型があります。それらには許可された組み合わせがあります。
以下の表を参照してください(クリックすると拡大します)。
数値を文字列に変換する際 digits を指定する事で、変換した桁数が digits に満たない場合、左側に 0 を補った文字列を生成可能です。ただし変換対象の数値が負の場合は 、0 を補った上で、さらに左側にマイナス記号がつきます。ここは注意が必要です。
数値を文字列に変換した際に、左側に 0 を補わなくても良いなら(単純に文字列変換するなら)、digits に0を指定します。
floatの場合は、left と right を指定する事で、小数点の左と右を何桁にするかを指定可能です。足りない分は left の左端と right の右端に0が補われます。
この場合も負の値の場合は、leftで指定した桁数まで0を補った上で、さらにマイナス記号が付加されます。
ちなみに・・・ digits や left に負の値を与えた場合( nf( 10, -30 ); など)でもエラーにはならないようです。この場合は digits または left に0 を指定した場合と同じ動きをします。
一方、right に負の値を指定すると、小数点以下が無視された文字列が生成されます。
例: nf( 3.14, 0, -1 ); ⇒ “3”
digits、left、right に負の値を与えることについて正規リファレンスは何も述べていませんが、あまり推奨はされないと思います。
【関連記事】
第4章:得点を表示する(その3)
●単純な数値を文字列に変換する例:
1 2 3 4 5 |
int i = 9; int m = -9; println( nf( i, 2 ) ); println( nf( m, 2 ) ); |
digits に 2 を指定していますので、変換対象文字が2桁になるまで左側に0を補った文字列を生成します。
ただし m は負の値なので、0を補った上でマイナス記号がつきます。
●小数点を持つ値を文字列に変換する例:
1 2 3 4 5 |
float p = 3.14; float mp = -3.14; println( nf( p, 2, 3 ) ); println( nf( mp, 2, 3 ) ); |
leftに 2 を指定していますので、小数点から左を2桁になるまで0を補います。
rigth には 3 を指定していますので、小数点から右は3桁になるまで0を補います。
ただし mp は負の値なので、0を補った上でマイナス記号がつきます。
●整数配列を文字列に変換する例:
1 2 3 |
int[] i = {5,-2,0,10}; println( nf( i, 2 ) ); |
整数配列を文字列変換します。
digits に 2 を指定していますので、変換対象文字が2桁になるまで左側に0を補った文字列を生成します。
●文字列変換速度対決:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int sms, sum; int tms[]; String s; tms = new int[10]; sum = 0; for( int j = 0; j < 10; j++ ){ sms = millis(); for( int i = 0; i < 1000000; i++ ){ s = nf(i,0); //<--ここに、様々な変換方式を設定 } tms[j] = millis() - sms; } for( int k = 0; k < 10 ; k++ ){ sum = sum + tms[k]; } println( tms ); println( sum/10 ); |
PROCESSINGでは、nf() の他にも Javaと同じ命令で数値を文字列に変換可能だと説明しました。それでは、幾つもある数値⇒文字列変換で一番速いのはどれでしょうか・・・
気になったので調べてみました。
上記プログラムでコメントを記述した箇所に、
- s = nf(i,0);
- String.valueOf(i);
- s = “” + i;
- new Integer(i).toString();
- Integer.toString(i);
の5つの方法をプログラムし、100万回数値を文字列変換させる処理を10回繰り返した場合の平均値を算出しました。
結論は・・・・ なんと s = “” + i; が最速である事がわかりました。
nf(); の結果が突出して遅いのがわかります。何百万回も数値を文字列に変換しなければいけないような特殊な場合では、nf(); は遅いと覚えておきましょう(笑)。
ただし、それ以外の一般的な場合では、nf() は便利ですし、プログラムの可読性が高まりますので、使ったほうが良いと思われます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。