Javaプログラミング学習サイト ゆるゆるプログラミング

2020/10/29 公開

・文字数字を数値に変換

文字列(String型)で格納された整数値を、int型整数に変換する方法を説明しています。

 "12345678" →  12345678
 "-230091" → -230091

Javaには、String型int型に変換するInteger.parseIntメソッドInteger.ValueOfメソッドが用意されています。

Integer.parseIntメソッド

public int parseInt( String s )
■文字列の引数を符号付き10進数の整数型として構文解析します。

  パラメータ s : 整数の値にに変換する文字列の値

  戻り値     int型の整数

Integer.valueOfメソッド

public static Integer valueOf( String s )
■指定されたStringの値を保持するIntegerオブジェクトを返します。

  パラメータ s : 整数(Integerクラス)に変換する文字列の値

  戻り値     Integerクラスの整数の値

ここで説明するのは、上記のようなメソッドの作り方です。

具体的には、String型をbyte配列に変換し、そのbyte配列の値から整数の値を求めるものです。

例えば、文字列が"1287"である場合、これをbyte型配列codeに変換すると。

    code[ 0 ] = 49; // '1'のASCIIコード
    code[ 1 ] = 50; // '2'のASCIIコード
    code[ 2 ] = 56; // '8'のASCIIコード
    code[ 3 ] = 55; // '7'のASCIIコード

となります。各文字をASCIIコードに変換された値を格納します。

このbyte配列添え字の0から3の順に以下のような計算を行います。

    int result = 0;
    result = (int)code[ 0 ] - 48;           // resultの値 : 1
    result = ( result * 10 ) + (int)code[ 1 ] - 48;  // resultの値 : 12
    result = ( result * 10 ) + (int)code[ 2 ] - 48;  // resultの値 : 128
    result = ( result * 10 ) + (int)code[ 3 ] - 48;  // resultの値 : 1287

配列添え字の小さいほうから順番に、10倍しながら足していくことで桁を1つずつ上げます。

'0'のASCIIコードが48なので、配列codeの各値から48を引いて計算します。

また、以下のように48の代わりに'0'を直接ソースコードに書いて計算させることもできます。

    int result = 0;
    result = (int)code[ 0 ] - '0';           // resultの値 : 1
    result = ( result * 10 ) + (int)code[ 1 ] - '0';  // resultの値 : 12
    result = ( result * 10 ) + (int)code[ 2 ] - '0';  // resultの値 : 128
    result = ( result * 10 ) + (int)code[ 3 ] - '0';  // resultの値 : 1287

以下が、上記を使ったJavaソースコードの例です。

static int parseInt10( String str )が作成したメソッドで、文字列の最初の文字が'+'、'-'の場合の処理も記載しています。また、数字以外の文字がある場合、符号が数字の途中に有る場合など変換に失敗したときに結果をint型で持てる最小値-2147483648を戻すようにしています。

StringtoValue10.java ← クリックしてダウンロードページに移動
001:    public class StringtoValue10 {
002:    	// 文字列を10進数に変換
003:    	// エラーの場合、int型の最小値"Integer.MIN_VALUE"を戻す
004:    	static int parseInt10( String str )
005:    	{
006:    		// 文字数を取得
007:    		int len = str.length();
008:    
009:    		// 文字数が1未満の場合、intの最小値を戻す
010:    		if ( 1 > len )
011:    			return Integer.MIN_VALUE;
012:    
013:    		// 文字列をbyte配列に変換
014:    		byte[] code = str.getBytes();
015:    
016:    		// 整数の符号の初期化(-1:'-' 1:'+')  
017:    		int sign = 1;
018:    
019:    		// 結果格納用の変数
020:    		int result = 0;
021:    
022:    		// 変換するループ
023:    		for ( int i = 0; i < len; i++ ) {
024:    			switch ( code[ i ] ) {
025:    				case '-':
026:    					// マイナス符号の処理
027:    
028:    					// 文字列の途中に'-'が有る
029:    					if ( 0 != i )
030:    						return Integer.MIN_VALUE;
031:    
032:    					// '-'だけの文字列
033:    					if ( 2 > len )
034:    						return Integer.MIN_VALUE;
035:    
036:    					// 符号を'-'にする
037:    					sign = -1;
038:    					break;
039:    
040:    				case '+':
041:    					// プラス符号の処理
042:    
043:    					// 文字列の途中に'+'が有る
044:    					if ( 0 != i )
045:    						return Integer.MIN_VALUE;
046:    
047:    					// '+'だけの文字列
048:    					if ( 2 > len )
049:    						return Integer.MIN_VALUE;
050:    
051:    					// 符号を'+'にする
052:    					sign = 1;
053:    					break;
054:    
055:    				case '0':
056:    				case '1':
057:    				case '2':
058:    				case '3':
059:    				case '4':
060:    				case '5':
061:    				case '6':
062:    				case '7':
063:    				case '8':
064:    				case '9':
065:    					// 数字の処理の処理
066:    					// 桁を1桁増やす
067:    					result *= 10;
068:    
069:    					// code[i]の値を整数にキャストして足す
070:    					result += (int)( (byte)code[ i ] - '0' );
071:    
072:    					break;
073:    
074:    				default:
075:    					// 数字と符号以外の文字の場合
076:    					return Integer.MIN_VALUE;
077:    			}
078:    		}
079:    
080:    		// 最後に符号を掛けて戻す
081:    		return result * sign;
082:    	}
083:    
084:    
085:    	// メイン
086:    	public static void main( String[] args ) {
087:    		// 結果を格納する変数
088:    		int result;
089:    
090:    		// 変換結果出力
091:    		result = parseInt10( "1234567" );
092:    		System.out.println( result );
093:    
094:    		result = parseInt10( "-99999" );
095:    		System.out.println( result );
096:    
097:    		result = parseInt10( "+8888" );
098:    		System.out.println( result );
099:    
100:    		result = parseInt10( "-" );
101:    		System.out.println( result );
102:    
103:    		result = parseInt10( "+" );
104:    		System.out.println( result );
105:    
106:    		result = parseInt10( "678+9" );
107:    		System.out.println( result );
108:    	}
109:    }

StringtoValue10.Javaの出力結果

1234567
-99999
8888
-2147483648
-2147483648
-2147483648

変換に失敗している場合、int型最小値-2147483648が出力されています。

以上です。

■関連コンテンツ

文字列→byte配列 Stringからbyte[]
文字列 文字列について
変数の最小値・最大値 変数の最小値と最大値を取得する方法を解説
2進数を整数に変換 "11001"→25
四則演算(足し算/引き算/掛け算/割り算)について-画像

計算結果の表示

足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

Topへ