◆PROCESSING 逆引きリファレンス
カテゴリー:文字関連処理
文字列を数値に変換するには
【解説】
「数値を文字列に変換するには」の逆で、文字列を数値として扱う方法を説明します。例えば “123” という文字列を 123 という数値に変換したい場合などです。
PROCESSINGはJavaをベースにした言語ですので、Javaと同じ方法が利用できます。以下はJavaと同じ方式で文字列を数値に変換する例です。
1 2 3 4 5 6 |
String str = "123"; // 文字列を数値に変換する int j0 = Integer.valueOf(str); int j1 = Integer.parseInt(str); int j2 = new Integer(str); |
ここでは文字列をint型(整数)に変換する例を紹介しましたが、FloatクラスやDoubleクラスを利用することで、float型やdouble型に変換する事も可能です。
また、PROCESSINGがサポートしている int()命令やunhex()命令を利用して文字列を数値に変換することも可能です。
【構文】
以下はPROCESSINGがサポートしている代表的な変換方法です。
●int() 命令を利用する
int i = int( String s );
int i = int( char c );
int[] ai = int( String[] as );
int[] ai = int( char[] ac );
●float() 命令を利用する
float f = float( String s );
float f = float( char c );
float[] af = float( String[] as );
●unhex() 命令を利用する
int i = unhex( String s );
【パラメータ】
s は String型の文字列
c は char型の文字
as は String型の配列変数
ac は char型の配列変数
【戻り値】
i は int型
f は float型
ai は int型の配列変数
af は float型の配列変数
【注意】
●int() 命令にString文字列(またはString配列)を与える場合
int() 命令は String型で与えられたアラビア数字(”0123456789″)で構成される文字列をint値に変換します。
以下の条件下で、int()命令は期待通り動作します。
- アラビア数字は全角文字でも半角文字でもOKです
- “+” または “-“の記号文字は文字列の先頭についている場合のみOKです
- “+” または “-“の記号文字は半角文字だけが許可されています
- 変換結果がintで扱える範囲に収まる場合だけ、正常に動作します
上記の条件を満たさない場合、変換結果は全て0になります。具体例は下記サンプルプログラムを参照してください。
なお半角ピリオッド(”.”)を含む小数点文字を与えた場合、StringかString配列かで変換結果が異なるようです。PROCESSINGの挙動が怪しい?ように思いますが・・・半角ピリオッド(”.”)はアラビア数字以外の文字ですので、変換結果は保証されないと考えたほうが良さそうです。注意が必要ですね。
なお、PROCESSINGが扱える int値は -2147483648 ~ +2147483647 までです。
●int() 命令にchar文字(またはchar配列)を与える場合
int() 命令に char型(または char型の配列)を与えた場合、与えた文字をUTF16の文字コード値に変換します。ですので “0” は 0 ではなく 48( 0x30 ) になります。ここは注意してください。
●float()命令にString文字列(またはString配列)を与える場合
float() 命令は String型で与えられたアラビア数字(”0123456789″)と半角ピリオッド(”.”)で構成される文字列をfloat値に変換します。
以下の条件下で、float()命令は期待通り動作します。
- アラビア数字と “.” は半角文字のみOKです
- “+” または “-“の記号文字は文字列の先頭についている場合のみOKです
- “+” または “-“の記号文字は半角文字だけが許可されています
- “.” 記号文字は無くてもOKです
- “.” 記号文字は文字列のどこにあってもOKですが、MAX1つのみです
上記の条件を満たさない場合、変換結果はNaNになります。NaNとは「Not a Number」の略で、Javaで「非数値」を示す記号です。具体例は下記サンプルプログラムを参照してください。
なお、PROCESSINGが扱える float値は±10の38乗ですが有効桁は7桁しかありません。変換結果がfloatで扱える有効桁数を超える場合は極端に精度が落ちるか、Eの階乗付きの値が戻されます。 例:”19999999” ⇒ 2.0E7 が戻されます
●float() 命令にchar文字を与える場合
float() 命令に char型を与えた場合、与えた文字をUTF16の文字コード値に変換します。ですので “0” は 0 ではなく 48.0( 0x30 ) になります。ここは注意してください。
●unhex() 命令について
unhex() 命令は、アラビア数字+”ABCDEF” から構成される文字列を16進数とみなして、int値に変換します。
以下の条件下で、unhex()命令は期待通り動作します。
- アラビア数字とアルファベットは全角文字でも半角文字でもOKです
- アルファベットは”ABCDEF”のみです。大文字小文字は問いません
- “+” または “-“の記号文字は文字列の先頭についている場合のみOKです
- “+” または “-“の記号文字は半角文字のみが許可されています
- 変換結果がintで扱える範囲に収まる場合だけ、正常に動作します
文字列にアラビア数字以外の文字が含まれている場合、例外エラー(NumberFormatException)が発生します。
具体例は下記サンプルプログラムを参照してください。
なおunhex()命令に与える文字列が8文字以上ある場合、文字列の右端から8文字分だけが変換対象となるようです。ただし変換対象外だからといって、アラビア数字+”ABCDEF” 以外の文字を含んでいると例外エラーとなるので注意してくださいね。
例:
“F12345678” ⇒ “12345678” が変換される。左端のFは無視。
“G00000001” ⇒ 例外エラーになる。
unhex()では、具体的に
0000000から7FFFFFFFが正の値:0~2147483647
80000000からFFFFFFFFが負の値:-2147483648~-1
に変換されます。
【関連記事】
サンプルプログラム
String文字列を数値に変換する例1:
1 2 3 4 5 6 |
println( int("0123") ); //A:<- 123 正常 println( int("-123") ); //B:<- -123 正常 println( int("") ); //C:<- 0 空文字 println( int("ABC") ); //D:<- 0 英字 println( int("123.4") ); //E:<- 123 少数 println( int("2147483648") );//F:<- 0 オーバーフロー |
Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
C、Dは変換対象文字列がアラビア数字ではない例です。変換結果は 0 になります。
Eは少数を与えた場合です。小数点以下が切り捨てられた値に変換されます。ただし、アラビア数字以外の文字であるピリオッド(“.”)を含んでいますので、からなずそのように動作するとは思わないほうが良さそうです。
Fは変換結果がintで扱える範囲を超える例です。変換結果は 0 になります。
String文字列を数値に変換する例2:
1 2 3 4 5 6 7 |
int[] ai; String[] as = new String[2]; as[0] = "987"; as[1] = "123.4"; ai = int(as); println( ai ); //<- ai[0]=987 , ai[1]=0 |
String配列を変換する例です。それぞれの要素を数値に変換し、int配列に戻します。
String配列で少数を含む文字列を与えた場合の変換結果が、単純なString文字列を与える場合と異なるようです。注意してください。
char文字を数値に変換する例:
1 2 3 4 5 6 7 |
int[] ai; char[] ac = new char[2]; ac[0] = 'あ'; ac[1] = 'A' ; ai = int(ac); println( ai ); //<- ai[0]=12354 , ai[1]=65 |
char型の文字を変換する例です。本例ではcharの配列変数を変換しています。
文字がそのまま数値に変換されるのではなく、UTF16の文字コードに変換されます。
String文字列を少数値に変換する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
println( float("3.14") ); //A:<- 3.14 正の数 println( float("-3.14") ); //B:<- -3.14 負の数 println( float(".123") ); //C:<- 0.123 正の数 println( float("9999999.9") ); //D:<- 1.0E7 オーバーフロー println( float("ABC") ); //E:<- NaN 異常 //変換結果が NaN か判定する例 if( Float.isNaN(float("A")) ){ //以下のように比較してはいけない //NaNとの比較は必ず false になるJavaの仕様です。 //if( float("A") == Float.NaN ){ println( "変換結果がNaNです"); } |
Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
Cは最初の0を省略した例(0.123 ではなく .123 と与えた場合)です。
Dは float で扱える精度を超えた値を与えた場合の例です。この例ではE付きの数値が戻されます。
Eはアラビア数字以外を与えた例です。変換結果は NaN になります。変換結果がNaNかどうか判定する例も掲載していますので、参考にしてください。
16進文字列を数値に変換する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
println( unhex("10") ); //A:<- 16 正の数 println( unhex("-10") ); //B:<- -16 負の数 println( unhex("FF") ); //C:<- 255 正の数 println( unhex("F00000001") ); //D:<- 1 左端のFは無視 //変換結果の 異常を検知する例 try{ println( unhex("ERROR") ); //例外が発生する } catch( Exception e ){ println( "例外が発生しました" ); println( e.getMessage()); println( e.getStackTrace() ); } |
Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
unhex()は文字列を16進数とみなして変換しますので、Cの例も正常に動作します。
Dのように8文字以上ある文字列を渡した場合、右端から8文字分だけが変換対象とされます。この場合、左端の “F” は無視されて、”00000001″ が変換されます。
変換できない文字を与えると例外エラーとなります。例外を捕まえる例を掲載していますので、参考にしてください。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。
ふと目に入ったので…
> String配列で少数を含む文字列を与えた場合の変換結果が、
少数(少ない数)…たぶん,小数(小さい数)ですよね.
小さいことが気になる僕の悪い癖…小数だけに…