文字列を数値に変換するには

◆PROCESSING 逆引きリファレンス

 カテゴリー:文字関連処理

文字列を数値に変換するには

【解説】

数値を文字列に変換するには」の逆で、文字列を数値として扱う方法を説明します。例えば “123” という文字列を 123 という数値に変換したい場合などです。

PROCESSINGはJavaをベースにした言語ですので、Javaと同じ方法が利用できます。以下はJavaと同じ方式で文字列を数値に変換する例です。

ここでは文字列を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:

Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
C、Dは変換対象文字列がアラビア数字ではない例です。変換結果は 0 になります。

Eは少数を与えた場合です。小数点以下が切り捨てられた値に変換されます。ただし、アラビア数字以外の文字であるピリオッド(“.”)を含んでいますので、からなずそのように動作するとは思わないほうが良さそうです。

Fは変換結果がintで扱える範囲を超える例です。変換結果は 0 になります。

<出力サンプル>
int()サンプル1

 

String文字列を数値に変換する例2:

String配列を変換する例です。それぞれの要素を数値に変換し、int配列に戻します。
String配列で少数を含む文字列を与えた場合の変換結果が、単純なString文字列を与える場合と異なるようです。注意してください。

<出力サンプル>
int()サンプル2

 

char文字を数値に変換する例:

char型の文字を変換する例です。本例ではcharの配列変数を変換しています。
文字がそのまま数値に変換されるのではなく、UTF16の文字コードに変換されます。

<出力サンプル>
int()サンプル3

 

String文字列を少数値に変換する例:

Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
Cは最初の0を省略した例(0.123 ではなく .123 と与えた場合)です。

Dは float で扱える精度を超えた値を与えた場合の例です。この例ではE付きの数値が戻されます。

Eはアラビア数字以外を与えた例です。変換結果は NaN になります。変換結果がNaNかどうか判定する例も掲載していますので、参考にしてください。

<出力サンプル>
float()サンプル

 

16進文字列を数値に変換する例:

Aは正の数に変換する例です。Bは負の数に変換する例です。共に正常に動作します。
unhex()は文字列を16進数とみなして変換しますので、Cの例も正常に動作します。

Dのように8文字以上ある文字列を渡した場合、右端から8文字分だけが変換対象とされます。この場合、左端の “F” は無視されて、”00000001″ が変換されます。

変換できない文字を与えると例外エラーとなります。例外を捕まえる例を掲載していますので、参考にしてください。

<出力サンプル>
unhex()サンプル

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)