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
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
public class StringtoValue10 {
	// 文字列を10進数に変換
	// エラーの場合、int型の最小値"Integer.MIN_VALUE"を戻す
	static int parseInt10( String str )
	{
		// 文字数を取得
		int len = str.length();

		// 文字数が1未満の場合、intの最小値を戻す
		if ( 1 > len )
			return Integer.MIN_VALUE;

		// 文字列をbyte配列に変換
		byte[] code = str.getBytes();

		// 整数の符号の初期化(-1:'-' 1:'+')  
		int sign = 1;

		// 結果格納用の変数
		int result = 0;

		// 変換するループ
		for ( int i = 0; i < len; i++ ) {
			switch ( code[ i ] ) {
				case '-':
					// マイナス符号の処理

					// 文字列の途中に'-'が有る
					if ( 0 != i )
						return Integer.MIN_VALUE;

					// '-'だけの文字列
					if ( 2 > len )
						return Integer.MIN_VALUE;

					// 符号を'-'にする
					sign = -1;
					break;

				case '+':
					// プラス符号の処理

					// 文字列の途中に'+'が有る
					if ( 0 != i )
						return Integer.MIN_VALUE;

					// '+'だけの文字列
					if ( 2 > len )
						return Integer.MIN_VALUE;

					// 符号を'+'にする
					sign = 1;
					break;

				case '0':
				case '1':
				case '2':
				case '3':
				case '4':
				case '5':
				case '6':
				case '7':
				case '8':
				case '9':
					// 数字の処理の処理
					// 桁を1桁増やす
					result *= 10;

					// code[i]の値を整数にキャストして足す
					result +=  (int)(  (byte)code[ i ] - '0' );

					break;

				default:
					// 数字と符号以外の文字の場合
					return Integer.MIN_VALUE;
			}
		}

		// 最後に符号を掛けて戻す
		return result * sign;
	}


	// メイン
	public static void main( String[] args ) {
		// 結果を格納する変数
		int result;

		// 変換結果出力
		result = parseInt10( "1234567" );
		System.out.println( result );

		result = parseInt10( "-99999" );
		System.out.println( result );

		result = parseInt10( "+8888" );
		System.out.println( result );

		result = parseInt10( "-" );
		System.out.println( result );

		result = parseInt10( "+" );
		System.out.println( result );

		result = parseInt10( "678+9" );
		System.out.println( result );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis StringtoValue10.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac StringtoValue10.java

実行

C:\talavax\javasample>java StringtoValue10

実行結果

1234567
-99999
8888
-2147483648
-2147483648
-2147483648

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

以上です。

関連コンテンツ

文字列を構成する文字コードをbyte型の配列に格納する方法を解説しています。是非、ご覧ください。

2020.10.29

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

数値型の変数の最小値・最大値がプログラムで取得でします。

2016.01.20

文字列の2進数を、int型の整数に変換する方法を詳しく解説しています。

2020.11.02

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

式の値によって処理を分岐する方法を詳しく解説しています。

2016.08.04

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

自然数と整数って何が違う?

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

同じ型の変数(データ)を複数個まとめて管理するデータの持ちかたがあります。これが配列です。くわしくは、記事をご覧ください。

2016.01.14

コンピュータで扱う情報の量を表す単位って何?メモリ、HDD(ハードディスク)、SSDなどデータを格納する機器の仕様に書いている記号GB,TBとは?

2020.10.12

アスキーコードは、ASCIIコーコンピュータで扱う"文字"と"文字に割り当てられた番号"を対応させた表の1つです。

2020.11.01

2つの値のうち、小さい方の値と、大きい方の値を取得する方法。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

プログラミング、ITに関する用語をまとめています。

2022.10.17

広告